2013-07-16 36 views
1

如果您在JavaScript中評估1|0,2|0,您會收到2爲什麼1 | 0,2 | 0在JavaScript中等於2?

如果您評估1|0+','+2|0,您會收到1

我無法理解這一點。

+9

[逗號運算符(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator) – Andreas

+0

然後爲什麼它在第二個表達式中返回1? – Isaac

+4

第二個逗號是一個字符串文字,而不是操作符。 – Quentin

回答

11

二進制按位運算符(包括|)與加法運算符+的綁定較不緊密。因此

1|0+','+2|0 

真的

1|(0+','+2)|0 

這是

1|('0,2')|0 

這是

1|0|0 

這是1。 (字符串「0,2」被轉換成一個整數;作爲NaN,但因爲是NaN浮點概念時被迫是整數它變成0

編輯關於第一個表達式—,其中涉及JavaScript逗號運算符。逗號運算符允許一個單獨的,基本上獨立的(除了通過副作用之外的)表達式被「粘合在一起」成分析器將會識別爲單個表達式的列表。評估時,每個表達式將按照通常情況進行計算,但整體表達式的值只是列表中最後一個表達式的值。因此,1|0,2|0將首先導致1|0被評估,但該結果被丟棄,整體值僅爲2|0

逗號操作符是常見的是獲得來自C.他們的表達式語法許多語言(據我所知,C從別的地方得到它,它幾乎沒有一個革命性的概念。)因爲這種語言允許只是表達—一個表達式—出現在幾個有趣的語法情況中,並且因爲表達式可能(並且通常會)有副作用,所以有時能夠將幾個單獨的表達式嵌入語言真正只需要一個表達式的位置。也就是說,通常有更清潔和更好的方式來做事。在JavaScript中,我個人更喜歡使用立即調用的函數。由於性能方面的原因,它更加打字並可能稍差一點,但我認爲它更加清晰,因爲它允許爲臨時變量和更多涉及的邏輯提供獨立的名稱空間。

+0

這個答案是對第二種情況的一個很好的解釋,但沒有解釋第一種情況。可以添加嗎? –

+0

@PlatinumAzure哦,當然 - 我認爲第一個更明顯,但可能不適用於JavaScript和類似C語言的新手。 – Pointy

4

您需要查看operator precedence table以瞭解這一點。

表達式1|0,2|0與逗號運算符相比具有按位或更高的優先級,因此它相當於(1|0), (2|0)comma operator評估兩個操作數並返回第二個操作數,所以你得到的值爲(2|0)。該值爲2

表達式1|0+','+2|0具有比按位更高的優先級,或者相當於1|(0+','+2)|00+','+2的結果是「0,2」,它不是數字,所以它在數值運算中評估爲NaN。它被脅迫0在按位或,使葉片1|0|0,並且該結果爲1

+1

'「0,2」'沒有轉換爲'0',而是給出'NaN'。嘗試一下:'+(「0,2」)' –

+0

@MattiasBuelens至少在這個操作中它最終作爲'0' – Ian

+0

@Ian這是真的,但他的回答似乎表明它的計算結果爲'0',因爲它部分解析了「0,2」(直到','),而事實並非如此。 '''強制'NaN'(使'0,2'''數字''成'0'的結果)。 –

0

From MDN

逗號運算符它的兩個操作數(從左至右) 並返回第二個操作數的值。

因此,在1|0,2|0,第一兩個表達式1|02|0從左至右,然後返回最後一個表達式(2|0)的結果進行了評價。 1|0 === 12|0 === 2,所以最後一個表達式的結果是2,然後返回。

1|0+','+2|0中,逗號出現在與02連接的字符串文字中。整個事情被評估如下:

  1. (1 | ((0+',')+2)) | 0
  2. (1 | ('0,'+2))) | 0(數+字符串=字符串連接)
  3. (1 | '0,2') | 0(串+數=字符串連接)
  4. (1 | NaN) | 0(逐位OR需要多個操作數。 0,2未能轉換,改爲NaN
  5. 1 | 0(按位或只處理整數,所以浮點數NaN澆鑄到0
  6. 1
相關問題