Javascript for ... in循环使用Object.prototype和Array.prototype属性

Sri*_*vas 7 javascript

我正在阅读MDN文档以更好地理解javascript.这是从那里的摘录

Object.prototype.objCustom = function() {}; 
Array.prototype.arrCustom = function() {};

let iterable = [3, 5, 7];
iterable.foo = 'hello';

for (let i in iterable) {
  console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
}
Run Code Online (Sandbox Code Playgroud)

在最糟糕的情况下,我认为它将打印,0, 1, 2, "foo", "arrCustom"但它也打印objCustom.

更新:
1) 如何从可视化原型链iterable,以Array高达一路Object.就像有任何指向父母的iterable.getParent方法或iterable.myparent属性一样.
2)为什么它不打印数组函数,例如toString,sort它们也是打开的Array.prototype.
3)hasOwnProperty当有人向Array.prototype物业添加东西时,我是否需要始终使用?

spa*_*nky 5

这是因为for in循环旨在迭代所有拥有和继承的可枚举属性。您可以Object.keys()用来仅获取拥有的属性。

Object.prototype.objCustom = function() {}; 
Array.prototype.arrCustom = function() {};

let iterable = [3, 5, 7];
iterable.foo = 'hello';

Object.keys(iterable).forEach(function(key) {
  console.log(key); // logs 0, 1, 2, "foo"
});
Run Code Online (Sandbox Code Playgroud)

但是,将非数字属性放在上是非常不寻常的Array。通常,有更好的方法可以完成您需要做的任何事情。

for in在数组上使用循环也很不常见。只要将数组限制在其数字索引内,还有其他更好的迭代数组的方法。


1)“我如何可视化原型链从可迭代到数组一直到Object。就像是否有任何iterable.getParent方法或iterable.myparent属性指向其上的父级。”

您可以Object.getPrototypeOf()用来获取对象继承的下一个对象。循环执行直到null达到目标。

var proto = Object.getPrototypeOf(myObj);
do {
  console.log(proto);
} while((proto = Object.getPrototypeOf(proto)));
Run Code Online (Sandbox Code Playgroud)

2)“为什么它不打印数组函数,例如toString,也将它们排序Array.prototype。”

toString()和其他内置方法是不可枚举的。正如我上面提到的,for in只能达到可枚举的属性。

3)hasOwnProperty当有人向Array.prototype房地产添加某些东西时,我需要经常使用吗?”

不要for in在数组上使用循环,您会做得更好。但是,是的,如果您使用for in,则需要.hasOwnProperty()样板代码来防止这种情况。

您还应该注意,使用时不能保证将顺序到达数组索引for in。而且,与其他方法相比,它通常也慢得多。.hasOwnProperty()支票特别慢。


归档时间:

查看次数:

287 次

最近记录:

8 年,8 月 前