我正在阅读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物业添加东西时,我是否需要始终使用?
这是因为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 次 |
| 最近记录: |