内存管理与内存泄漏思考题
1、
var a = 20; var b = a; b = 30; // 这时a的值是多少?
20
2、
var a = { name: '前端开发' } var b = a; b.name = '进阶'; // 这时a.name的值是多少
进阶
3、
var a = { name: '前端开发' } var b = a; a = null; // 这时b的值是多少
{ name: '前端开发' }
4、
var a = {n: 1}; var b = a; a.x = a = {n: 2}; a.x // 这时 a.x 的值是多少 b.x // 这时 b.x 的值是多少
解析:
关键在 a.x = a = {n: 2};
。.运算符高于 = 运算符。所以js引擎先执行 a.x,因为此时 a = {n : 1},所以 a.x 为 undefined 并且 a 和 b 此时等于都指向的是 {n:1,x:undefined}。
执行了 . 运算符后开始执行 = 运算符,js 是从右到左,所以先把 {n:2} 的引用给 a,此刻:
a: {n: 2}, b: { n: 1, x: undefined }
再把引用值 a 赋给 a.x(因为 a.x 的 . 运算符已经运算过了,所以这里的 a.x 可以理解为就是一个普通的标识符,并且这标识符原本的值是 undefined),就等于把 {n: 2} 的引用赋值给了这个标识符。此时:
b: { n: 1, x: { n: 2 } }, a: { n: 2 }
所以此时
console.log(a.x); // undefined console.log(b.x); // {n: 2}
5、
从内存来看 null 和 undefined 本质的区别是什么?
- 值 null 是一个字面量,它不像 undefined 是全局对象的一个属性。
- null 值表示一个空对象指针,指示变量未指向任何对象,理解为尚未创建的对象比较好理解。undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。
根据用途来理解第二点:
对于 null:
- 作为函数的参数,表示该函数的参数不是对象。(bind 的柯里化使用)
- 作为对象原型链的终点。Object.getPrototypeOf(Object.prototype) // null
- 如果定义的变量在将来用于保存对象,那么最好将该变量初始化为 null,而不是其他值。
- 当一个数据不再需要使用时,我们最好通过将其值设置为 null 来释放其引用,这个做法叫做解除引用。(解除引用的真正作用是让值脱离执行环境)
对于 undefined:
- 变量被声明了,但没有赋值时,就等于 undefined。
- 调用函数时,应该提供的参数没有提供,该参数等于 undefin ed。
- 对象没有赋值的属性,该属性的值为 undefined。
- 函数没有返回值时,默认返回 undefined。
var i; i // undefined function f(x){console.log(x)} f() // undefined var o = new Object(); o.p // undefined var x = f(); x // undefined
注意:
typeof null // Object
历史遗留问题。null == undefined // true
undefiend 其实派生与 null。- 对于尚未声明过的变量,我们只能执行一项操作,即使用 typeof 操作符检测其数据类型,使用其他的操作都会报错。(如 var i 的 i)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 深入 JS 之闭包
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论