“for ... in”循环 JavaScript - 是否包含 Symbol 属性

pet*_*rov 5 javascript for-loop

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]);
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 4

for-in忽略符号键控属性,而不是由值为a的字符串键控的属性Symbolfor-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");
Run Code Online (Sandbox Code Playgroud)

但这个确实如此,因为属性的是一个字符串,只是它的是一个 Symbol:

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