一個js面試題的分析

網上看到「葉小釵」的一篇面試文章,裏面談到了一個js的面試題,本身作着試了下,全錯!因而根據結果,反推了下緣由。html

題目:java

var a = {n: 1};var b = a;
a.x = a = {n: 2}
console.log(a.x);
console.log(b.x)

這裏面至少考了2個點:面試

一、js的引用類型數據spa

二、運算符優先級code

對於一個老手來講,這裏的坑主要在第二條,運算符優先級。htm

a.x = a = {n: 2}

2個等號,優先級相同,就先來後到,從左到右,等效於blog

a.x={n:2};
a={n:2};

爲何不能等效於get

a.x=a;
a={n:2};

我的這麼分析console

js在執行賦值語句時,class

若是等號右邊是單個變量或者常量,直接執行賦值語句

若是是表達式,就看運算符優先級,若是優先級高於賦值語句,好比加法、減法等,就等高優先級運算以後,將結果賦值

若是又是一個賦值語句,那麼優先級並不比本身高,就不能讓它先計算,而是本身先往右繼續尋找,直到找到一個獨立的常量或者變量。

在這個例子中

a.x = a = {n: 2}

js引擎,不會把a直接賦值給a.x,由於a不是獨立的,它從屬於另一個賦值語句,且是它的主體

a = {n: 2}

這個賦值語句,計算優先級和本身相同,先來後到,那麼這個賦值語句就不能執行,本身仍是繼續往右找:a不能賦值,=是運算符,更不可能,繼續往右,就是

{n: 2}

它是一個正真獨立的常量,因此第一個等號就賦值成它,也就是

a.x={n:2};

的出處,執行完第一個賦值語句,再執行第二個

a = {n: 2}

第二個比較直接就沒什麼好說的了

因此,源代碼中

a.x = a = {n: 2}

改爲

a.x = (a = {n: 2})

運算結果也仍是不變

原文:http://www.cnblogs.com/yexiaochai/p/4366051.html

相關文章
相關標籤/搜索