Javascript中带括号的表达式是否返回引用
Does a parenthesized expression in Javascript return a reference?
我知道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]"?
是。带线:
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"
这只是一只短手
您的代码
var d = (data[i] = {})
等于
data[i] = {};
var d = data[i];
它使代码更短,但更难阅读。这是一个常见的黑客攻击。人们通常会尽量避免使用只会使用一次的变量;尤其是如果他们能把台词控制在80个字符以下的话。
var d = (data[i] = {});
相当于,
var d = {};
data[i] = d;
在其他语言中,你通常会看到这样的东西:
function(str) {
if (trimmed=str.trim()) {
console.log(trimmed);
}
}
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"}
所以是的,它确实返回了一个引用
您对引用的看法是正确的(括号没有什么特别之处,只是赋值运算符返回上次赋值的内容,这样您就可以将多个值设置为同一个值:x=y=3;
),但我想不出有什么好的理由用这种方式编写代码。对分配进行一点重新排序,您基本上拥有相同的东西,并且将其拆分为两行是微不足道的:
var d = {},data[i] = d;
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 是否有任何Javascript函数从指定的索引中进行正则表达式匹配
- 尝试使用Javascript正则表达式来获取“&"分隔文本,无论它是否's是最后一个值
- 是否可以扩展正则表达式元字符的范围
- 是否存在将String转换为可执行的c++表达式的方法
- Webpack:是否可以在编译时评估javascript表达式
- 确定 JavaScript 代码是否为表达式
- 验证数字是否在0.00到20.00之间的正则表达式
- 如何在javascript中测试字符串是否包含带正则表达式的数字
- JavaScript:是否有完全支持查找的正则表达式库
- 在Polymer中,双向绑定与属性表达式是否可能
- Javascript正则表达式,用于检查字符串是否为有效数字
- Go中是否存在与此JS表达式等效的表达式
- 是否可以在自定义指令中使用理解表达式
- 由表达式文本创建的正则表达式是否共享单个实例
- 如何检测正则表达式是否有任何匹配项
- 这个JavaScript正则表达式是否替换空格
- Javascript中带括号的表达式是否返回引用
- 对象数据源的AngularJS ngOptions表达式-是否可以将属性键存储在某个位置
- 如何在脚本中识别正则表达式是否为空