每日刷题:3种判断数组方法的优劣

77 阅读1分钟

原文链接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

iframe

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()

性能方面:Array.isArray()>instanceof>Object.prototype.toString.call()

补充一种类型识别的方法: typeof

Primitive types原始类型除了Null以外都可以返回正确类型,null返回object Reference types引用类型只有function能返回function,其他返回的都是object

image.png