原文链接21:
1.Object.prototype.toString.call() 可以判断所有数据类型,返回一个String
Primitive types原始类型
Object.prototype.toString.call('An') // "[object String]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call(false) //"[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
Object.prototype.toString.call(BigInt(12432432432432))// "[object BigInt]"
Reference types引用类型
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call({name: 'An'}) // "[object Object]"
Object.prototype.toString.call(new Date());// "[object Date]"
Object.prototype.toString.call([1,2,3]);// "[object Array]"
2.instanceof 返回boolean
MDN链接 Primitive types原始类型是找不到prototype的,所以instanceof 只适用于Reference types引用类型,注意prototype是可以改变的。
{result:1} instanceof Object //true
"string" instanceof String //false 非instance
new String("string") instanceof String //true
new String("string") instanceof Object //true
new Date() instanceof Date //true
new Date() instanceof Object //true
[1,2,3] instanceof Array //true
[1,2,3] instanceof Object //true
function(){} instanceof Object //true
3.Array.isArray() 返回boolean 引用原文中sisterAn的回答
1)instanceof 与 isArray:
当检测Array实例时,Array.isArray 优于 instanceof ,因为 Array.isArray 可以检测出 iframes
window.frames
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray(1,2,3); // [1,2,3]
// Correctly checking for Array
Array.isArray(arr); // true
Object.prototype.toString.call(arr); // true
// Considered harmful, because doesn't work though iframes
arr instanceof Array; // false
2)Array.isArray() 与 Object.prototype.toString.call()
假如不存在 Array.isArray(),则在其他代码之前运行下面的代码将创建该方法。
这是ES5的特性,在更老之前需要用这种方法,但现在基本上用ES6,所以了解一下就可以了。
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
性能方面:Array.isArray()>instanceof>Object.prototype.toString.call()
补充一种类型识别的方法: typeof
Primitive types原始类型除了Null以外都可以返回正确类型,null返回object Reference types引用类型只有function能返回function,其他返回的都是object