您的位置:首页 > 其它

判断一个对象是否数组类型的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>

运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: