我知道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] = {});
似乎返回对带括号的表达式中初始化的关联数组的引用。
这确实是怎么回事?有没有更详细的解释?是否有理由这样做而不是更明显的事情,比如创建关联数组&#39; d&#39;然后将其设置为&#39; data [i]&#39;?
答案 0 :(得分:6)
是。行:
var d = (data[i] = {});
变量d
和data[i]
最终都会引用{}
创建的同一个空对象。
在JavaScript中,=
运算符都在左侧设置变量并返回正在设置的值。这意味着您可以在另一个表达式的中间执行赋值,可能使用括号来确保正确的操作顺序。
在您的示例中,括号是可选的 - 以下将具有相同的结果,因为=
的关联性是从右到左:
var d = data[i] = {};
另一个任意例子是在函数调用的参数中进行赋值:
alert(d = "hello");
或者在分配对象引用时,您可以使用结果对所涉及的对象进行操作:
var d;
(d = {}).prop1 = "test";
console.log(d.prop1); // prints "test"
答案 1 :(得分:2)
这只是一个简短的手 你的代码
var d = (data[i] = {})
等于
data[i] = {};
var d = data[i];
答案 2 :(得分:0)
它使代码更短,但更难以阅读。这是一个常见的黑客攻击。人们通常会尽量避免只使用一次的变量;特别是如果他们可以保持80行以下的字符。
var d = (data[i] = {});
相当于,
var d = {};
data[i] = d;
在其他语言中,您通常会看到类似这样的内容:
function(str) {
if (trimmed=str.trim()) {
console.log(trimmed);
}
}
答案 3 :(得分: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"}
是的,它确实返回了一个参考
答案 4 :(得分:0)
你对引用的看法是对的(括号中没有什么特别之处,只是赋值运算符返回最后赋值的内容,因此你可以为同一个东西设置多个值:x=y=3;
),但我想不到以这种方式编写代码的一个很好的理由。一点点的作业重新排序,你基本上有相同的东西,分成两行是微不足道的:
var d = {},data[i] = d;