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规范定义的,并且每个对象的行为都不同。