为什么不';javascript对象属性描述符始终默认为false(根据规范)

为什么不';javascript对象属性描述符始终默认为false(根据规范),javascript,object,properties,attributes,Javascript,Object,Properties,Attributes,根据添加javascript对象属性时的说明,以下默认值将应用于属性描述符: 可配置:false 可枚举:false 可写:false 但是,当使用以下(非常流行的)点表示法指定对象属性时,它们都默认为true myObject = {}; myObject.a = 1; 为什么会这样?显然——同样根据规范中一个不明显的部分——这是由于对象属性的定义方式。 看 如果使用点表示法定义对象特性方法: var myObject={}; myObject.a=1; var myObject

根据添加javascript对象属性时的说明,以下默认值将应用于属性描述符:

  • 可配置:false
  • 可枚举:false
  • 可写:false
但是,当使用以下(非常流行的)点表示法指定对象属性时,它们都默认为true

myObject = {};
myObject.a = 1;

为什么会这样?

显然——同样根据规范中一个不明显的部分——这是由于对象属性的定义方式。 看


如果使用
点表示法定义对象特性
方法:

var myObject={}; 
myObject.a=1; 
var myObject = {};
myObject["a"] = 1;
var myObject={}; 
Object.defineProperty(myObject, 'a', { value: 1 });
然后所有属性描述符都默认为true


如果使用
括号表示法定义对象特性
方法:

var myObject={}; 
myObject.a=1; 
var myObject = {};
myObject["a"] = 1;
var myObject={}; 
Object.defineProperty(myObject, 'a', { value: 1 });
然后所有属性描述符都默认为true


但是,如果使用
defineProperty
方法定义对象特性:

var myObject={}; 
myObject.a=1; 
var myObject = {};
myObject["a"] = 1;
var myObject={}; 
Object.defineProperty(myObject, 'a', { value: 1 });
任何未定义的描述符默认为false



请参见本文中的一个示例这是一个让许多新开发人员/程序员/工程师感到困惑的问题。在MDN中有两种方法可以解决此问题。如果查看MDN中的Object.getOwnPropertyDescriptor()方法。它表示,可写、可枚举和可配置的所有属性都默认为false,但当您使用该方法时,所有属性都将返回true(是的,它们默认为false)

示例:

让用户={
姓名:“约翰”
};
让描述符=Object.getOwnPropertyDescriptor(用户,'name');
log(JSON.stringify(描述符,null,2));
/*属性描述符:
{
“价值”:“约翰”,
“可写”:正确,
“可枚举”:正确,
“可配置”:真
}

*/
使用点或括号符号指定属性值时,将使用对象的内部
[[Put]]
方法(请参阅)。ed 5中添加了defineProperties等方法,以提供灵活性,并具有不同于点和括号表示法的默认行为(否则您将使用点或括号表示法)。;-)好的,谢谢-这很有帮助-所以后来添加了defineProperties作为替代方案?那么,为什么MDN wiki将替代功能描述为默认功能而不是原始的点/括号符号呢?您可能在错误的上下文中使用了默认功能。通过赋值创建属性有默认行为,defineProperty有不同的默认行为。我想这在当时是有意义的,因为它通过赋值扩展了ECMAScript ed 3的创建行为。如果你从ES5开始,这可能没有多大意义规范的相关部分是描述内部
[[Put]]
方法的位:。MDN是一个任何人都可以参与的公共wiki,它不是权威性的(但非常有用)。它并不比任何其他部分更“不明显”:简单赋值使用PutValue,而PutValue调用内部Put方法(步骤4.b)。;-)公平地说,MDN并不是真正的规范——即使它是大多数人都会读到的唯一东西:-)对我来说,它是否以粗体字母表示“Writable.Defaults To false”等并不明显,而事实上只有三分之一的时间是正确的(如果你将点、括号和defineProperty的三种方法中的一种计算在内);-)请参阅我在OP上的评论,DefinitProperty/ies是后来添加的,因此赋予它不同的默认行为(至少对规范作者而言)是有意义的。