使Object.freeze()无声地失败的原因是什么?

时间:2017-03-03 09:12:40

标签: javascript json object ecma

Object.freeze(obj)发生变异时,为什么obj失败无声

当不可变对象发生变异时,抛出比错误更合乎逻辑?然后,如果用户希望在try catch周围包裹Object.freeze(obj),则由用户自行决定。类似于我们需要使用JSON.parse()包裹try catch以避免空字符串或格式错误的JSON错误。

我希望社区能够发表评论。

在几个答案和评论之后编辑:

据了解,Object.frozen()在严格模式下抛出错误。但是为什么该方法必须以非严格模式静默失败?

2 个答案:

答案 0 :(得分:3)

Object.freeze()以严格模式抛出。

在严格模式下,只要在冻结对象上添加,变异或删除属性,以下程序就会抛出。

假设我们有

'use strict'

const obj = Object.freeze({ test: true })

添加属性时出错:

obj.other = true
// TypeError: Can't add property another, object is not extensible

变异现有属性抛出:

obj.test = false
// TypeError: Cannot assign to read only property 'test' of object '#<Object>'

删除属性会抛出:

delete obj.test
TypeError: Cannot delete property 'test' of #<Object>

如果想更详细地了解严格模式(强烈推荐),请查看official MDN docs for the differences

关于这个主题的意见各不相同 - 人们会期望投掷对象的突变,因为&#34;你正在做一些你不该做的事情&#34; 而其他人可能会说如果你Object.freeze()某事,您只想阻止对它进行任何修改。而且你成功地完成了。如果它导致应用程序崩溃崩溃,那么程序员别无选择,只能检查他们没有创建的所有对象,或者他们必须将所有这些操作包装在try/catch块中。这太简单了。

关于try/catch

的说明

只需检查对象的温度,就可以避免在try/catch块中包装属性操作:

if (Object.isFrozen(obj) {
  // Can't touch this!
}

答案 1 :(得分:-1)

我认为这就是为什么修改冻结对象会无声地失败,

  

如果抛出错误,代码的执行将停止。试着抓住   语句可用于处理错误。可以使用试试   并为代码中的每一行捕获语句以避免错误?   我认为没有

<强> 1。在代码中不必要地使用trycatch

假设一个对象在控制流中的某个点被冻结。代码中可能有许多行尝试添加新属性或修改冻结对象中现有属性的值。在这种情况下,如果抛出错误,则需要在所有这些代码行中添加trycatch块。

<强> 2。任何数量的对象都可以冻结

假设有多个对象被冻结。这将增加对更多trycatch语句的需求。这可能导致使用trycatch

封闭代码的每一行