js中6个值是false:
0、null、'',undefined、NaN、false
注:({}、[]、Infinity为true)
在原始类型中,有两个类型null和undefined,他们都代表无和空。
null
表示被赋值过的对象,刻意把一个对象赋值为null,故意表示为空,没有值。
所以对象的某个属性值为null,null转换为数值为0;
undefined
表示“缺少值”,即此处应有一个值,但还没有定义;如果一个对象的某个属性值为undefined,这是不正常的,undefined转换为数值时为NaN(非数字值的特殊值)
给一个全局变量赋值为null,相当于将这个变量的指针对象以及值清空,如果是给对象的属性赋值为null,或者局部变量赋值为null,相当于给这个属性分配了一块空的内存,然后值为null,js会回收全局变量为null的对象。
给一个全局变量赋值为undefined,相当于将这个对象的值清空,但是这个对象依旧存在,如果是给对象的属性赋值为undefined,说明这个值为空值。
问题一: 从内存来看 null 和 undefined 本质的区别是什么?
解答: 给一个全局变量赋值为null,相当于将这个变量的指针对象以及值清空,如果是给对象的属性 赋值为null,或者局部变量赋值为null,相当于给这个属性分配了一块空的内存,然后值为null, JS会回收全局变量为null的对象。
给一个全局变量赋值为undefined,相当于将这个对象的值清空,但是这个对象依旧存在,如果是给对象的属性赋值 为undefined,说明这个值为空值
扩展下: 声明了一个变量,但未对其初始化时,这个变量的值就是undefined,它是 JavaScript 基本类型 之一。
var data;
console.log(data === undefined); //true
对于尚未声明过的变量,只能执行一项操作,即使用typeof操作符检测其数据类型,使用其他的操作都会报错。
//data变量未定义
console.log(typeof data); // "undefined"
console.log(data === undefined); //报错
值null特指对象的值未设置,它是JavaScript 基本类型 之一。
值null是一个字面量,null是表示缺少的标识,指示变量未指向任何对象。它不像undefined是全局对象的一个属性
// foo不存在,它从来没有被定义过或者是初始化过:
foo;
"ReferenceError: foo is not defined"
// foo现在已经是知存在的,但是它没有类型或者是值:
var foo = null;
console.log(foo); // null
问题二: ES6语法中的 const 声明一个只读的常量,那为什么下面可以修改const的值?
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
解答: const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。