undefined
undefined 在 JavaScript 中是一个变量而非一个关键字, 这其实是 JavaScript 的设计失误之一. 在某些浏览器中允许你重写 undefined, 建议使用 void 0 来获取 undefined 值.
0.1+0.2===0.3???
根据双精度浮点数的定义 Number 类型中有效的整数范围是 - 0x1fffffffffffff 至 0x1fffffffffffff, 也就说 JavaScript 无法表示此范围之外的整数. 对于 64 位浮点数 (double) 来说, 大于 1 的最小浮点数相当于二进制的 1.00..001 小数点后面有连续 51 个零. 这个值减去 1 之后, 就等于 2 的 - 52 次方. 所以非整数的 Number 类型数字无法使用 == 或者 === 进行比较. 正确的比较方法为:
- Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON
- "类"==="类型"???
由于 C++,java 等语言中每一个类都有一个类型一一对应, 所以很多人将 JavaScript 中的 "类" 与类型混淆. 实际上 JavaScript 中无法自定义类型. 3 与 new Number(3)是完全不同的值, 一个是 number 类型, 一个是对象类型.
Number,Boolean,String 跟 new 配合可以生成对象, 直接调用则是强制类型转换. Symbol 函数比较特殊无法使用 new.
装箱操作
那为什么 number 类型数据可以调用 Number 对象类型中定义的方法? 实际上. 运算符进行了一个封箱操作, 根据基础数据类型构造一个临时对象类型, 使得我们可以在基础数据类型之上调用对象方法. 频繁的装箱操作会产生大量临时对象, 所以在要求高性能的场景应尽量避免使用装箱操作.
拆箱转换
JavaScript 中规定了 ToPrimitive 函数它是对象到基本类型的转换
- var o = {
- valueOf : () => {console.log("valueOf"); return {}},
- toString : () => {console.log("toString"); return {}}
- }
- o * 2
- // valueOf
- // toString
- // TypeError
类型转换的内部实现是通过 ToPrimitive ( input [ , PreferredType ] )方法进行转换的, 这个方法的作用就是将 input 转换成一个非对象类型. 参数 preferredType 是可选的, 它的作用是, 指出了 input 被期待转成的类型. 如果不传 preferredType 进来, 默认的是'number'. 如果 preferredType 的值是 "string", 那就先执行 "toString", 后执行 "valueOf". 否则, 先执行 "valueOf", 后执行 "toString". 由此可见,"toString", "valueOf" 的执行顺序, 取决于 preferred 的值.
来源: http://www.jianshu.com/p/19224bd8bf7f