精确判断对象类型

作者: fenerchen | 来源:发表于2018-04-01 23:28 被阅读19次

原文链接http://www.nowamagic.net/librarys/veda/detail/1250

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" src="3.html"></iframe>
    <script type="text/javascript">
        window.onload = 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>

控制台的结果


寻找原因
//2.thml
<body>
    <iframe name="childframe" src="3.html"></iframe>
    <script type="text/javascript">
        window.onload = 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>

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

终极BOSS Object.prototype.toString

//2.html
<body>
    <iframe name="childframe" src="3.html"></iframe>
    <script type="text/javascript">
        window.onload = 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>

控制台结果


以上部分在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

参考资料:javascript 为啥不用instanceof检测数组,这里有一个示例坑

相关文章

  • 精确判断对象类型

    原文链接http://www.nowamagic.net/librarys/veda/detail/1250 ty...

  • 数据类型的判断

    1.typeof:能判断所有值类型,函数,不能判断、数组、对象进行精确判断; 2.instanceof :判断对象...

  • flow中文文档(四)

    对象类型语法 可选对象类型属性 密封对象 未密封对象 精确对象类型 ObjectsAsMaps 在JavaScri...

  • NodeJs实用技巧

    判断数组类型为 Array 判断对象类型为 Object 判断对象类型为 Number

  • 对象

    1.对象分为值类型和引用类型 值类型(不是对象) 引用类型(都是对象) 类型的判断值类型判断用typeof引用类型...

  • js 比Typeof更精确的类型判断

    常用的类型判断方法typeof 不是很精确,于是自定义了一个判断类型的方法: 为什么类型判断会和toString扯...

  • 精确判断数据类型

    判断数组 判断所有数据类型

  • 必须记住的前端知识点(一)

    值类型的类型判断用typeof,引用类型的类型判断用instanceof一切(引用类型)都是对象,对象是属性的集合...

  • 【第 12 天】获取对象信息

    获取对象信息 type() 返回对象的类型 isinstance() 判断继承的类型 能用 type() 判断的基...

  • JS类型判断,typeof/constructor/instan

    javascript类型判断、对象类型判断、typeof、constructor、instanceof 网上很多解...

网友评论

    本文标题:精确判断对象类型

    本文链接:https://www.haomeiwen.com/subject/vnszcftx.html