- 对于
.运算符需要特别注意,因为它是一个有效的数字字符,会被优先识别为数字字面量的一部分,然后才是对象属性访问运算符 如:
42.toFixed(3) // syntaxError 会被理解为(42.)tiFixed(3) 解析失败
(42).toFixed(3) => "42.000"
42..toFixed(3) => "42.000"
0.42.toFixed(3) => "0.420"
- Number.isNaN 比 window.isNaN 更安全准确
Number.isNaN = ES6语法 等同于=>
if(!Number.isNaN) {
Number.isNaN = function (n) {
return typeof n === "number" && window.isNaN(n)
}
}
window.isNaN 检查参数是否不是NAN,也不是数字 因此 var b= 'foo'; window.isNaN(b) => true
*ES6 新增Object.is(a,b) 来判断两个值是否绝对相等
可以用来判断两个NAN 或者 0 与 -0
- 位操作符
~
~x 大致等同于 -(x+1)
~42 ; => -(42 =1) = -43
~-1; => - (-1 +1) = 0
因此if(~a.indexOf(..)) 可以代替 if(a.indexOf(..) !== -1)
- parseInt 解析非字符串
parseInt字符串中 0-9和 a-i是有效字符串
* parseInt(1/0 , 19) => 18
首先 1/0 被转换为字符串 parseInt('infinity', 19).第一个字符串i的19进制为18.n不是有限的数字字符串 * parseInt(false, 16) => 250; 等同于16进制的fa转为10进制 15* 16 + 10* 16^0 = 250
==宽松相等 与===严格相等的区别
== 允许在相等比较中进行强制类型转换,而===不允许
==宽松相等的隐式强制类型转换
不同类型的值比较是否相等时会先执行类型转换
x==y 不同类型转换规则:
- 字符串会被转换为数字基本类型 toNumber(x)
- 布尔类型会被转换为数字基本类型
- null 和 undefined 可以相互进行隐式转换 即可认为二者等同
- 对象与非对象相等比较时, 对象会调用内置方法toPrimittive(x)。
0 = [0] => true 对象会调用toPrimittive方法被转换为 "0",而字符串又会被转换为数字0,所以返回true
[] == ![] => true; 相等比较的右边是布尔类型,![]的结果是false,false转换为数字是0; 而数组对象[]转换结果是"0", “0”转换为数字为0
- 对象内置方法 toPrimittive 会优先调用 object.valueOf(),如果返回的是字符串测抛出字符串作为返回结果,否则会继续调用object.toString()返回字符串