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]