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

// JavaScript
function MyObject() {}

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

JavaScript では、式 egはMyObjectオブジェクト(data = new 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())評価されます。MyObject一方、C のような言語では、式の値は常にtrue

いいえ、C でも JavaScript と同様に、同様の式の結果はMyObjectオブジェクトへの参照です。ただし、非nullオブジェクト参照は真実です (両方の言語で)。

B から構文的に派生したすべての言語 (C、Java、JavaScript、C#、およびその他の約 12 を含む)、およびおそらく他のファミリのほとんどの言語では、代入式の結果はその式の右辺になります。例えば:

a = b = c;

...は、「 の値をcに代入し、再評価せずbに に再度代入する」ことを意味します。「に割り当ててからに割り当てる」という意味aではありませ。それが意味する言語を私は知りません(存在しないという意味ではありません)。一部の言語ファミリーでは、「と比較し、その比較の結果を」に代入することを意味します ( orを変更せずに)。これらの言語では、コンテキストに応じて代入演算子と比較演算子の両方として、およびそのコンテキストで二重の役割を果たします。 (右側の生成)、比較演算子です。(BASIC 言語はそのようなものです。)cbtrueabcabc=

質問がないため、これは実際には答えではありません。しかし、うまくいけばそれは役に立ちます...

于 2012-11-12T23:36:51.657 に答える
1

ほとんどの言語の代入演算子は、実際には代入の値に評価されます (= JavaScript のように)。たとえば、C コードでは次のようなものがよく見られます。

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

特定の言語が何かをどのように解釈するかの問題です (たとえば、非 NULL ポインターを true として扱う場合)。一部 (C# や Java など) は、次のように具体的にする必要がありません。

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

ただし、読みにくいように見えるため、使用する人はほとんどいません。

あなたの質問に関しては、例は同じことをします-隠された魔法は見つかりません:)

于 2012-11-12T23:43:37.167 に答える