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

  • 相关阅读:
    python 报错:reduce failed to synchronize: device-side assert triggered
    pytorch 分割二分类的两种形式
    Leetcode 104. 二叉树的最大深度
    LeetCode 78. 子集
    python报错:1only batches of spatial targets supported (non-empty 3D tensors) but got targets of size
    PyTorch:The "freeze_support()" line can be omitted if the program is not going to be frozen
    pytorch创建tensor的四种方法
    Leetcode 四数之和
    C++的类和对象
    结构体
  • 原文地址:https://www.cnblogs.com/xmyun/p/8350978.html
Copyright © 2020-2023  润新知