Javascript ES6不支持获取原型值-如何检查hasownproperty
在中为…使用Javascript ES6不支持获取原型值-如何检查hasownproperty,javascript,ecmascript-6,Javascript,Ecmascript 6,在中为…使用,我总是检查hasOwnProperty(我想这是使用Object.keys的一个很好的参数),比如: 当我为…of使用时,是否需要进行相同的检查?如果需要,我应该如何进行检查 根据 当for…in迭代属性名称时,for…of迭代属性值 但它没有说明迭代是包含继承属性还是只包含实例属性。这里给出的解释和示例代码只涉及实例属性。由于您没有对属性键的显式访问权限,因此无法真正执行相同的检查 var arr = [1, 2, 3]; for(let val of arr) { // a
,我总是检查hasOwnProperty
(我想这是使用Object.keys
的一个很好的参数),比如:
当我为…of
使用时,是否需要进行相同的检查?如果需要,我应该如何进行检查
根据
当for…in
迭代属性名称时,for…of
迭代属性值
但它没有说明迭代是包含继承属性还是只包含实例属性。这里给出的解释和示例代码只涉及实例属性。由于您没有对属性键的显式访问权限,因此无法真正执行相同的检查
var arr = [1, 2, 3];
for(let val of arr) {
// all you have is the value
// there is no way to check
console.log(val);
}
for of
语句可用于任何对象,iterable协议的定义方式因对象而异
使用hasOwnProperty
检查的原因是确保属性位于对象上,而不是对象的原型上。您可以轻松地测试这是否与of的相同
var prototype = { a: 1 };
var instance = Object.create(prototype);
instance.b = 2;
instance.c = 3;
for(var val of instance) {
console.log(val);
}
不同的环境有不同的
实现。目前,它在我的浏览器中使用数组,但不使用对象。最好的做法是在您想要部署到的环境中进行尝试。for…of
通过iterable对象的迭代器进行迭代。在ES6规范中,为对象生成迭代器的函数通过符号在对象上标识;i、 例如,someObj[Symbol.iterator]
Symbol.iterator
为每个iterable类型返回的迭代器是不同的,但一般来说,它只迭代对象包含的相对于类型有意义的值。例如:
Array.prototype["7"] = "hello"; // why are you doing this?? :O
var a = [1,2,3]
a.length = 8; // why are you doing this?? D:
for(g of a) { console.log(g); } // great job, you got strange results
- 将每个代码点作为单个字符串进行迭代
- 迭代
Map
的[[MapData]]
内部插槽,这是存储键到值映射的位置
- 仅对整数索引进行迭代(请参阅)
向对象的原型添加属性不太可能影响迭代器的行为,因此在这方面,不需要测试值是否来自自己的属性
for..of
和for..in
是根本不同的for..in
迭代对象的属性,有时需要询问有关这些属性的问题,例如它们是否继承for..of
从迭代器中抽取值,迭代器私下决定以什么顺序返回什么值。询问for..of
迭代的结果是否来自继承的属性并不一定有意义,因为它可能根本不是来自属性。(例如,for..of
映射的迭代
返回未作为属性公开的值。)
我只能想到一种(非常奇怪的)情况,在这种情况下,继承属性会影响
数组
迭代器的行为,如果以下所有条件都成立:
- 如果
具有整数名的属性,则Array.prototype
- 在被迭代的实例上,该名为整数的属性未设置为自己的属性,并且
- 实例的
大于该整数索引的名称长度
Array.prototype["7"] = "hello"; // why are you doing this?? :O
var a = [1,2,3]
a.length = 8; // why are you doing this?? D:
for(g of a) { console.log(g); } // great job, you got strange results
在这种非常奇怪的情况下,您将迭代继承的
7
属性。这是我能想到的唯一一个案例;其他继承属性将被忽略,因为它们没有整数名,或者因为它们被具有相同整数名的实例属性隐藏,或者因为它们大于或等于实例的长度
,为什么不直接查看?“for…of循环和for…in循环之间的区别。而对于…在迭代属性名称中,对于…在迭代属性值中:“是的,他们不清楚它是否遍历自己的属性@Ziki是的,我猜这意味着它迭代所有属性。如果这些文档是显式的,那就太好了,@pQuestions123它遍历对象的@@iterator
。每个对象类型的迭代器对象的行为都是由ES6规范定义的,并且每个对象的行为都不同。