摘要:判断一个对象是不是数组类型少部分人可能首先会想到可以看出是可以判断出基本数据类型的,函数也能判断出来,但是对象数组日期都会返回这样就根本无法判断一个对象是不是数组类型。
判断一个对象是不是数组类型 typeof
少部分人可能首先会想到 typeof
var n = 3, b = true, s = "Hello", x = null, y, obj1 = function() {}, obj2 = {}, obj3 = [], obj4 = new Date(); console.log( typeof n, //number typeof b, //boolean typeof s, //string typeof x, //object typeof y, //undefined typeof obj1, //function typeof obj2, //object typeof obj3, //object typeof obj4 //object );
可以看出 typeof 是可以判断出基本数据类型的,函数也能判断出来,但是对象、数组、日期都会返回 object,这样就根本无法判断一个对象是不是数组类型。所以 typeof 宣告无能为力
判断其父级原型对象var obj1 = {}, obj2 = [1, 2, 3], obj3 = new Date(); console.log(obj1.__proto__ == Array.prototype); //false console.log(obj2.__proto__ == Array.prototype); //true console.log(obj3.__proto__ == Array.prototype); //false
但是 __proto__ 是内部属性,本不应该被访问到,我们可以用 Object.getPrototypeOf(obj) 方法来代替他,虽然这个方法其实内部原理也是他,但是还是有不同的。
console.log(Object.getPrototypeOf(obj1) == Array.prototype); //false console.log(Object.getPrototypeOf(obj2) == Array.prototype); //true console.log(Object.getPrototypeOf(obj3) == Array.prototype); //false判断其构造函数
obj instanceof Array 判断 obj 是不是被构造函数 Array 创造出来的
console.log(obj1 instanceof Array); //false console.log(obj2 instanceof Array); //true console.log(obj3 instanceof Array); //false
但instanceof 不仅判断直接父类型,而是所有在原型链上的类型,都返回 true ,所以如果你创建一个对象但是把他的 __proto__ 指向 Array 的原型,然后判断其类型,也会返回 true。
obj1.__proto__ = Array.prototype; console.log(obj1 instanceof Array); //true判断对象内部的 class 属性
每个对象内部,都有一个隐藏的 class 属性,记录该对象创建时的数据类型 class 属性不会随继承关系的改变而改变。(就相当于查人的 DNA 了吧,小样还想伪装。)
这里有一个问题:内置类型的原型对象中几乎都重写了新的 toString(),只有最顶层的 toString() 才能输出对象的 class 属性值,
因此我们可以用 call 来使用最牛皮的身份鉴别
console.log( Object.prototype.toString.call(obj1) == /*[object Object]*/ "[object Array]" ); //false console.log( Object.prototype.toString.call(obj2) == /*[object Array]*/ "[object Array]" ); //true console.log( Object.prototype.toString.call(obj3) == /*[object Date]*/ "[object Array]" ); //falseArray.isArray
Array.isArray 也可以弥补 typeof 的不足
Array.isArray(obj1); //false Array.isArray(obj2); //true Array.isArray(obj3); //false
更多文章来自我的 github ,求个 star 鼓励一下吧!
https://github.com/MLuminary/Blog/issues
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/94849.html
摘要:最新版本见,点击查看历史版本提供一套实用的基础函数任意格式的日期转换函数,浏览器相关操作函数等全局参数设置默认全局参数基础函数判断是否非数值判断是否为有限数值判断判断是否数组判断是否小数判断是否整数判断是否对象判断是否对象判断是否对象判断是 最新版本见 Github,点击查看历史版本 XEUtils 提供一套实用的基础函数、任意格式的日期转换函数,浏览器相关操作函数等... API ...
摘要:注意类继承时的问题继承自方法中对象直接继承和间接继承的都会报解决的问题通常是让对象的手动指向自己将自己的类赋值给对象的属性基类不会报了原博参考,,,,判断为 js基础(二):构造函数与原型 一、常见实例 判断是否为对象 let obj = {} // 1.Object.prototype.toString if (Object.prototype.toString.call(obj...
摘要:用做缓存的高阶函数用高阶函数的好处是无需暴露不同要求的缓存对象在外面,形成一个闭包。函数内部调用函数得到操作后的值,并缓存在对象中,如果再对同一个值进行操作时,则直接从缓存中取,无需再调用函数计算。 以下摘取的函数,在 shared 目录下公用的工具方法。文件在 util.js 中,githu地址。 提取了一些常用通用的函数进行剖析,主要包含以下内容: 创建一个被冻结的空对象 判断是...
摘要:多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。上面我们提到使用原生的方法来判断值是否为数组的实例。这也意味着不是一个十分可靠的识别对象类型的方式。 在JavaScript中,可以通过typeof操作符来判断基本数据类型(Undefined、Null、Boolean、Number和String),同时相信大家也熟知ty...
摘要:比如我们今天要讨论的,在当中如何判断一个数组是数组。在数组的原型链上也能找到构造函数由上面的几行代码可以看出,使用运算符可以分辨数组和对象,可以判断数组是数组。用判断实例化的数组拥有一个属性,这个属性指向生成这个数组的方法。 如果你没有注意过这个问题,那么这个标题应该会让你感到困惑,判断数据类型这么基础的问题能有什么坑呢? 少年,你不能太天真了,我们朝夕面对的这门语言,可是JavaSc...
摘要:一关闭一个流或者且不抛出异常。删除文件或文件夹且不会抛出异常。此外,还支持等十格式化参数,返回一个或者可用字符串把或者等转换为十一加密,返回位加密加密加密加密,返回位十二是否为空根据条件筛选集合元素根据指定方法处理集合元素,类似的。 一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流、socket、或者selector且不...
阅读 3569·2021-11-15 11:36
阅读 1060·2021-11-11 16:55
阅读 694·2021-10-20 13:47
阅读 2993·2021-09-29 09:35
阅读 3428·2021-09-08 10:45
阅读 2553·2019-08-30 15:44
阅读 848·2019-08-30 11:10
阅读 1427·2019-08-29 13:43