Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaScript浅析 -- null 和 undefined #24

Open
luoshaoxiong opened this issue Oct 13, 2018 · 0 comments
Open

JavaScript浅析 -- null 和 undefined #24

luoshaoxiong opened this issue Oct 13, 2018 · 0 comments

Comments

@luoshaoxiong
Copy link
Owner

luoshaoxiong commented Oct 13, 2018

JavaScript 有 7 种数据类型,其中有 6 种基本数据类型 Number、String、Boolean、Undefined、Null、Symbol(ES6 新增),1 种复杂类型 Object。而其中的 UndefinedNull 与其他不同,因为它们只有一个唯一的值,分别是 undefinednull。那么它们有啥不同呢?为啥在基本类型里还专门要有这两个?有什么作用呢?且听我细细道来。

一、区别

从语义上来讲,两者是有明确的区别的:

  • undefined 表示一个变量未被初始化。
  • null 表示一个变量初始化了,值被赋予了空值。

1. undefined

Undefined 类型只有唯一一个值 undefined,出现 undefined 的情况有以下三种:
(1)声明了一个变量但未进行初始化。 比如,函数没有指定返回值默认 return undefined,函数参数没有传参也会默认初始化为 undefined 等。

var value;
value; // undefined

(2)访问不存在的对象属性也会返回 undefined

var obj = {value: 1};
obj.content; // undefined
delete obj.value;
obj.value; // undefined

(3)void 运算符求值,无论后面表达式结果多少,都会返回 undefined

void (1 + 2); // undefined

我们在阻止 a 标签默认跳转时,经常会有 href="javascript:void 0" 这样的写法,这句话中的 javascript: 后面可以带有其他 js 可执行语句,并将后面的执行结果赋予 href,当返回 undefined 的时候就不会跳转。此处利用的也是 void 运算符返回 undefined 的原理。

* 注意:虽然可以显式将 undefined 赋值给其他变量,但这样是毫无意义并且不建议的,而且声明但未初始化的变量默认就是 undefined 不需要再赋值。

2. null

Null 类型也只有唯一一个值 null ,它代表了一个空对象指针。对象都是引用类型的,变量一般存的都是对象的指针地址值,实际对象内容是存在地址值指向的一块堆内存。而 null 是空指针,没有指向堆内存,表示不存在的对象。以下三种情况会返回 null
(1)当需要返回的变量类型是一个对象,且这个对象找不到时,就会返回 null

// 比如获取一个不存在的节点就会返回 null
document.getElementById('example'); // null

(2)原型链的末端是 null。获取 Object.prototype原型返回 null

Object.getPrototypeOf(Object.prototype); // null

(3)访问其他自行赋值为 null 的变量。

var content = null;
content; // null

* 使用场景:

  1. 当希望一个变量用于保存对象但还没有具体内容时,可以初始化为 null
  2. 对于希望被回收的数据,可以指定为 null解除引用,注意不会立马回收,只是让其脱离执行环境。js 的垃圾回收机制会自动在下次执行时清除脱离执行环境的变量。

二、判断

1. undefined

undefined 的检测方式有两种
(1)对变量使用 typeof ,看是否会返回 "undefined" (字符串形式)。

var value;
typeof value; // "undefined"
typeof content; // "undefined",未定义的变量也会返回同样的内容,未变量唯一能做的操作就是使用 typeof,其他都会报错 not defined

(2)与 undefined 进行 === 比较看是否返回 true

var value;
value === undefined; // true
content === undefined; // 报错,Uncaught ReferenceError: content is not defined

其中第二种方法要注意两点:

  1. 法二使用的 undefined 实际不是值 undefined,而是全局变量 window.undefined(事实上所有直接人为使用 undefined 都是访问的 window.undefined),只不过 window.undefined 的值刚好是 undefined 并且 ES5 之后不再允许改写该属性。
  2. undefined 并非保留字,也就意外着实际上我们可以声明一个变量叫 undefined 并对他随意赋值,这样用法二就不准确了。
function test() {
  var value;
  var undefined = 'hello';
  console.log(value === undefined); // fasle
}
test(); // 专门声明了个函数是因为全局下声明一个 undefined 变量实际上也是挂在 window 下的,而 window.undefined 已经存在且不允许改写,所以通过函数制造一个局部变量 undefined 

改进的方法是直接使用系统返回的 undefined。比如没有 return 的函数、void 0 或者直接 window.undefined 等。

function test() {
  var value;
  var undefined = 'hello';
  console.log(value === window.undefined); // true
  console.log(value === void 0); // true
}
test();

2. null

null 的检测方法就直接 === 判断看是否返回 true。注意是严格等于(三等),因为 undefined == null 也会返回 true,而且 null 是保留字所以不用担心 null 能定义变量随便赋值的问题。

var obj = null;
obj === null; // true

* 对于 null,使用 typeof 不可行,因为 typeof null 返回的是 "object"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant