我通過互聯網搜索,但無法找到相關的搜索條件,所以我認爲這將是最好的地方問。Javascript a = b = c陳述
我有一個JS聲明說
document.location.hash = this.slug = this.sliceHashFromHref(href)
這是如何工作的?
我通過互聯網搜索,但無法找到相關的搜索條件,所以我認爲這將是最好的地方問。Javascript a = b = c陳述
我有一個JS聲明說
document.location.hash = this.slug = this.sliceHashFromHref(href)
這是如何工作的?
它得到的評估從右到左。的
this.sliceHashFromHref(href)
即
document.location.hash = this.slug = this.sliceHashFromHref(href)
輸出/值會被分配給document.location.hash = this.slug
我的意思是沒有冒犯,但我覺得,如果@ aioobe的答案應該被接受,因爲它已被社區投票選出更好,更多的是通過和(在我看來)更好地解釋它。如果這是錯誤的,我很抱歉。 –
這是如何工作的?
a = b
可以看作是既語句和表達。
該表達式的結果是b
。
換句話說,
a = b = c;
其可以被寫爲
a = (b = c);
相當於
b = c;
a = b;
因此代碼等同於:
this.slug = this.sliceHashFromHref(href);
document.location.hash = this.slug;
如果表達式'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
很容易...它從呼叫分配結果this.sliceHashFromHref(href)
既document.location.hash
和this.slug
,所以這兩個屬性(變量)在該行執行後包含相同的值。
在Javascript中(以及其他幾種從C中派生出它們的語法的語言),賦值會將該項目評估爲=符號的右側並將其分配給左側的變量。右側的項目本身可以是帶有=運算符的賦值。發生的是最右邊的表達式被評估,賦值給中間變量的值,然後該值被分配給左邊的變量。
簡而言之,它只是一種將值分配給多個變量的方法。
注意變量範圍!
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;
這是如此重要,但大多數答案只是忽略了他們...... – Martian2049
其實馬赫雷斯的答案在這裏非常重要。也是這個答案指此類似question: 這個問題涉及到的幾件事情:
=
賦值順序:它從右到左;全局上下文:在非嚴格模式下,當一個變量未被定義時,它進入全局上下文;但會拋出'嚴格使用'模式;例1:
;(function Anonymous(){
var a = b = {};
console.log(a==b); //true
})();
a
在Anonymous
執行範圍被懸掛。
b
將被分配爲{}
,但由於b
沒有定義,b
被分配到全局上下文window
,然後window.b
分配{}
;然後window.b = {}
return
s {}
。
局部變量a
被分配爲{}。
因此,一些有趣的事情發生在這裏:在local variable a
和global variable b
都指向同一個對象{}
,所以他們==
和===
;請記住{}=={}
否則會給出false
。
注:如果在嚴格模式:
;(function Anonymous(){
'use strict'
var a = b = {}; //Uncaught ReferenceError: b is not defined
})();
這種連續作業將不會工作以同樣的方式...
你是什麼意思「是如何工作的呢?」 – Jamiec
查看[JavaScript的多個左手任務](http://stackoverflow.com/questions/1758576/multiple-left-hand-assignment-with-javascript)。 –
@Jamiec:它工作得很好,謝謝你的詢問;) – Piskvor