变量和对象在内存中如何存储?
2018-01-23 16:52
232 查看
两个面试题:
答案:
做对了吗?
下面分别分析这两个面试题:
1.javascript是单线程的,自上而下有序执行
2.javascript执行代码前,将变量,函数,参数提取出来,进行预加载处理(函数声明优先于变量声明。)
第一题:
考虑:a函数永远不被调用?
答案是:如果先调用的话,是可以调用的.因为在预加载时,函数声明优先级高,a此时存储着a函数的地址,指向a函数.(number和地址,我们选择地址)
但是为什么在这个面试题中无法调用,a is not a function.
原因是:变量赋值时,a变量存储number10,已经不再指向函数,并且这个函数被销毁.
图解:
第二题:
考虑:连等的情况是指向同一个地址内存.
a.x 与 a 都指向{n: 2}对象的内存地址.
所以输出b.x可以输出{n:2},本质上是x属性存储的是object2的地址.(见下图)
图解:
var a = 10; function a(){ console.log(a); }; a();
var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b.x); console.log(a); console.log(b);
答案:
做对了吗?
下面分别分析这两个面试题:
1.javascript是单线程的,自上而下有序执行
2.javascript执行代码前,将变量,函数,参数提取出来,进行预加载处理(函数声明优先于变量声明。)
//预加载: var a; var a = function(){ console.log(a); }; //执行 //a = 10; //a();
第一题:
考虑:a函数永远不被调用?
答案是:如果先调用的话,是可以调用的.因为在预加载时,函数声明优先级高,a此时存储着a函数的地址,指向a函数.(number和地址,我们选择地址)
但是为什么在这个面试题中无法调用,a is not a function.
原因是:变量赋值时,a变量存储number10,已经不再指向函数,并且这个函数被销毁.
图解:
var a; var b; a = {n: 1}; b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b.x); console.log(a); console.log(b);
第二题:
考虑:连等的情况是指向同一个地址内存.
a.x 与 a 都指向{n: 2}对象的内存地址.
所以输出b.x可以输出{n:2},本质上是x属性存储的是object2的地址.(见下图)
图解:
相关文章推荐
- JVM学习(2)-Java常量,变量,对象(字面量)在内存中的存储位置
- 简述c++中string对象的内存分配策略?如何获得其可存储的最大字节
- 对象在内存中是如何存储的(内存五大区域和类加载)
- 【Java】运行时Java对象在内存中是如何存储的?
- Java对象在内存中是如何存储的
- Java中变量,对象,字符串等在内存中的存储区域
- 变量和数据是如何存储在内存中
- java中如何理解多个对象共享同一个静态成员变量(多个实例的static变量会共享同一块内存区域)
- 存储过程函数中如何定义表变量,删除表变量内容
- 如何获取float变量在内存中的二进制数据?
- 如何查看类对象数组中类成员变量的全部值,类成员变量也是数组。
- JAVA内存使用--如何计算一个Java对象占用的字节数
- 小example说明java的值传递和引用传递,基础变量和对象在内存里的区别,堆栈
- java中变量、对象的存储
- 对象之间如何赋值才有各自独立的内存空间
- c++变量在内存中的存储区域(转)
- 如何计算java对象占用的内存
- C语言变量存储区域 进程内存布局
- 内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)
- HashSet存储自定义对象如何保证唯一性