Object.defineProperty()属性描述符的默认值?

《JS高程第三版》第六章关于对象属性那部分,提到的属性的几个特征,无论是数据属性还是访问器属性,他们的默认值都是true
比如
[[configurable]][[enumerable]]等等这些的默认值书上写的是true
但是 在MDN上面的说法却是false 所以
我有点晕
MDN:
https://developer.mozilla.org...

阅读 2.8k
2 个回答

MDN :

如果对象中不存在指定的属性,Object.defineProperty()就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是false。

意思是,如果你通过Object.defineProperty()创建新属性,省略描述符的某些字段,如果值为布尔型,则为 false;

Reflect.getOwnPropertyDescriptor(Object.defineProperty({}, 'key', {value:1}),'key')//{value: 1, writable: false, enumerable: false, configurable: false}

如果你不通过 Object.defineProperty() 创建新的属性,而是通过对象字面量创建属性,默认值为 true ,高程说的没问题;

Reflect.getOwnPropertyDescriptor({key:1},'key')//{value: 1, writable: true, enumerable: true, configurable: true}
let o={};
o.key=1;
Reflect.getOwnPropertyDescriptor(o,'key')//同上

另外,底层操作现在可以转移到 Reflect 对象上来操作;

你这个MDN的文档,是讲Object.defineProperty的api,默认为false。
比如

var obj = {};
Object.defineProperty(obj, 'a', { value: 20 });
obj.value; // 20
obj.value = 15;
obj.value; // 20
Object.keys(obj); // []

使用这个api,没有configurable和enumerable时,这两个参数默认值是false。
而高程上面讲的是一个对象属性的默认值,类似于这种。

var obj = {
  a: 20,
};

这个a属性是可枚举的可修改的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题