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]

扩展知识 instanceof

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

object instanceof constructor

//object:
//要检测的对象.

//constructor:
//某个构造函数 
var simpleStr = "This is a simple string"; 
var myString  = new String();
var newStr    = new String("String created with constructor");

var myObj     = {};
var newObj    = new Object();

var myArr     = [];
var newArr    = new Array();

var myDate    = new Date();

console.log(simpleStr instanceof String);//false
console.log(myString  instanceof String);//true
console.log(newStr  instanceof String);//true

console.log(simpleStr instanceof Object);//false
console.log(myString  instanceof Object);//true
console.log(newStr  instanceof Object);//true

console.log(myObj instanceof Object);//true
console.log(newObj instanceof Object);//true

console.log(myArr instanceof Array);//true
console.log(newArr instanceof Array);//true

console.log(myArr instanceof Object);//true
console.log(newArr instanceof Object);//true

console.log(myDate instanceof Date);//true
console.log(myDate instanceof Object);//true

console.log(myDate instanceof String);//false

console.log(undefined  instanceof Object);//false
console.log(undefined  instanceof Boolean);//false
console.log(undefined  instanceof Array);//false
console.log(undefined  instanceof String);//false

console.log(null  instanceof Object);//false
console.log(null  instanceof Boolean);//false
console.log(null  instanceof Array);//false
console.log(null  instanceof String);//false

console.log(true  instanceof Object);//false
console.log(true  instanceof Boolean);//false
console.log(true  instanceof Array);//false
console.log(true  instanceof String);//false

console.log(0  instanceof Object);//false
console.log(0  instanceof Boolean);//false
console.log(0  instanceof Array);//false
console.log(0  instanceof String);//false

console.log(({})  instanceof Object);//false

1.Array.isArray()

2.Object.prototype.toString()

3.Function.prototype.call()

原文地址:https://www.cnblogs.com/xmyun/p/8350978.html