2011-09-22 162 views
23

我通過互聯網搜索,但無法找到相關的搜索條件,所以我認爲這將是最好的地方問。Javascript a = b = c陳述

我有一個JS聲明說

document.location.hash = this.slug = this.sliceHashFromHref(href) 

這是如何工作的?

+2

你是什麼意思「是如何工作的呢?」 – Jamiec

+3

查看[JavaScript的多個左手任務](http://stackoverflow.com/questions/1758576/multiple-left-hand-assignment-with-javascript)。 –

+1

@Jamiec:它工作得很好,謝謝你的詢問;) – Piskvor

回答

3

它得到的評估從右到左。的

this.sliceHashFromHref(href) 

document.location.hash = this.slug = this.sliceHashFromHref(href) 

輸出/值會被分配給document.location.hash = this.slug

+1

我的意思是沒有冒犯,但我覺得,如果@ aioobe的答案應該被接受,因爲它已被社區投票選出更好,更多的是通過和(在我看來)更好地解釋它。如果這是錯誤的,我很抱歉。 –

46

這是如何工作的?

a = b可以看作是既語句表達

該表達式的結果是b

換句話說,

a = b = c; 

其可以被寫爲

a = (b = c); 

相當於

b = c; 
a = b; 

因此代碼等同於:

this.slug = this.sliceHashFromHref(href); 
document.location.hash = this.slug; 
+0

如果表達式'a = b'的結果是'b',那麼表達式'a =(b = c)'應該等於'b = C; a = c;'(但這並不意味着'a = b = foo()'會調用'foo'兩次!)。我想知道'a = b = c'會在'a','b'和'c'具有getter和setter的情況下運行。 'c'的getter將被調用一次,然後調用'b'的setter將調用'b'的getter來獲取'a'的setter的值? – Oren

5

很容易...它從呼叫分配結果this.sliceHashFromHref(href)document.location.hashthis.slug,所以這兩個屬性(變量)在該行執行後包含相同的值。

4

在Javascript中(以及其他幾種從C中派生出它們的語法的語言),賦值會將該項目評估爲=符號的右側並將其分配給左側的變量。右側的項目本身可以是帶有=運算符的賦值。發生的是最右邊的表達式被評估,賦值給中間變量的值,然後該值被分配給左邊的變量。

簡而言之,它只是一種將值分配給多個變量的方法。

8

注意變量範圍!

var A = B = C = 3; //A is local variable while B & C are global variables; 
var A = 3 , B = 3, C = 3;// A B C are local variables; 
+0

這是如此重要,但大多數答案只是忽略了他們...... – Martian2049

-1

其實馬赫雷斯的答案在這裏非常重要。也是這個答案指此類似question: 這個問題涉及到的幾件事情:

  1. 葫蘆:變量塊代碼執行之前懸掛;
  2. =賦值順序:它從右到左;全局上下文:在非嚴格模式下,當一個變量未被定義時,它進入全局上下文;但會拋出'嚴格使用'模式;

例1:

;(function Anonymous(){ 
    var a = b = {}; 
    console.log(a==b); //true 
})(); 
  1. aAnonymous執行範圍被懸掛。

  2. b將被分配爲{},但由於b沒有定義,b被分配到全局上下文window,然後window.b分配{};然後window.b = {}return s {}

  3. 局部變量a被分配爲{}。

因此,一些有趣的事情發生在這裏:在local variable aglobal variable b都指向同一個對象{},所以他們=====;請記住{}=={}否則會給出false

注:如果在嚴格模式:

;(function Anonymous(){ 
    'use strict' 
    var a = b = {}; //Uncaught ReferenceError: b is not defined 
})(); 

這種連續作業將不會工作以同樣的方式...