4

我知道 Javascript 中的括号表达式返回计算括号中表达式的结果:

x = ( 1, 2, 3 );

将评估上面的三个表达式,并返回最后一个表达式的结果:'3',如其他一些帖子中所述。

以下来自SlickGrid的示例代码包含一些我不太确定我理解的内容:

  $(function () {
    for (var i = 0; i < 500; i++) {
      var d = (data[i] = {});
      d["title"] = "Record " + i;
      d["n1"] = Math.round(Math.random() * 10);
      d["n2"] = Math.round(Math.random() * 10);
      d["n3"] = Math.round(Math.random() * 10);
      d["n4"] = Math.round(Math.random() * 10);
      d["n5"] = Math.round(Math.random() * 10);
    }
    grid = new Slick.Grid("#myGrid", data, columns, options);
  })

特别是表达式:

var d = (data[i] = {});

似乎返回对在括号表达式中初始化的关联数组的引用。

真的是这样吗?对此有更详细的解释吗?是否有理由这样做而不是更明显的事情,例如创建关联数组'd',然后将其设置为'data [i]'?

4

5 回答 5

6

是的。随着线:

var d = (data[i] = {});

变量danddata[i]最终都会引用由 . 创建的同一个空对象{}

在 JavaScript 中,=运算符既设置左侧的变量,又返回设置的值。这意味着您可以在另一个表达式的中间进行赋值,可能带有括号以确保正确的操作顺序。

在您的示例中,括号是可选的 - 以下将具有相同的结果,因为 的关联性=是从右到左:

var d = data[i] = {};

另一个任意示例是在函数调用的参数中进行赋值:

alert(d = "hello");

或者在分配对象引用时,您可以使用结果对所涉及的对象进行操作:

var d;
(d = {}).prop1 = "test";
console.log(d.prop1);   // prints "test"
于 2013-08-07T07:37:58.617 回答
2

这只是一个短手。
你的代码

var d = (data[i] = {})

等于

 data[i] = {};
 var d = data[i];
于 2013-08-07T07:39:06.203 回答
0

它使代码更短,但更难阅读。这是一个常见的黑客行为。人们通常会尽量避免只使用一次的变量;特别是如果他们可以将行保持在 80ish 字符以下。

var d = (data[i] = {});

相当于,

var d = {};
data[i] = d;

在其他语言中,您通常会看到如下内容:

function(str) {
    if (trimmed=str.trim()) {
        console.log(trimmed);
    }
}
于 2013-08-07T07:40:28.323 回答
0

是的,它确实尝试以下代码

var theObject={a:"hhelo",b:"no"}
hello={{a:"blah"},theObject}
console.log(hello)
//Object {a: "hhelo", b: "no"}
hello.a="b";
console.log(theObject)
//Object {a: "b", b: "no"}

所以是的,它确实返回了一个参考

于 2013-08-07T07:41:12.960 回答
0

您对引用是正确的(括号没有什么特别之处,只是赋值运算符返回上次分配的内容,因此您可以为同一事物设置多个值:)x=y=3;,但我想不出一个很好的理由来编写代码方法。对分配进行一点重新排序,您基本上拥有相同的东西,并且分成两行是微不足道的:

var d = {},data[i] = d;

于 2013-08-07T07:43:57.770 回答