冷冻和密封之间的区别

2022-08-30 01:32:37

我刚刚听说过JavaScript方法和,它可以用来使任何对象不可变。freezeseal

下面是一个如何使用它的简短示例:

var o1 = {}, o2 = {};
Object.freeze(o2);

o1["a"] = "worked";
o2["a"] = "worked";

alert(o1["a"]);   //prints "worked"
alert(o2["a"]);   //prints "undefined"

和 有什么区别?他们能提高性能吗?freezeseal


答案 1

Object.seal

  • 它防止在密封对象中添加和/或删除属性;使用将返回 falsedelete
  • 它使每个现有属性都不可配置:它们不能从“数据描述符”转换为“访问器描述符”(反之亦然),并且根本不可以修改访问器描述符的属性(而数据描述符可以更改其属性,如果为真,则更改其属性)。writablevaluewriteable
  • 当尝试修改密封对象本身的值时可以抛出 (最常见于严格模式)TypeError)

Object.freeze

  • 确切地说,什么可以做到,加上:Object.seal
  • 它可以防止修改任何现有属性

两者都不会影响“深”/孙子对象。例如,如果被冻结,则无法重新分配,但可以修改 的值,例如 可以更改。objobj.elobj.elobj.el.id


性能:

密封或冻结对象可能会影响其枚举速度,具体取决于浏览器:

  • 火狐:枚举性能不受影响
  • IE:枚举性能影响可忽略不计
  • Chrome:对于密封或冻结的对象,枚举性能更快
  • Safari:密封或冻结对象的枚举速度慢 92%(截至 2014 年)

测试:密封物体冻结物体


答案 2

我写了一个测试项目,比较了这3种方法:

  • Object.freeze()
  • Object.seal()
  • Object.preventExtensions()

我的单元测试涵盖 CRUD 情况:

  • [C] 添加新属性
  • [R] 读取已存在属性
  • [U] 修改现有属性
  • [D] 删除已存在的属性

结果:

enter image description here