Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaScript判断变量是数组或者对象,以及其原理 #6

Open
qppq54s opened this issue Mar 7, 2019 · 0 comments
Open

JavaScript判断变量是数组或者对象,以及其原理 #6

qppq54s opened this issue Mar 7, 2019 · 0 comments

Comments

@qppq54s
Copy link
Owner

qppq54s commented Mar 7, 2019

js中我们常用的判断类型方法typeof在对象和数组上都返回'object',所以要使用其他方案来判断

第一种方法,判断对象的长度

var a = [];
var b = {};
a.length; // 0
b.length; // undefined

然而,因为对象的属性可以被修改,所以这种方法并不可靠;但是因为let等会计作用域的保证,所以这个方法是开发中比较简单常用的方法;

第二种方法,instanceof

var a = [];
var b = {};
a instanceof Array; // true
b instanceof Array; // false

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object的原型链上。
换句话来说,就是检测参数a的原型链上是否存在Array的的原型;
理解这个方法可以了解下mdn上关于Object.getProtoTypeOf的解释

JavaScript中的 Object 是构造函数(创建对象的包装器)。
一般用法是:
var obj = new Object();

所以:
Object.getPrototypeOf( Object );               // ƒ () { [native code] }
Object.getPrototypeOf( Function );             // ƒ () { [native code] }

Object.getPrototypeOf( Object ) === Function.prototype;        // true

Object.getPrototypeOf( Object )是把Object这一构造函数看作对象,
返回的当然是函数对象的原型,也就是 Function.prototype。

正确的方法是,Object.prototype是构造出来的对象的原型。
var obj = new Object();
Object.prototype === Object.getPrototypeOf( obj );              // true

Object.prototype === Object.getPrototypeOf( {} );               // true

第三种方法,Object.prototype.toString.call()

var a = [];
var b = {};
b.toString(); // "[object Object]"
Object.prototype.toString.call(a); // "[object Array]"
Object.prototype.toString.call(b); // "[object Object]"

那么问题来了,为什么要使用Object.prototype.toString来帮助判断,不直接用toString?其实是为了防止自定义的toString方法导致返回的结果被修改。
每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型。

第四种方法,Array.isArray()

var a = [];
var b = {};
Array.isArray(a); // true
Array.isArray(b); // false

Array是ES6推出的方法,在可以使用ES6的环境下,提供了简单好用的array判断方法!

严格判定JavaScript对象是否为数组

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant