【问题标题】:"for ... in" loop JavaScript - does it include Symbol properties“for ... in”循环 JavaScript - 它是否包含符号属性
【发布时间】:2020-04-13 14:59:47
【问题描述】:

MDN 是这么说的

for...in 循环仅迭代可枚举的非符号属性。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

但我做了一个简单的测试,它表明即使是 Symbol 属性也在“for...in”循环中迭代。

这里有什么问题?
我错过了什么?

示例 1:

var symbol = Symbol("test");

function Animal(name){
    this.name = name;
}

Animal.prototype = {};
Animal.prototype.constructor = Animal;

function Dog(breed){
    this.breed = breed;
    this.name = "Dog";
    this.s = symbol;
}

Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;

console.log("001");
var d = new Dog("Sharo");
for (let x in d){
    console.log(x, ":", d[x]);
}

console.log("002");
d = new Object();
for (let x in d){
    console.log(x, ":", d[x]);
}

console.log("003");
d = new Number(5);
for (let x in d){
    console.log(x, ":", d[x]);
}

【问题讨论】:

  • 你能显示测试的代码吗?
  • @funnydman 是的,当然。添加了代码。
  • 未来读者须知:我已经编辑了 MDN 文章以澄清导致此问题的句子。

标签: javascript for-loop


【解决方案1】:

for-in 忽略 Symbol-keyed 属性,而不是由 value 为 Symbol 的字符串键入的属性。 for-in 根本不关心属性的值。

例如,这个for-in 循环永远不会执行它的主体:

const obj = {
    [Symbol("x")]: "foo"
};
for (const name in obj) {
    console.log(`name = ${String(name)}`); // never runs
}
console.log("End of script");

但是这个可以,因为属性的key是字符串,只是它的value是Symbol:

const obj = {
    foo: Symbol("x")
};
for (const name in obj) {
    console.log(`name = ${name}`);
}
console.log("End of script");

【讨论】:

  • 嗯...我将“非符号属性”理解为“不是符号的属性”。对我来说似乎很自然。好的,我想我现在明白了。
  • @peter.petrov - MDN 上的措辞略显草率(由社区编辑)。它应该是“A for...in 循环仅迭代由字符串键入的可枚举属性(忽略由符号键入的属性)”或类似的。
  • 对不起...实际上...等一下...属性不是总是由字符串键入吗? (1)我现在很困惑......这让我回到“ABC”:)......如果(1)的答案是“否”,那么......(2)可以是什么价值观/事物对象属性的键?似乎只有字符串和符号,然后......在这方面,符号非常特殊,因为只有符号和字符串才能成为对象属性的键。还是……我又上当了?
  • 没关系...我把它作为一个单独的问题发布了,现在我所有的困惑都被清除了,我想:) stackoverflow.com/questions/59436684/…
  • @peter.petrov - 我不在办公桌前。 :-) 我现在已经回答了。
【解决方案2】:

for...in 循环仅迭代可枚举的非符号属性。

这是在谈论属性,它们是对象的键,而不是值。此示例中不会显示 Symbol 属性:

var symbol = Symbol("test");

function Animal(name){
    this.name = name;
}

Animal.prototype = {};
Animal.prototype.constructor = Animal;

function Dog(breed){
    this.breed = breed;
    this.name = "Dog";
    this[symbol] = symbol;
}

Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;

console.log("001");
var d = new Dog("Sharo");
for (let x in d){
    console.log(x, ":", d[x]);
}

console.log("002");
d = new Object();
for (let x in d){
    console.log(x, ":", d[x]);
}

console.log("003");
d = new Number(5);
for (let x in d){
    console.log(x, ":", d[x]);
}

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 2015-07-28
    • 2011-07-12
    • 2010-11-07
    • 2014-02-10
    • 2013-10-29
    • 2017-08-27
    • 2014-12-15
    相关资源
    最近更新 更多