首页 > 其他分享 >js判断对象是否为数组的方法

js判断对象是否为数组的方法

时间:2022-11-17 18:57:43浏览次数:39  
标签:instanceof arr 数组 对象 js iframe Array prototype true

1. 使用 Array.isArray() 方法,推荐

let arr = [1,2,3,4]
console.log(Array.isArray(arr)) // true

 

2. 使用 Object.prototype.toString.call() 方法,该方法不仅能判断数组,还能判断 function('[object Function]')、number('[object Number]') 等数据

let arr = [1,2,3,4]
console.log(Object.prototype.toString.call(arr) == '[object Array]') // true

 

3. 通过 instanceof、constructor 方法去判断,有一定的风险,不推荐

正常情况下

let a = [1,3,4];
a.constructor === Array; //true
// 或者
let a = [1,3,4];
a instanceof Array; //true

但是需要注意的是,prototype属性是可以修改的,所以并不是最初判断为true就一定永远为真。其次,当我们的脚本拥有多个全局环境,例如html中拥有多个iframe对象,instanceof的验证结果可能不会符合预期,例如:

//为body创建并添加一个iframe对象
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
//取得iframe对象的构造数组方法

xArray = window.frames[0].Array;
//通过构造函数获取一个实例
var arr = new xArray(1, 2, 3);
arr instanceof Array; //false

// 或者
    
xArray = window.frames[window.frames.length-1].Array;
//通过构造函数获取一个实例
var arr = new xArray(1,2,3); 
arr.constructor === Array; //false

导致这种问题是因为iframe会产生新的全局环境,它也会拥有自己的Array.prototype属性,让不同环境下的属性相同很明显是不安全的做法,所以Array.prototype !== window.frames[0].Array.prototype,想要arr instanceof Array为true,你得保证arr是由原始Array构造函数创建时才可行。

标签:instanceof,arr,数组,对象,js,iframe,Array,prototype,true
From: https://www.cnblogs.com/liql/p/16900456.html

相关文章

  • JSR303校验
    JSR303校验记得添加依赖包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency......
  • js中innerHTML和createElement的效率比较
    结合js中字符串不可变的特性单次执行innerHTML和createElement时效率差不多如果重复执行,因为innerHTML=字符串,需要多次开辟空间存储字符串,所以createElement效率更高.......
  • 利用数组构建二叉树(随笔)
    做leetcode的时候,看到示例,突然想自己构建一颗树。。随即自己写了尝试写了一个方法(比较随意)测试用例://example-1[2,1,3]//example-2[2,null,3]//example-3[5,3......
  • 35:列表_元素删除的三种方式_删除本质是数组元素拷贝
    ###列表元素的删除###del删除删除列表指定位置的元素。>>>a=[100,200,888,300,400]>>>dela[1]>>>a[100,200,300,400]###pop()方法pop()删除并返回指定位置......
  • node __dirname is not defined in ES module scope in JS
    在es模块中使用__dirname时,会报错The"__dirnameisnotdefinedinESmodulescope"erroroccurswhenwetrytotrytousethe__dirnameglobalvariableinanES......
  • java 对象比较 返回不相同的值
    ////Sourcecoderecreatedfroma.classfilebyIntelliJIDEA//(poweredbyFernFlowerdecompiler)//packagecom.soooft.common.equator;importjava.util......
  • 【c&c++】对象的创建与引用计数器实现
    在面向对象的编程语言中,很多语言会根据引用计数器来实现对对象的自动回收机制,就和Unix/Linux中的文件系统那样,当一个对象被另一个对象持有时,被持有的对象自身的引用计数器......
  • nextjs中代理请求到指定域名
    在next.config.js中,通过配置rewritesfallback来把请求代理到指定域名module.exports={...asyncrewrites(){return{fallback:[{......
  • Day14.2:数组的声明及创建
    数组概念相同类型的数据的集合。语法格式://数组类型数组名=数组的值;int[]a=newint[10];//数组a含10个int类型的数据//====================================......
  • 2022.11.17 Java 面向对象的介绍
    属性+方法=类面向过程与面向对象不可分割,面向对象是由一个个面向过程组成,就像教育部由一个个老师组成。面向对象的本质:以类的方式组织代码,以对象的形式组织(封装)数据;......