数据类型的陷阱
1. 是不是Object
function isObject(obj) { if(typeof obj === 'object') { return true; } return false; }
第一个问题: . 上面的方法有什么问题?
typeof null // object
第二个问题:为什么typeof null返回的值是"object" ?
typeof原理
js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息: 对象:000 浮点数:010 字符串:100 布尔:110 ”。typeof直接根据变量值得内存标识符进行判断并返回的是对应字符串形式的值。
// 类型标记位
// 000: object
// 001: integer
// 010: double
// 100: string
// 110: boolean
第三个问题:为什么不修复这个问题?
注意: 现在的V8引擎不在这样判断数据类型,为了考虑兼容性没有修改,ES6提案修改这个bug但是没有通过。因为修改可能会造成一连串bug。
2.+转为数字
const print = console.log; function toNumber(val) { const result = +val; print(result); return result } // 传统数据类型 toNumber(null) // NaN toNumber(undefined) // NaN toNumber(1) // 1 toNumber("123aa") // NaN toNumber({}) // NaN toNumber(true) // 1 // ES6的 bigInt和Symbol toNumber(10n) toNumber(Symbol.for("a"))
ES6的 bigInt和Symbol无法实现
TypeError: Cannot convert a BigInt value to a number
TypeError: Cannot convert a Symbol value to a number
为什么会这样?
兼容性问题,在ES5中完全兼容,但是在ES6的新类型中不兼容。