Javascript 使Object.freeze()以静默方式失败的原因是什么?

Javascript 使Object.freeze()以静默方式失败的原因是什么?,javascript,json,object,ecma,Javascript,Json,Object,Ecma,为什么Object.freeze(obj)在obj发生变异时会自动失败 当一个不可变的对象发生变异时,抛出比出错更合乎逻辑吗?然后,如果用户希望在其对象.freeze(obj)周围包装一个try-catch,则由用户自行决定。类似于我们需要用try catch包装JSON.parse()以避免出现空字符串或格式错误的JSON错误 我希望社会人士能发表意见 在回答和评论较少后进行编辑: 可以理解,Object.freezed()在严格模式下抛出错误。但是为什么该方法必须在非严格模式下以静默方式失败

为什么
Object.freeze(obj)
obj
发生变异时会自动失败

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

我希望社会人士能发表意见

在回答和评论较少后进行编辑:


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

我认为这就是修改冻结对象以静默方式失败的原因

若抛出错误,代码的执行将停止。抓住 语句可用于处理错误。可以用try吗 并为代码中的每一行捕获语句以避免错误? 我想没有

1。在代码中不必要地使用
try
catch

假设一个对象在控制流中的某个点被冻结。代码中可能有许多行试图添加新属性或修改冻结对象中现有属性的值。在此场景中,如果抛出错误,则需要在所有这些代码行中添加
try
catch

2。可以冻结任意数量的对象

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

对象将代码的每一行括起来。在严格模式下,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>
obj.test=false
//TypeError:无法分配给对象“#”的只读属性“test”
删除属性会引发:

obj.test = false
// TypeError: Cannot assign to read only property 'test' of object '#<Object>'
delete obj.test
TypeError: Cannot delete property 'test' of #<Object>
删除obj.test
TypeError:无法删除的属性“test”#
如果想更详细地了解严格模式(强烈推荐),请查看

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

关于
try/catch

只需检查从MDN获取的对象温度,就可以避免在
try/catch
块中包装属性操作“任何尝试都将失败,要么以静默方式失败,要么抛出TypeError异常(在严格模式下最常见,但并非唯一)。”MDN链接:您的问题与此链接的描述部分不同步。问题的目的是理解为什么当它是不可变的时,它会自动失败,如果可能的话,还有任何适用的用例。可以理解,它在严格模式下抛出错误。Object.freeze将只冻结一个对象。也就是说,不能更改冻结对象内特性的值。如果您试图更改该值,那么它将以静默方式失败。但你的问题是“Object.freeze(obj)是失败的”在我的理解中,被冻结的对象可能是全局不可变常量,开发人员知道它们是什么。仅对每个对象使用
Object.freezed()
是一种糟糕的做法,在每一行中都使用
Object.isfreezed()
Object.freeze()
类似于ES6中的
const
。开发人员知道对象是一个全局常量,不应该更改,但是如果他仍然试图绕过规则,他应该会得到一个错误。这不是对每个变量/对象使用
const
object.freezed()
,并检查它是否可变的情况。这个问题的目的是理解在非严格模式下无声失败的必要性。我不认为有“必要性”——这个决定很可能是基于人体工程学。正如你自己所说,在任何地方使用
Object.isfreeze()
都是不可行的,因此让操作无声地失败更符合人体工程学。比如说
Object.freeze()
在非严格模式下抛出错误,开发人员不会使用它来冻结每个对象。如果他愿意,那就由他自己决定。翻译人员应负责对错误代码发出警报。您不希望重新分配
const
变量并使其保持不变。请注意,在严格模式下是否调用
Object.freeze()
并不重要