亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

精確判斷對象類型

標簽:
JavaScript

typeof操作符

对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时

    var arr=new Array("1","2","3","4","5");
    alert(typeof(arr));

你会收到一个object 的答案,有点让人失望。
typeof操作符不能区分对象类型,null、array等都是object

instanceof 操作符

JavaScript中instanceof运算符会返回一个 Boolean 值,指出对象是否是特定类的一个实例。 使用方法:result = object instanceof class,还是刚刚的数组,再来一次,嗯,成功的返回 true。

var arrayStr=new Array("1","2","3","4","5");
alert(arrayStr instanceof Array); //true

但当和frame打交道的时候instanceif就呵呵了。请看下面的代码:

//2.html<body>
    <iframe name="childframe" class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="3.html"></iframe>
    <script type="text/javascript">
        window. = function () {            var airplanes = ["MU", "CA", "CZ"];            var r=airplanes instanceof Array;            console.log('2.html,airplanes instanceof Array:'+r)            var result = window.frames[0].flight(airplanes);
        };    </script></body>//3.html<body>
    <script type="text/javascript">
        var flight = function (arr) {                    var result = arr instanceof Array
                console.log('frame,arr instanceof Array:'+result);//false
        };    </script></body>

控制台的结果

webp


寻找原因


//2.thml<body>
    <iframe name="childframe" class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="3.html"></iframe>
    <script type="text/javascript">
        window. = function () {            var airplanes = ["MU", "CA", "CZ"];             var r=airplanes instanceof Array;            var result = window.frames[0].flight(airplanes);            console.log("2.html,airplanes.constructor:"+airplanes.constructor)             var y=window.constructor==Window            console.log("2.html,window.constructor==Window:"+y)            var z=window.constructor==window.frames[0].Window            console.log("2.html,window.constructor==.frames[0].Window:"+z)
        };    </script></body>//3.html<body>
    <script type="text/javascript">
        var flight = function (arr) {                    var result = arr instanceof Array
                    console.log("frames,airplanes.constructor:"+arr.constructor)                    var r=window.constructor==Window                     console.log('frames,window.constructor==Window:'+r)
        };    </script></body>


webp


综上,在2.html和fram中的window是两个不同时实例,而Array又是window的属性,既然大环境都不一样,那么Array也肯定不是同一个,因此对于同一个Array实例来说,在这两种环境下游走,它的根不变,就好比,A是中国人,A在美国定居生活,但是他始终不是美国银


终极BOSS Object.prototype.toString

webp

//2.html<body>
    <iframe name="childframe" class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="3.html"></iframe>
    <script type="text/javascript">
        window. = function () {            var airplanes = ["MU", "CA", "CZ"];            var result = window.frames[0].flight(airplanes);
        };    </script></body>//3.html<body>
    <script type="text/javascript">
        var flight = function (arr) {                    var result = Object.prototype.toString.call(arr)                    console.log(result)
        };    </script></body>

控制台结果

webp


以上部分在IE和火狐下测试正确,在谷歌下有关于跨域的错误


call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。也许你要问了,为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,所以能一定程度保证其“纯洁性”:)
还有一种便捷的写法,来检测对象类型toString.apply(arr),但是IE不兼容。

 var v=[1,2];console.log( toString.apply(v) === '[object Array]')//true



作者:fenerchen
链接:https://www.jianshu.com/p/6ac0964fb132


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消