JS随记-好题(2)

101 阅读2分钟

2.1 从内存来看 null 和 undefined 本质的区别是什么?

解答:

  • 如果给一个全局变量赋值为null,相当于将这个变量的指针对象以及值清空,如果是给对象的属性 赋值为null,或者局部变量赋值为null,相当于给这个属性分配了一块空的内存,然后值为null, JS会回收全局变量为null的对象。

  • 给一个全局变量赋值为undfined,相当于将这个对象的值清空,但是这个对象依旧存在,如果是给对象的属性赋值 为undfined,说明这个值为空值。

扩展:

Undfined

在使用var声明变量但未对其进行初始化,这个变量的值就是undfined

var miss;
console.log(miss == undefined); //true

然而,令人困惑的是:对未初始化的变量执行typeof操作符会返回undefined值,而对为声明的变量执行typeof操作符也会返回undefined值。

//miss
console.log(typeof miss); // "undefined"
console.log(miss === undefined); //报错

不过,包含 undefined值的变量与尚未定义的变量还是不一样的。对于尚未定义的变量只能执行typeof这一项操作来检测他的数据类型。其他操作会报错。

Null

从逻辑角度来看,null值表示一个空对象指针,这也正是使用typeof操作符检测null值时会返回“object”的原因。

如果定义一个变量准备在将来用于保存对象,最好就用null来初始化该变量。

2.2 ES6语法中的 const 声明一个只读的常量,那为什么下面可以修改const的值?

const foo = {}; 
foo = {}; // TypeError: "foo" is read-only
foo.prop = 123;
foo.prop // 123

解析:

const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。 对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心!

参考链接:muyiy.cn/blog/1/1.5.…