首頁  >  問答  >  主體

javascript - JS中一個賦值的問題

javascript中的賦值我們都知道,是從右到左的

var a = b = c

上面的語句實際執行時是這樣的

b = c
var a = b

但是如果有物件參與進來呢?昨天看到的一個例子

var foo = { a: 2 }
var bar = foo 
foo.x = foo = { b:  3 }

前兩行很簡單,就是將bar也指向了foo。
第三行,剛開始是執行foo = { b: 3 },這樣將foo重新指向了另一個物件。

接下來的一句foo.x = foo,這句我本來以為是foo.x指向foo,這樣foo就成了一個循環引用自身的對象,即

foo = {
    b: 3,
    x: {
        b: 3,
        x: {
            b: 3,
            x: {
                ......
            }
        }
    }
}

但實際測試發現,foo.x = foo這句裡面的foo.x中的foo是指向bar,也就是還沒重新賦值的foo,有點不太理解,感覺應該是解析時候是從左到右右,但是實際執行會是從右到左這樣?

过去多啦不再A梦过去多啦不再A梦2711 天前661

全部回覆(9)我來回復

  • PHPz

    PHPz2017-05-18 10:53:04

    這個我剛剛看到了一個大神的講解挺好的(正在查資料核對),對象的連等賦值,大概解釋是這樣的:foo.x = foo = { b: 3 },在解釋器執行中先看foo.x 和foo是否已經創建如果未創建就創建它並且將他們都指向最右邊的對象,明顯foo創建了並且指向{ a: 2 },foo.x還未創建,於是創建它並且讓它指向null,此時bar和foo都指向{a:2,x:null},再將他們都指向右邊的物件{b:3},此時bar指向{a:2,x:{b:3} },foo指向{b:3};

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-18 10:53:04

    最近剛討論過這個問題,我們得出的結論是:foo.x 中的 foo 实际是对 { a: 2 } 的一個引用,但執行順序還是從右到左的,這點沒有疑問。

    var foo = { a: 2 }
    var bar = foo.a = 3
    console.log(bar) //3
    
    var foo1 = { a: 2}
    var bar1 = foo1.a
    foo1.a = 3
    console.log(bar1) //2

    回覆
    0
  • 漂亮男人

    漂亮男人2017-05-18 10:53:04

    賦值,是一個表達式,
    結合性從右往左,即a = b = ca = (b = c)a = b = ca = (b = c)
    返回值是,等号右边那个表达式的返回值,即 b = c 的返回值是c回傳值是,等號右邊那個表達式的回傳值,也就是 b = c 的回傳值是c的值。

    回覆
    0
  • 仅有的幸福

    仅有的幸福2017-05-18 10:53:04

    局部左到右(.),宏觀右到左(=)。此 foo 非彼 foo 。

    foo.x = foo = { b:  3 }

    讀到第二個 foo 時,已經從第一個 foo 取得了 { a: 2 } 的引用,等待給其 x 屬性賦值。

    回覆
    0
  • 滿天的星座

    滿天的星座2017-05-18 10:53:04

    賦值是從右到左的,但執行之前必然對代碼進行處理,foo.x = foo = { b: 3 },对属性的处理是按值进行的,即此时已经定位到了{ a: 2 }這個對象的實際存儲位置,對屬性x的賦值也是對實際對象的x屬性賦值,不管他是foo指向的對象,還是bar指向的對象。物件的賦值是改變該物件儲存的實際物件的位址,即修改了foo的指向。

    回覆
    0
  • 高洛峰

    高洛峰2017-05-18 10:53:04

    我覺得這種寫法沒什麼意義。
    在實際生產中,要是遇到很多這樣的程式碼,你能一眼明白嗎?
    就像現在,前面答題的,有多少能夠通俗的說明白?

    回覆
    0
  • 迷茫

    迷茫2017-05-18 10:53:04

    /a/11...

    回覆
    0
  • 怪我咯

    怪我咯2017-05-18 10:53:04

    var a=b=c;
    
    b=c;//c
    a=c;
    foo.x = foo = { b:  3 }
    
    foo = { b:  3 };//返回值为 { b : 3 } 的指针,下同
    foo.x = { b : 3 }的指针;

    但是實際上按順序執行上面三條語句,結果會有所不同,因為foo.x是在解析階段已經準備好的,所以實際上指向的是bar.x

    實際上的等價代碼

    foo.x = foo = { b:  3 }
    
    foo = { b:  3 };//{ b : 3 }
    bar.x = { b : 3 }的指针;

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-18 10:53:04

    可以使用指標來理解這個問題

    回覆
    0
  • 取消回覆