Why can ES6 Symbol properties be made enumerable by Object.defineProperty?

后端 未结 2 517
野性不改
野性不改 2020-12-30 02:11

In ES6 properties can be defined as symbol properties:

var symbol = Symbol();
var object = {};
object[symbol] = \'value\';

MDN defines enum

2条回答
  •  忘掉有多难
    2020-12-30 02:47

    Yes, there's a reason for allowing Symbol properties to be enumerable: Object.assign:

    let s1 = Symbol();
    let s2 = Symbol();
    let s3 = Symbol();
    let original = {};
    original[s1] = "value1";                // Enumerable
    Object.defineProperty(original, s2, {   // Enumerable
      enumerable: true,
      value: "value2"
    });
    Object.defineProperty(original, s3, {   // Non-enumerable
      value: "value3"
    });
    let copy = {};
    Object.assign(copy, original);
    console.log("copy[s1] is " + copy[s1]); // value1, because it was enumerable
    console.log("copy[s2] is " + copy[s2]); // value2, because it was enumerable
    console.log("copy[s3] is " + copy[s3]); // undefined, because it wasn't enumerable
    

    Live Copy on Babel's REPL.

    Just for clarity:

    MDN defines enumerable properties as 'those which can be iterated by a for..in loop' (1).

    That's simply wrong for ES6 (ES2015). It was a reasonable, if simplistic, definition in ES5 and earlier, no it's no longer even simplistically correct because of Symbols. I've fixed the article.


    This is a CW because it was the outgrowth of the comments on the question.

提交回复
热议问题