JavaScript 中undefined和null之间的区别.md

Posted by cl9000 on May 10, 2020

每天做一件自己害怕的事。——<埃莉诺·罗斯福>

1. null

null 特指对象的值未设置。它是 JavaScript 基本类型 之一,在布尔运算中被认为是false

1
2
3
4
5
6
7
8
9
10
function getVowels(str) {
const m = str.match(/[aeiou]/gi);
if (m === null) {
return 0;
}
return m.length;
}

console.log(getVowels('sky'));
// expected output: 0

值 null 是一个字面量,不像 undefined,它不是全局对象的一个属性。null 是表示缺少的标识,指示变量未指向任何对象。把 null 作为尚未创建的对象,也许更好理解。在 API 中,null 常在返回类型应是一个对象,但没有关联的值的地方使用。

1
2
3
4
5
6
7
8
// foo 不存在,它从来没有被定义过或者是初始化过:
foo;
"ReferenceError: foo is not defined"

// foo 现在已经是知存在的,但是它没有类型或者是值:
var foo = null;
foo;
null

null 与 undefined 的不同点:

当检测 nullundefined时,注意相等(==)与全等(===)两个操作符的区别 ,前者会执行类型转换:

1
2
3
4
5
6
7
8
9
typeof null        // "object" (因为一些以前的原因而不是'null')
typeof undefined // "undefined"
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null //true
isNaN(1 + null) // false
isNaN(1 + undefined) // true

2. undefined

全局属性undefined表示原始值undefined。它是一个JavaScript的 原始数据类型 。

1
2
3
4
5
6
7
8
9
10
11
function test(t) {
if (t === undefined) {
return 'Undefined value!';
}
return t;
}

let x;

console.log(test(x));
// expected output: "Undefined value!"

undefined是全局对象的一个属性。也就是说,它是全局作用域的一个变量。undefined的最初值就是原始数据类型undefined。

在现代浏览器(JavaScript 1.8.5/Firefox 4+),自ECMAscript5标准以来undefined是一个不能被配置(non-configurable),不能被重写(non-writable)的属性。即便事实并非如此,也要避免去重写它。

一个没有被赋值的变量的类型是undefined。如果方法或者是语句中操作的变量没有被赋值,则会返回undefined(对于这句话持疑惑态度,请查看英文原文来理解)。

1
2
3
4
5
6
function test(a){
console.log(typeof a); // undefined
return a;
}

test(); // 返回"undefined"

一个函数如果没有使用return语句指定返回值,就会返回一个undefined值。

但是它有可能在非全局作用域中被当作标识符(变量名)来使用(因为undefined不是一个保留字)),这样做是一个非常坏的主意,因为这样会使你的代码难以去维护和排错。

// 不要这样做!
// 打印 ‘foo string’ PS:说明undefined的值和类型都已经改变
(function() {
var undefined = ‘foo’;
console.log(undefined, typeof undefined)
})()
// 打印 ‘foo string’ PS:说明undefined的值和类型都已经改变
(function(undefined) {
console.log(undefined, typeof undefined)
})(‘foo’)

严格相等和undefined

1
2
3
4
5
6
7
8
9
你可以使用undefined和严格相等或不相等操作符来决定一个变量是否拥有值。在下面的代码中,变量x是未定义的,if 语句的求值结果将是true

var x;

if (x === undefined) {
// 执行这些语句
} else {
// 这些语句不会被执行
}

注意:这里是必须使用严格相等操作符(===)而不是标准相等操作符(==),因为 x == undefined 会检查x是不是null,但是严格相等不会检查(有点饶人,其实 === 会严格判断双方的类型、值等是否相等)。null不等同于undefined。移步比较操作符查看详情。

Typeof 操作符和undefined

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
或者,可以使用typeof

var x;
if(typeof x === 'undefined') {
// 执行这些语句
}
使用 typeof的原因是它不会在一个变量没有被声明的时候抛出一个错误。

// 这里没有声明y
if(typeof y === 'undefined') { // 没有错误,执行结果为true
console.log("y is " + typeof y ) // y is undefined
}

if(y === undefined) { // ReferenceError: y is not defined

}
但是,技术方面看来这样的使用方法应该被避免。JavaScript是一个静态作用域语言,所以,一个变量是否被声明可以通过看它是否在一个封闭的上下文中被声明。唯一的例外是全局作用域,但是全局作用域是被绑定在全局对象上的,所以要检查一个变量是否在全局上下文中存在可以通过检查全局对象上是否存在这个属性(比如使用in操作符)。

if ('x' in window) {
// 只有x被全局性的定义 才会这行这些语句
}

Void操作符和undefined

1
2
3
4
5
6
7
8
9
10
11
void 操作符是第三种可以替代的方法。

var x;
if(x === void 0) {
// 执行这些语句
}

// 没有声明y
if(y === void 0) {
// 抛出一个RenferenceError错误(与`typeof`相比)
}
  • undefined 表示尚未声明或已声明但尚未分配值的变量
  • null 是一个赋值,表示“无价值”
  • Javascript设置未分配的变量,其默认值为 undefined
  • Javascript从不将值设置为 null。程序员使用它来表示avar没有值。
  • undefined 无效的JSONnull
  • undefined typeofundefined
  • null typeof是一个 object。为什么?
  • 都是原语
  • 两者都是虚假的 (Boolean(undefined) // false,Boolean(null) // false)
    -您可以知道变量是否未定义
1
typeof variable === "undefined"

您可以检查变量是否为空

1
variable === null

在平等的经营者认为他们平等的,但身份不

1
2
3
null == undefined // true

null === undefined // false

参考

关注【公众号】,了解更多。



支付宝打赏 微信打赏

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!