Discuss / JavaScript / 一些问题

一些问题

fighterleslie

#1 Created at ... [Delete] [Delete and Lock User]

廖老师您好,您的教程非常精彩,对许多理念的阐述让人茅塞顿开。不过白璧微瑕,教程中的有些观点我并不是很认同,希望与您交流:

简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言。 (第一页)

这句话有两点问题:

  1. JavaScript 并非必须要运行在浏览器中,浏览器只是宿主环境的一种
  2. JavaScript 现在已经并非是解释型语言,现代的 JavaScript 引擎均是采用编译(如 JIT compilation)执行而非解释执行。
不过通常我们都把JavaScript代码放到<head>中(快速入门)

实际上,在浏览器中由于 JavaScript 与 UI 渲染共用一个线程,为了不阻塞页面的加载和渲染,通常是建议把 <script> 放在页面底部,而非 <head> 部分

唯一能判断NaN的方法是通过isNaN()函数:
isNaN(NaN); // true

“唯一” 的说法是不正确的,因为我们完全可以利用 NaN != NaN 的特点自己写个函数判断 NaN 。而且,在判断 NaN 时,全局函数 isNaN() 恰恰是不靠谱的,因为它使用了隐式类型转换: isNaN("I'm not NaN") // true

 "注意,forEach()方法也是ES6新增标准,你需要测试浏览器是否支持。"  (iterable)

forEach() 方法是 ES5 规范引入的,定义在 Array.prototype 上。

这还是因为JavaScript引擎在末尾自动添加分号的机制,导致实际执行的JavaScript代码是这样的:
(function(x) {return x * x }) // 自动添加了分号
() // NaN

这里不会添加分号(当下一行的开头为 ( , [, + , -, / 五个字符时),所以仍然是合法的语句

在JavaScript的世界里,一切都是对象

Hmm. 个人理解是:除了 null 和 undefined, 一切皆可像(act as)对象那样

用parseInt()或parseFloat()来转换任意类型到number;

这里是笔误吧,应该是用 Number() parseInt(false) // NaN parseFloat(false) // NaN Number(false) // 0

由于'-'是特殊字符,在正则表达式中,要用'\'转义,所以,上面的正则是\d{3}\-\d{3,8}。

在正则表达式中,'-' 在 [] 里面是特殊字符,在 [] 外面不是特殊字符,在 [] 外边不用转义。

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

解释和编译现在区分不太明显,JIT也需要预热才会编译;

NaN的判断通常是计算结果为Number时用isNaN()判断,一般不会拿string去当参数;

forEach应该是5.1引入的,IE<9不支持;

确实不会添加分号,一会改个别的例子;

null和undefined要特殊对待,undefined在低版本浏览器中还可以用undefined=true呢;

parseInt是全局函数:parseInt('123.456') => 123,parseFloat()和Number()等价;

特殊字符用\转义始终没有问题,建议加上,当然不加也可以。

fighterleslie

#3 Created at ... [Delete] [Delete and Lock User]

廖老师棒棒哒


  • 1

Reply