浅分析js运行机制(堆栈内存面试题)

一道面试题

var a=12;
var b=a;
b=13;
console.log(a);//12
var obj1={n:100};
var obj2=obj1;
obj2.n=200;
console.log(obj1.n);//200 变了 why????
  • 1 当浏览器内核/引擎渲染js时候会提供一个js代码运行环境。称之为全局作用域(global/window scope)
  • 2 代码自上而下执行(之前还有一个变量提升阶段)

=>基本数据类型的值会存储在当前作用域下
var a=12;
1)首先开辟一个空间,存储12
2)在当前作用域中声明一个变量a
3)让声明的变量和存储的12进行关联,把存储的12赋值给a
(赋值操作叫做定义)
基本数据类型值(也叫做值类型,是按照值来操作的:把原有的值复制一份放在新的空间或位置上,和原来的值没有关系 b=a

浅分析js运行机制(堆栈内存面试题)_第1张图片

=>引用类数据类型的值不能直接存储到当前的作用域下(因为可能存储的内容过于复杂),我们需要先开辟一个新的空间(理解为仓库),把内容存储到这个空间中
var obj1={n:100};
1)首先开辟一个新的内存空间,把对象中的键值对依次存储起来(为了保证后面可以找到这个空间,此空间有一个16进制地址)
2)声明一个变量
3)让变量和空间地址关联在一起(把空间地址赋值给变量)
引用类型不是按照值来操作,它操作的是空间引用地址,把原来空间地址赋值给新的变量,但是原来的空间没有被克隆,还是一个空间,这样就会出现多个变量关联相同的空间,相互之间就会存在影响

浅分析js运行机制(堆栈内存面试题)_第2张图片

堆栈内存练习题

题目1(易错)
var obj={
   n:10;
   m:obj.n*10
};
console.log(obj.m);

=>TypeError

  • 1 形成一个全局作用域(栈内存)
  • 2 代码自上而下执行
    1)首先开辟一个新的堆内存(AAAFFF1111),把键值对存储到堆内存中
    n:10
    m:obj.n*10 =>obj.n此时堆内存信息还没有存储完成,空间地址还没有给obj,此时的obj是undefined obj.n=>undefined.n undefined是基本数据类型,没有属性不能这么操作。
    【如何解决?】
var obj={
    n=10;
    }
obj.m=obj.n*10//先让obj和空间建立联系再设m
console.log(obj.m);=>100
题目2(易错)
var ary1=[3,4];
var ary2=ary1;
ary2[0]=1;
ary2=[4,5];
ary2[1]=2;
ary1[1]=0;
console.log(ary1,ary2);=>[1,0],[4,2]

画图是最好解决办法
浅分析js运行机制(堆栈内存面试题)_第3张图片

你可能感兴趣的:(js基础知识)