Array.isArray and Object.prototype.toString.call

Posted Miya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Array.isArray and Object.prototype.toString.call相关的知识,希望对你有一定的参考价值。

Array.isArray() 用于确定传递的值是否是一个 Array。

Array.isArray([1, 2, 3]);  
// true

Array.isArray({foo: 123}); 
// false

Array.isArray("foobar");   
// false

Array.isArray(undefined);  
// false

Array.isArray(null);  
// false

Array.isArray(new Array());
// true

Array.isArray(new Array());
// true

Array.isArray(Array.prototype);
// true

假如不存在 Array.isArray(),则在其他代码之前运行下面的代码将创建该方法。

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === ‘[object Array]‘;
  };
}

相关问题

使用 typeof bar === "object" 判断 bar 是不是一个对象有神马潜在的弊端?如何避免这种弊端?

使用 typeof 的弊端是显而易见的(这种弊端同使用 instanceof):

let obj = {};
let arr = [];

console.log(typeof obj === ‘object‘);  //true
console.log(typeof arr === ‘object‘);  //true
console.log(typeof null === ‘object‘);  //true

从上面的输出结果可知,typeof bar === "object" 并不能准确判断 bar 就是一个 Object。可以通过 Object.prototype.toString.call(bar) === "[object Object]" 来避免这种弊端:

let obj = {};
let arr = [];

console.log(Object.prototype.toString.call(obj));  //[object Object]
console.log(Object.prototype.toString.call(arr));  //[object Array]
console.log(Object.prototype.toString.call(null));  //[object Null]

但是Object.prototype.toString.call(),为什么可以判断类型呢?

(1) call() 方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。

fun.call(thisArg, arg1, arg2, ...)

//thisArg: 
//在fun函数运行时指定的this值。需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。

//arg1, arg2, ...: 
//指定的参数列表。

//返回值:
//返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined。

(2) Object.prototype.toString()方法返回一个表示该对象的字符串。

此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型。

var toString = Object.prototype.toString;

toString.call(new Date);   //[object Date]

toString.call(new Object);  //[object Object]
toString.call({});  //[object Object]

toString.call(new Array());  //[object Array]
toString.call([]);  //[object Array]

toString.call(new String());  //[object String]
toString.call(‘‘);  //[object String]


toString.call(undefined);  //[object Undefined]
toString.call(null);  //[object Null]
toString.call(Math);  //[object Math]

toString.call(function(){});  //[object Function]
toString.call(Window);  //[object Function]

1.Array.isArray()

2.Object.prototype.toString()

3.Function.prototype.call()

以上是关于Array.isArray and Object.prototype.toString.call的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 判断判断某个对象是Object还是一个Array

如何判断一个数组

JS isArraytypeofinstanceof

如何用js判断一个对象是不是Array

对象deepcopy

js 判断值为Array or Object的方法