- var arr = ['aa','bb','cc'];
- var obj = {
- a: 'aa',
- b: 'bb',
- c: 'cc'
- };
- console.log(arr instanceof Array); //true
- console.log(arr instanceof Object); //true
- console.log(obj instanceof Array); //false
- console.log(obj instanceof Object); //true
明确说一下 instanceof 是如何判断的:
instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性, 意思就是该变量通过原型链上能否找到构造函数的 prototype 属性, 还不清楚原型链的请看原型链
所以就能明白为什么 instanceof 判断一个变量可以分清楚它到底是数组还是对象:
- Array.prototype === arr.__proto__
- Object.prototype === arr.__proto__.__proto__
因为 arr 的原型链上存在 Array.prototype 和 Object.prototype
只有 Array 类型的变量才会满足 arr instanceof Array 和 arr instanceof Object 都返回 true,
也只有 Object 类型变量才满足 obj instanceof Array 返回 false,obj instanceof Object 返回 true
- 3.constructor
- var arr = ['aa','bb','cc'];
- var obj = {
- 'a': 'aa',
- 'b': 'bb',
- 'c': 'cc'
- };
- console.log(arr.constructor === Array); //true
- console.log(arr.constructor === Object); //false
- console.log(obj.constructor === Object); //true
- 4.Object.prototype.toString.call()
Object.prototype.toString.call()方法可以精准判断变量类型, 它返回 [object constructorName] 的字符串格式, 这里的 constructorName 就是 call 参数的函数名
- var a = NaN;
- var b = '222';
- var c = null;
- var d = false;
- var e = undefined;
- var f = Symbol();
- var arr = ['aa', 'bb', 'cc'];
- var obj = {
- 'a': 'aa',
- 'b': 'bb',
- 'c': 'cc'
- };
- var res = Object.prototype.toString.call(arr);
- console.log(res); //[object Array]
- var res2 = Object.prototype.toString.call(obj);
- console.log(res2); //[object Object]
- var res3 = Object.prototype.toString.call(a);
- console.log(res3); //[object Number]
- var res4 = Object.prototype.toString.call(b);
- console.log(res4); //[object String]
- var res4 = Object.prototype.toString.call(c);
- console.log(res4); //[object Null]
- var res5 = Object.prototype.toString.call(d);
- console.log(res5); //[object Boolean]
- var res6 = Object.prototype.toString.call(e);
- console.log(res6); //[object Undefined]
- var res7 = Object.prototype.toString.call(f);
- console.log(res7); //[object Symbol]
二, 总结
判断简单数据类型可以用 typeof, 判断数组, 对象使用 instanceof,constructor 和 Object.prototype.toString.call(), 最好使用 Object.prototype.toString.call(), 更加精准
来源: https://blog.csdn.net/yucihent/article/details/79652913