为什么 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/