3

为什么在突变时Object.freeze(obj)默默地失败?obj

当不可变对象发生变异时,抛出比错误更合乎逻辑吗?然后,如果他想将 a 包裹try catch在他的Object.freeze(obj). 类似于我们需要如何包装JSON.parse()try catch避免空字符串或格式错误的 JSON 的错误。

我希望社区可以发表评论。

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

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

4

2 回答 2

5

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>

如果想更详细地了解严格模式(强烈推荐),请查看官方 MDN 文档以了解差异

关于这个话题的观点各不相同——人们会期望对象的突变会抛出,因为“你正在做你不应该做的事情”,而其他人可能会说如果你Object.freeze()做某事,你只是想防止对其进行任何修改。并且你成功地完成了。如果它导致应用程序因突变而崩溃,程序员将别无选择,只能检查他们没有创建的所有对象try/catch的冻结性,或者他们必须将所有此类操作包装在块中。这简直是​​太过分了。

注意事项try/catch

try/catch您可以通过检查对象的温度来避免将属性操作包装在块中:

if (Object.isFrozen(obj) {
  // Can't touch this!
}
于 2017-03-03T12:00:50.290 回答
-2

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

如果抛出错误,代码的执行将停止。可以使用 Try 和 catch 语句来处理错误。可以对代码中的每一行使用 try 和 catch 语句来避免错误吗?我想不是

1.代码中不必要的trycatch块的使用

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

2.可以冻结任意数量的物体

假设不止一个对象被冻结。这将增加对更多trycatch语句的需求。它可能会导致将代码的每一行都用一个trycatch块括起来

于 2017-03-03T09:35:23.923 回答