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

    xiaoxiao2023-11-24  161

    一道面试题

    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

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

    堆栈内存练习题

    题目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]

    画图是最好解决办法

    最新回复(0)