缓存对象项的完整路径然后将其用于分配是行不通的

Caching full path of an object item and then using it for assignation doesn't work

本文关键字:用于 分配 行不通 路径 对象 缓存 然后      更新时间:2023-09-26

我有一个对象,每次函数运行时,我想要切换其中一个项目的值。如果我在var中缓存完整的路径,它不会工作,只有当我省略该项并缓存没有它的路径时,它才会像我期望的那样工作。

var foo1 = function (identifier) { // Does not work
  var counting = some.object.with[identifier].counting;
  counting = (!counting) ? "bar" : false; // Switch values
};
var foo2 = function (identifier) { // Work!
  var identifier = some.object.with[identifier];
  identifier.counting = (!identifier.counting) ? "bar" : false;
};

知道为什么吗?

在示例一中,您将原始属性存储在变量中,然后仅替换该局部变量的值。

在示例二中,您正在存储对对象的引用,然后更新该对象的属性。

在第一个示例中,您抓取的是值,而不是对象字段的引用,因此实际上您只是更改了一个变量,而不是对象字段本身。

所以,一个简单的例子是:
var o = {a:1, b:2},
    v = o.a;
console.log(v); //outputs 1
v = 3;
console.log(v); //outputs 3
console.log(o); //outputs {a:1, b:2} - since o wasn't changed directly

此外,检查值是否为false并不是一个好的做法,除非您打算考虑undefined。也许用!!counting转换为布尔值更好?

这是因为在第二种情况下,您将对象的引用分配给identifier变量,因此您所做的任何更改都将更改被引用的对象。被引用对象的范围可能在函数foo2之外,因此对象和所做的任何更改在调用之间继续存在。