Skip to content

一道题目看堆栈内存的演变 #19

@itstrive

Description

@itstrive

说明: 图画的很糙,大家明白意思就好,还有引用赋值是不是这样的,大家可以提出自己的意见和论证。

题目是这样的

var a = {n:1};
var b = a;
a.x = a = {n:2};

console.log(a.x); //undefined
console.log(b.x); //{n:2}

接下来看下内存堆栈的演变

  • 当经过
var a = {n:1};

image

  • 当经过
var a = {n:1};
var b = a;

image

  • 最后一句代码很关键,发生挺多事情

为了理解最后一句,先看下我总结的(自己瞎写的,无从考证),不成文的规定

比如 var a = b = c = d =1; 像这样的、栈里面的赋值是从右向左赋值的(栈是后进先出)
但是如果是引用对象,比如: var a = b = c = d = {n:123} 就是从左往右赋值的(引用是标记)。
一个不成文的约定,记住暂时。

所以上述最后一句代码,咱们可以拆成:

a.x = {n:2} 
a = {n:2}
  • 当经过 a.x = {n:2}

image

  • 最后经过 a = {n:2}, 把 a的指向换成了新的

image

Metadata

Metadata

Assignees

No one assigned

    Labels

    articlesmall articlejsAbout Js something

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions