首页 > 其他分享 > 第 21 题:有以下 3 个判断数组的方法,请分别介绍它们之间的区别和优劣

第 21 题:有以下 3 个判断数组的方法,请分别介绍它们之间的区别和优劣

时间:2022-09-07 16:45:58浏览次数:95  
标签:instanceof 21 优劣 Object toString 数组 call Array prototype

> Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()

 

答案

1. Object.prototype.toString.call()

每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object type],其中 type 为对象的类型。但当除了 Object 类型的对象外,其他类型直接使用 toString 方法时,会直接返回都是内容的字符串,所以我们需要使用call或者apply方法来改变toString方法的执行上下文。

const an = ['Hello','An'];
an.toString(); // "Hello,An"
Object.prototype.toString.call(an); // "[object Array]"

这种方法对于所有基本的数据类型都能进行判断,即使是 null 和 undefined 。

Object.prototype.toString.call('An') // "[object String]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call({name: 'An'}) // "[object Object]"

Object.prototype.toString.call() 常用于判断浏览器内置对象时。

更多实现可见 谈谈 Object.prototype.toString

2. instanceof

instanceof  的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype

使用 instanceof判断一个对象是否为数组,instanceof 会判断这个对象的原型链上是否会找到对应的 Array 的原型,找到返回 true,否则返回 false

[]  instanceof Array; // true

但 instanceof 只能用来判断对象类型,原始类型不可以。并且所有对象类型 instanceof Object 都是 true。

[]  instanceof Object; // true

3. Array.isArray()

  • 功能:用来判断对象是否为数组

  • instanceof 与 isArray

    当检测Array实例时,Array.isArray 优于 instanceof ,因为 Array.isArray 可以检测出 iframes

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
  • Array.isArray() 与 Object.prototype.toString.call()
  • Array.isArray()是ES5新增的方法,当不存在 Array.isArray() ,可以用 Object.prototype.toString.call() 实现。
if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

 

 

 

 

 

标签:instanceof,21,优劣,Object,toString,数组,call,Array,prototype
From: https://www.cnblogs.com/zhanghaian/p/16666339.html

相关文章

  • eolinker取数组数据合并成一个数据的方法
    有时候遇到数据存在某一个数组中,类似下图结构,而用到这些数据的接口又需要一个数据集合,比如这样”[14224,14223]"。  思路是创建一个集合,把这两项数据取出来来,然后放......
  • 【Mac2021版Intel芯片下载】 - Intel芯片推荐安装
    【Mac2021版Intel芯片下载】-Intel芯片推荐安装往下拉有安装图文教程一、下载提示1请点击图标进行下载●每个软件下方均标注了该软件的用途,请注意查看;●如......
  • [翻转数组]
    [翻转数组]......
  • react hooks 中 useEffect 第二个参数,不传和传空数组的区别
    之前一直觉得,useEffect的第二个参数传空数组或者不传,没什么区别来着。今天试试确实是有所不同:useEffect(func,[]):空数组类似componentDidMount的生命周期,只在第一次r......
  • The 2021 China Collegiate Programming Contest (Harbin)
    比赛链接:https://codeforces.com/gym/103447B.MagicalSubsequence题意:给定一个序列\(A\),选择一个长为偶数的子序列\(B\),使得\(B_1+B_2=B_3+B_4...\),问这个......
  • leetcode 1385. 两个数组间的距离值
    给你两个整数数组 arr1 , arr2 和一个整数 d ,请你返回两个数组之间的 距离值 。「距离值」 定义为符合此距离要求的元素数目:对于元素 arr1[i] ,不存在任何元素 ......
  • 数组元素的获取和遍历
    数组的索引索引(下标):用来访问数组元素的序号(数组下标从0开始)。’数组名[索引]‘的形式来获取数组中的元素。例如:arr[1]得到'小黑'当没有这个数组元素时,则输出的结果......
  • 创建数组
    创建数组数组的概念数组是指一组数据的集合,其中每个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将一组数据存储在单个变量名下的优雅方式。1.利用new创......
  • 从数组中删除虚假值
    过滤掉虚假值:false,null,0,"",undefined,NaNJavaScriptconstcompact=arr=>arr.filter(Boolean)Examplescompact([0,1,false,2,'',3,'a','e'*23,......
  • 统计数组中某个值出现的次数
    JavaScriptconstcountOccurrences=(arr,val)=>arr.reduce((a,v)=>(v===val?a+1:a),0)ExamplescountOccurrences([1,1,2,1,2,3],1)//3......