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

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构造函数创建时才可行。


__EOF__

本文作者cros
本文链接https://www.cnblogs.com/liql/p/16900456.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cros  阅读(138)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示