instanceof 在跨 frame 对象构建的场景下会失效

如何判断一个js对象是否是Array,arr为要判断的对象,下面最准确的方法是?

A
typeof(arr)

B
arr instanceof Array

C
arr.toString==='[object Array]';

D
Object.prototype.toString.call(arr) === '[object Array]';

正确答案:D

解析看这里:http://www.nowamagic.net/librarys/veda/detail/1250

简单概括下:

typeof(arr) 返回的是 Object instanceof 在跨 frame 对象构建的场景下会失效 arr.toString 没有这种用法,正确的用法是 arr.toString() 返回的是数组的内容

其实Array本身有isArray这个方法判断

判断一个对象是否属于数组,最好怎么做?

  1. typeof(arr),typeof返回的是基本数据类型及object,不会详细到array的,所以不行
  2. arr instanceof Array,这一点还不透彻,说的是在多iframe/window环境下,通过Instanceof来识别对象是否属于数组会出错
  3. arr.toString,直接使用toString函数自然是数组有什么就返回什么了,例如[1,2] => '1,2'
  4. Object.prototype.toString.call(arr) === '[object Array]';这才是正确的
var obj={}; console.log(obj.__proto__) var arr=[2,3]; console.log(arr.toString()); console.log(arr instanceof Array);//true console.log(Object.prototype.toString.call(arr));//数组对象有prototype //[object Array] function one(){ console.log('函数实例对象有prototype?') } console.log(Object.prototype.toString.call(one));//[object Function] var child=new one(); console.log(Object.prototype.toString.call(child));//[object Object] console.log(child.prototype);//undefined // 需要注意的是,_proto_属性是所有对象都有的,而prototype属性是只有函数才有的,实例对象没有! console.log(Object.__proto__) console.log(Object.prototype); console.log(Object.prototype.toString);//这就是一个函数!! //注意,上面之所以用Object.prototype.toString.call(child)有效 //是因为Object.prototype.toString就是被调用的函数,相当于 child.函数 // 所以这样的toString自然是没错的,因为不是像我之前想的那样改成child.prototype.toString

instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个【frame】框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的 Array 构造函数。

toString为Object的原型方法,而Array ,Function等类型作为Object的实例,都重写了toString方法。
不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(Function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串.....),
而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;
因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。


__EOF__

本文作者龙陌
本文链接https://www.cnblogs.com/longmo666/p/17835012.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   龙陌  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示