本篇文只涉及到ES5的数据类型
原始数据类型:String Number Boolean Null Undefined
复杂数据类型:Object Function Array
typeof: 返回的对应的数据类型
console.log(typeof(undefined)); // undefined
console.log(typeof(null)); // object 为什么不是 null
在检测null 的时候会检测出null 的机器码后三位都为000,因此返回 null
理解: typeof 返回的 数据类型是根据机器码01011的后三位来定的 000的机器码返回的就是 => object
null 的数据存储在机器码中是 000000。。。。。0000 根据后三位存储的是000 而返回 object
也可以理解为 js 的设计bug
console.log(typeof([])); // object
console.log({}); // object
console.log(new Date()); // object
console.log(typeof(function(){})) ; // function
console.log(typeof Array); // function 为什么不是 object
在检测function的时候,本应该返回的是object,但是object 分为两类,会判断其内部有无call 方法,而function是有call 的方法的,所以返回 function;
理解: typeof 在检测复杂数据的时候应该返回的是 object, 但是又分为两种 object=> object function
js 的设计中在引用数据类型(复杂数据)的内部定义了一个方法 [ [ call ] ];
typeof 在检测过程中会首先判断数据类型上有无call 方法,有的话返回 funciton, 没有的话返回 object
typeof 面试题:
var str = "zp";
console.log(typeof(str)); // string
var str = new String("zp"); // 实例后的对象
console.log(str); // String {"zp"} 会已key value的形式保存
console.log(typeof(str)); // object
总结: typeof 检测数据类型的时候 少null 多function
instanceof : 检测返回的boolean => true 或者 false
a instanceof b 表示 a 是否是 b 实例化构造出来的,a 是否为 b 的实例对象。原型 原型链
console.log([].instanceof Array); // true
console.log(new Date() instanceof Date); // true
function Person() {};
console.log(new Person() instanceof Person); // true
console.log([] instanceof Object); // true
console.log(new Date() instanceof Object); // true
console.log(new Person() instanceof Object); // true
理解:
instanceof 通过检测原型链来判断,如果说 a instanceof b 返回true, 并且 b instanceof c 也返回true, 也就会 a instanceof c 也返回true。
typeof 和 instanceOf 其他解决检测数据类型的方法:
object.prototype.toString.call("1"); // "[object String]"
区别:
typeof 返回的字符串,该字符串表示的是该数据的类型, 少null多object
instanceof 是判断a 是否为b 的实例对象,检测的是原型和原型链