1
<!-- HTML -->
<div id="target"></div>

// JavaScript
function MyObject() {}

var $my_div = $('#target'),
    data;
$my_div.data('extra', (data = new MyObject()));

在 JavaScript 中,表达式 eg(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()问题是在做这个表达或单独做这个表达之间是否有任何区别。

4

2 回答 2

7

在 JavaScript 中,表达式 eg 的(data = new MyObject())计算结果为MyObjectobject;而在像 C 这样的语言中,表达式的值总是true

不,在 C 中就像在 JavaScript 中一样,类似表达式的结果是对MyObject对象的引用。不过,非null对象引用是真实的(在两种语言中)。

在所有从 B 语法派生的语言(包括 C、Java、JavaScript、C# 和其他十几种语言)以及可能来自其他家族的大多数语言中,赋值表达式的结果是该表达式的右侧。例如:

a = b = c;

...表示“分配cto的值b,然后将其再次分配给 toa而无需重新评估”。这并不意味着“分配cb,然后分配truea”。我不知道一种语言会意味着什么(这并不意味着不存在)。在某些语言系列中,它的意思是“比较并将比较bc结果分配给a”(不改变bor c),因为=在这些语言中作为赋值运算符和比较运算符,取决于上下文,并且在那个上下文中,它具有双重职责(右侧产生式),它是一个比较运算符。(BASIC 语言就是这样。)

这不是一个真正的答案,因为没有问题。但希望它有帮助...

于 2012-11-12T23:36:51.657 回答
1

大多数语言中的赋值运算符实际上计算为赋值的值(=就像在 JavaScript 中一样)。例如,在 C 代码中通常会看到类似下面的内容:

MyObject* config = NULL;
if (config = parse_config()) {
   // config is not NULL
}

这只是特定语言如何解释某些东西的问题(例如,如果它将非空指针视为真)。有些(如 C# 或 Java)不要求您具体说明,如:

MyObject config = null;
if ((config = ParseConfig() != null) {
   // config is not null
}

但是,它似乎不那么可读,所以很少有人使用它。

至于你的问题,这些例子也是如此——没有发现隐藏的魔法:)

于 2012-11-12T23:43:37.167 回答