javascript - 使 Object.freeze() 静默失败的原因是什么?

标签 javascript json object ecma

为什么 Object.freeze(obj)obj 发生突变时悄无声息失败?

当一个不可变对象(immutable对象)发生变化时,抛出错误不是更符合逻辑吗?然后,用户可以自行决定是否要在他的 Object.freeze(obj) 周围包装一个 try catch。类似于我们需要用 try catch 包装 JSON.parse() 以避免出现空字符串或格式错误的 JSON 错误。

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

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

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

最佳答案

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 .

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

关于try/catch的注意事项

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

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

关于javascript - 使 Object.freeze() 静默失败的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42574788/

相关文章:

javascript - 未捕获的语法错误 : Unexpected token ILLEGAL onclick mvc

mysql - 如何使用 MySQL 查询创建和插入 JSON 对象?

json - Swift JSON 解析 - 无法访问字段/返回 nil

Java 2 相等对象并更改其中之一

javascript - Node 中setTimeout的性能?

javascript - 不要在顺序链接的 Promise 中包含 q Promise 结果

javascript - $ (".navbar.navbar-inverse").click() 有效,但 $ (".navbar .navbar-inverse").click() 无效?

java - 如何在 Java(服务器端)中对 JSONArray 中的 JSONObject 进行排序?

c++ - 无法编译 C++ 代码 : invalid conversion from 'Node*' to 'int'

javascript - 如何通过变量的值访问对象