一、 . 运算符 对于 . 运算符我们需要给予特别注意,因为它是一个有效的数字字符,会被优先识别为数字常量的一部分,然后才是对象属性访问运算符。 // 无效语法: 42.toFixed( 3 ); // SyntaxError // 下面的语法都有效: (42).toFixed( 3 ); // "42.000" 0.42.toFixed( 3 ); // "0.420" 42..toFixed( 3 ); // "42.000" 42 .toFixed(3); // "42.000"(注意其中的空格) 三、0.1 + 0.2 === 0.3 ? 在js中: 0.1 + 0.2 === 0.3; // false 关于这个问题,感兴趣的同学可以读读王二的转载的一篇文章抓住数据的小尾巴 - JS浮点数陷阱及解法,由于 JavaScript 中的数字类型是基于 IEEE754 标准来实现的,所以二进制浮点数中的 0.1 和 0.2 相加并不是十分精确,这时候可以使用 Number.EPSILON 来比较两个数字是否相等(在指定的误差范围内): function numbersCloseEnoughToEqual(n1,n2) { return Math.abs( n1 - n2 ) < Number.EPSILON; } var a = 0.1 + 0.2; var b = 0.3; numbersCloseEnoughToEqual( a, b ); //true 五、isNaN() 我们可以使用全局工具函数 window.isNaN() 和 ES6中的 Number.isNaN() 来判断一个值是不是 NaN,但这两者也有区别,参考如下代码: Number.isNaN( NaN ); // true Number.isNaN( "wanger" ); // false Number.isNaN( 5 ); // false window.isNaN( NaN ); // true window.isNaN( "wanger" ); // true window.isNaN( 5 ); // false ``` 很明显 "wanger" 不是一个数字 ,它也不是 NaN 。但是 `window.isNaN( "wanger" )`显示为true, 这个 bug自 JavaScript 问世以来就一直存在。 ### 六、`Object.prototype.toString` 可以查看类型 ```js Object.prototype.toString.call( [1,2,3] ); // "[object Array]" Object.prototype.toString.call( /regex-literal/i ); // "[object RegExp]" Object.prototype.toString.call( null ); // "[object Null]" Object.prototype.toString.call( undefined ); //"[object Undefined]" Object.prototype.toString.call( "abc" ); // "[object String]" Object.prototype.toString.call( 42 ); // "[object Number]" Object.prototype.toString.call( true ); // "[object Boolean]" 八、假值对象 先看一段代码: console.log(document.all) //会返回页面上的所有元素 if(document.all){ console.log("test") //不会答应 "test" } 最常见的假值对象是 document.all ,它是一个类数组对象,包含了页面上的所有元素,由 DOM(而不是 JavaScript 引擎)提供 给 JavaScript 程序使用。它以前曾是一个真正意义上的对象,布尔强制类型转换结果为 true ,不过现在它是一个假值对象。 虽然 JavaScript 代码中会出现假值对象,但它实际上并不属于 JavaScript 语言的范畴。但这里仍然有必要注意一下。 需要注意的是,为我们经常通过将 document.all 强制类型转换为布尔值(比如在 if 语句中)来判断浏览器是 否是老版本的 IE,如下: if(document.all) { /* it's IE */ } 十一、假值的相等比较 == 中的隐式强制类型转换最为人诟病的地方是假值的相等比较。 下面分别列出了常规和非常规的情况: "0" == null; // false "0" == undefined; // false "0" == false; // true -- 晕! "0" == NaN; // false "0" == 0; // true "0" == ""; // false false == null; // false false == undefined; // false false == NaN; // false false == 0; // true -- 晕! false == ""; // true -- 晕! false == []; // true -- 晕! false == {}; // false "" == null; // false "" == undefined; // false "" == NaN; // false "" == 0; // true -- 晕! "" == []; // true -- 晕! "" == {}; // false 0 == null; // false 0 == undefined; // false 0 == NaN; // false 0 == []; // true -- 晕! 0 == {}; // false