javascript - 有没有一种简单的方法可以在 Javascript 中完全卡住对象及其子对象(Deep Freeze)?

标签 javascript arrays object ecmascript-6

通常你必须传递一个对象作为参数。访问这些对象的函数通过引用传递,并且可以更改原始对象。根据情况,这可能是不需要的结果。那么有没有办法卡住对象。我知道 Object.freeze()

但它不会影响其中的对象/数组。

例如

a = { arr: [1,2,3]}; 
Object.freeze(a);
a.arr.push(4); // still works

最佳答案

深度卡住所有可枚举属性(ES2015+):

// Recursively freeze an object
const deepFreeze = x => {
  Object.freeze(x)
  Object.values(x).forEach(deepFreeze)
}

如果你有循环引用:

// Recursively freeze an object with circular references
const deepFreeze = x => {
  Object.freeze(x)
  Object.values(x).filter(x => !Object.isFrozen(x)).forEach(deepFreeze)
}

如果您必须深度冷冻任何浅冷冻的东西(稍微慢一点):

// Recursively deep freeze an object with circular references
const deepFreeze = (x, frozen = []) => {
  if (frozen.includes(x)) return null
  frozen.push(x)
  Object.freeze(x)
  Object.values(x).forEach(x => deepFreeze(x, frozen))
}

tldr;双线:

const deepFreeze = (x, frozen = []) => frozen.includes(x) ||
  frozen.push(Object.freeze(x)) && Object.values(x).forEach(x => deepFreeze(x, frozen))

关于javascript - 有没有一种简单的方法可以在 Javascript 中完全卡住对象及其子对象(Deep Freeze)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56402309/

相关文章:

javascript - 带有 AJAX 多重选择的 Angular ui-select2 - 将最终选择值检索为 ids 而不是 json

javascript - Angular http json 请求问题

c - 当我遇到1时使用递归进行分段

arrays - 如何过滤数组以确保它确实包含另一个数组的位置

javascript - Crockford 的对象创建技术发生了什么?

c++ - 如何用OpenCV C++加载Yolo目标检测网络

javascript - 有没有办法在变量中存储对深层对象键的引用?

javascript - 当我向/api/users/login发送POST请求时,用户未定义

javascript - Reader onload 函数不向预定义数组添加分割线

c - 如何用随机数填充数组以使它们不同?