判断一个对象是否数组类型的7中方法
2019-07-25 23:58
465 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yesir_mao/article/details/97320304
说明:感谢东哥的解答,该文章仅供学习和参考,转载请注明出处。
<script> // 功能:判断一个数据是否是数组类型 var n = 10, str = "javascript", b = true, nu = null, un; var f = function() {}; var obj1 = {}, obj2 = [6, 6, 6], obj3 = new Date(); console.log( // 方法1:typeof //由此可以看出typeof只能判断出基本类型的数据类型,而不能判断引用类型的具体数据类型 typeof(n), //number typeof(str), //string typeof(b), //boolean typeof(nu), //object typeof(un), //undefined typeof(f), //function typeof(obj1), //object typeof(obj2), //object typeof(obj3) //object ) // 判断子类型的原型对象,3种方式 // 2.用__proto__获得父类的原型对象引用,然后再和数组的原型对象做比较 console.log( obj1.__proto__ == Array.prototype, //false obj2.__proto__ == Array.prototype, //true obj3.__proto__ == Array.prototype //false ) // 3.因为__proto__可能被浏览器禁用,所以通过等效于__proto__函数来替代__proto__:Object.getPrototypeOf(obj) console.log( Object.getPrototypeOf(obj1) == Array.prototype, //false Object.getPrototypeOf(obj2) == Array.prototype, //true Object.getPrototypeOf(obj3) == Array.prototype //false ) //4.原理同2,实际上是对2的封装:father.isPrototypeOf(child) console.log( Array.prototype.isPrototypeOf(obj1), //false Array.prototype.isPrototypeOf(obj2), //true Array.prototype.isPrototypeOf(obj3) //false ) // 通过构造函数来判断 // 5.用父级原型对象中的constructor属性来判断 console.log( obj1.constructor == Array, //false obj2.constructor == Array, //false obj3.constructor == Array //false ) // 6.通过instanceof判断该实例是否属于数组类型,返回的bool类型 console.log( obj1 instanceof Array, //false obj2 instanceof Array, //true obj3 instanceof Array //false ) // 问题:如果将obj1的原型对象指向数组的原型对象,那么前面的判断都会出现问题,obj1则都会被判断为是数组类型 // ,但是obj1本身不是数组类型的,此时应该如何解决这个问题呢?(即obj1.__proto__=Array.prototype) // 解决:每个对象再创建时,都会有一个内部属性class,相当于人的DNA,不能被随意访问到,class记录得时对象创建时得类型, // 不会随着原型对象得改变而改变.但是,此class被保存再顶级父对象Object中得同toString()方法中,上述得obj1,obj2,obj3 // 中,由于obj1是直接创建得对象,故此时它得toString()指向得就是顶级父对象中得toStirng,但是obj2是一个数组,obj3为一个 // 日期对象,故它们如果直接使用同toString()方法,则调用得是父类得原型对象中重写过后得toString(),obj2输出得是一个字符串, // 而obj3输出得是一个时间字符串。那么如何才能调用到顶级父对象中得toString()呢?需要通过。call()方法,绕过父类得原型对象 // 获取到顶级父对象中得toString() // 7.通过.call()方法获取顶级父对象中隐藏得class,从而获取该对象创建时的真正的类型 // 说明:[Object Array]中,object是对象的类型,而Array则为对象创建时的class,即对象的DNA,不会随着对象的原型对象的改变而发生改变 console.log( Object.prototype.toString.call(obj1) === "[object Array]", //false Object.prototype.toString.call(obj2) === "[object Array]", //true Object.prototype.toString.call(obj3) === "[object Array]" //false ) // 8.ES5中新增了一个专门判断一个对象是不是数组的函数:Array.isArray(obj) 返回bool类型的值 console.log( Array.isArray(obj1), //false Array.isArray(obj2), //true Array.isArray(obj3) //false ) </script>
运行结果如下:
相关文章推荐
- 判断一个JS对象是否为数组的方法
- 把传过来的Object对象转换成Collection类型的对象。isArray()方法,判定此Class对象是否表示一个数组类。java.lang.reflect.Array 对任意数组进行操作
- javascript中判断一个对象是否是数组的几种方法
- (开发篇) null判断~ .net判断一个对象是否为空的方法(未完待续)
- 不良代码展示-不要用数组循环判断等于的方式,来判断一个对象是否在一个集合内
- 如何判断一个对象是否是数组。
- JS判断一个数组中是否有重复值的三种方法 .
- JS判断一个数组中是否有重复值的三种方法
- JS判断一个数组中是否有重复值的三种方法
- StringUtils 工具类中判断一个string类型的值是否为空的几种方法
- 不要用数组循环判断等于的方式,来判断一个对象是否在一个集合内
- js语法学习之判断一个对象是否为数组
- 判断一个对象是否实现了某方法,而非继承而来
- js判断一个对象是否为数组
- 原!! java直接打印一个对象时,并不是直接调用该类的toString方法 ,而是会先判断是否为null,非null才会调用toString方法
- 判断一个变量类型是数组还是对象
- 判断游戏对象是否在摄像机视口的一个方法
- JavaScript判断一个对象是否为数组
- 编写js扩展方法实现判断一个数组中是否包含某个元素
- 判断比较两个对象是否是一个对象(equals方法)