<!-- HTML -->
<div id="target"></div>
// JavaScript
function MyObject() {}
var $my_div = $('#target'),
data;
$my_div.data('extra', (data = new MyObject()));
在JavaScript中,表达式例如: (data = new MyObject())
评估 MyObject 对象;而在C语言中,表达式的值始终为true
。
在上面的代码段中,(data = new MyObject())
仅用于执行与以下内容完全相同的快捷方式吗?
...
var $my_div = $('#target'),
data = new MyObject();
$my_div.data('extra', data);
澄清:
我最初不确定(data = new MyObject())
实际上做了什么。我想知道为什么不在它自己的行中分离该表达式,而不是在.data()
中进行。问题是在.data()
中单独表达或单独表达之间是否存在任何差异。
答案 0 :(得分:7)
在JavaScript中,表达式例如:
(data = new MyObject())
评估为MyObject
个对象;而在像C这样的语言中,表达式的值总是true
不,在C中就像在JavaScript中一样,类似表达式的结果是对MyObject
对象的引用。非null
对象引用虽然是真实的(在两种语言中)。
在语法上从B派生的所有语言(包括C,Java,JavaScript,C#和大约十二种语言),以及可能是其他家族的大多数语言,赋值表达式的结果是表达的右手边。 E.g:
a = b = c;
...表示“将c
的值分配给b
,然后再将其分配给a
,而不进行重新评估”。 不意味着“将c
分配给b
,然后将true
分配给a
”。我不知道它意味着什么语言(这并不意味着一个不存在)。在某些语言系列中,它表示“将b
与c
进行比较,并将该比较结果分配给a
”(不更改b
或c
),因为=
在这些语言中作为赋值运算符和作为比较运算符的双重任务取决于上下文,并且在该上下文中(右侧生产),它是一个比较运算符。 (BASIC语言就是这样。)
这不是回答,因为毫无疑问。但希望它有所帮助...
答案 1 :(得分:1)
大多数语言中的赋值运算符实际上都会分配赋值(=就像在JavaScript中一样)。例如,通常在C代码中看到类似下面的内容:
MyObject* config = NULL;
if (config = parse_config()) {
// config is not NULL
}
这只是一个特定语言如何解释某事的问题(例如,如果它将非NULL指针视为真)。有些(比如C#或Java)不需要你具体,比如:
MyObject config = null;
if ((config = ParseConfig() != null) {
// config is not null
}
然而,它似乎并不可读,因此很少有人愿意接受它。
关于你的问题,这些例子也是如此 - 没有找到隐藏的魔法:)