Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Object.defineProperty是否检查属性是否已定义?_Javascript_Json_Object_Properties - Fatal编程技术网

Javascript Object.defineProperty是否检查属性是否已定义?

Javascript Object.defineProperty是否检查属性是否已定义?,javascript,json,object,properties,Javascript,Json,Object,Properties,我需要为javascript对象定义属性。 var obj={} obj['prop1']=1 通过上面的方法,我们可以定义属性。 现在,让我们使用Object.defineProperty var obj={} Object.defineProperty(obj,'prop1',{value:1}) 这是另一种方式。 两者之间有什么区别? Object.defineProperty是否检查属性是否已定义?? 我相信obj['prop1']=1会检查属性 谢谢:) 编辑 这两者之间有性能差


我需要为javascript对象定义属性。
var obj={}
obj['prop1']=1


通过上面的方法,我们可以定义属性。
现在,让我们使用
Object.defineProperty

var obj={}
Object.defineProperty(obj,'prop1',{value:1})
这是另一种方式。

两者之间有什么区别?
Object.defineProperty
是否检查属性是否已定义??
我相信
obj['prop1']=1
会检查属性
谢谢:)

编辑

这两者之间有性能差异吗

既不是直接对象访问,也不是
对象。defineProperty
将“检查”现有属性。这两者之间的唯一区别是修改属性描述符值的可能性

属性描述符是

  • 可枚举
  • 可配置
  • 可写
通过使用直接属性访问将所有设置为
true
。使用
Object.defineProperty
可以单独设置这些属性。我建议你读一下这封信,了解一下它的意思

例如,如果某个属性拥有标志
configurable=false
,则您无法覆盖或删除它(您的问题可能就是这种情况)


关于业绩:

由于
Object.defineProperty
是一个每次都需要执行的函数,因此它必须比直接访问对象慢。我创建了这个小基准:

但是,即使差异看起来很大,您也可能不会忘记
对象的值和原因。defineProperty

Mozilla:

当属性已经存在时,Object.defineProperty()会尝试根据描述符中的值和对象的当前配置修改属性。如果旧描述符的可配置属性设置为false(该属性被称为“不可配置”),那么除了可写属性外,其他属性都不能更改。在这种情况下,也不可能在数据和访问器属性类型之间来回切换

如果属性不可配置,则其可写属性只能更改为false

除非当前值和新值相同,否则尝试更改不可配置的属性属性(除可写属性外)时会引发TypeError


在这两种情况下,如果属性存在,它的值将被覆盖,否则它将被创建。

@DisplayName:我添加了一个新的部分。@jAndy虽然MDN是一个很好的例子,但语言功能的最终参考是。@RobG:我想这在很大程度上取决于情况。ECMA参考是以非常正式和规范的方式编写的,而MDN以更自然的方式读取。在本例中,MDN足以解释事物的本质,但如果您正在寻找真正的规范交易,我同意。