`

「译」JavaScript 的怪癖 2:两个「空值」:undefined 和 null

 
阅读更多

原文:JavaScript quirk 2: two “non-values” – undefined and null

译文:「译」JavaScript 的怪癖 2:两个「空值」:undefined 和 null

译者:SingleSeeker

此文是 javascript 的 12 个怪癖(quirks) 系列的第二篇。 感谢 @SingleSeeker 对本文的翻译。

以下是正文:

对于“空值”或“空引用”,大多数编程语言只有一个值。比如,在 Java 中用的是 null。 但是在 Javascript 中却有两个特殊的值:undefined 和 null。 他们基本上是相同,但用法上却略有些不同。 在这个 系列教程 的最后,我会解释一下在 ECMAScript 6 中的一些变化。

undefined 是被语言本身所分配的。 如果一个变量还没有被初始化,那么它的值就是 undefined:

> var foo;
> foo
undefined

同理,当缺失参数时 JavaScript 会分配一个 undefined:

> function id(x) { return x }
> id()
undefined

null 是被开发者用来明确指出某个值是缺失的, 例如,对于 JSON.stringify():

> console.log(JSON.stringify({ first: 'Jane' }, null, 4))
{
    "first": "Jane"
}

校检:一个变量是否有值?

如果你想知道变量 v 是否有值,正常情况下,你需要同时检验 undefined 与 null。 幸运的是两个值都是 false 型。 因此,只用一个判断,就可以同时检验这两项是否为真:

if (v) {
    // v 有值
} else {
    // v 没有值
}

在本 系列 的第 5 部分——关于函数参数的处理——你将会看到更多的上面校检例子。 有一点要注意的是:这个检查也会把 false,-0, +0, NaN 与 '' 当成“空值”。 如果这不是你想要的,那么就不能使用上面的校检方法了。

你有两个选择。

有些人提倡使用不等于(!=)来校检 v 既不是 undefined 或 null:

if (v != null) {
    // v 有值
} else {
    // v 没有值
}

不过,这要求你要明白 != 认为 null 只等于它自己或是 undefined。 我喜欢用更有可读性的 !==:

if (v !== undefined && v !== null) {
    // v 有值
} else {
    // v 没有值
}

性能方面,所有在这个章节中提到的这三个校检基本是相同的。 所以,最后用哪个取决于你的需求还有你的品味。 一些压缩工具甚至用!= 重写了最后一条校检。

136
17
分享到:
评论
6 楼 justjavac 2013-05-06  
gch_h 写道
没看翻译前的原文,就这篇文章而言有很多知识是错误的或者不精确的。
!=类似java中的 !equals(),指的是按预定的逻辑比较是否为true
!== 类似java中的 !=,指的是是否拥有相同的内存地址。即是否同一个对象,但对于基础类型的判断同样类似java中基础类型的判断。

检查一个变量是否有值也不严谨。如果变量v有值为false 或空串,则检查失败。

解释的不太恰当。javascript的概念不能用java的来类比。其实 === 和 equals() 有本质的区别。

equals() 用在对象的比较,但是 === 可以用在任何类型上。
5 楼 leaow567 2013-05-06  
4楼解释 感觉不恰当啊
4 楼 gch_h 2013-05-06  
没看翻译前的原文,就这篇文章而言有很多知识是错误的或者不精确的。
!=类似java中的 !equals(),指的是按预定的逻辑比较是否为true
!== 类似java中的 !=,指的是是否拥有相同的内存地址。即是否同一个对象,但对于基础类型的判断同样类似java中基础类型的判断。

检查一个变量是否有值也不严谨。如果变量v有值为false 或空串,则检查失败。
3 楼 静湖孤子 2013-05-05  
也就是
undefined === null
false
undefined == null
true
Boolean(undefined)
false
Boolean(null)
false
2 楼 血冷狼 2013-05-04  
@mark
1 楼 骨之灵魂 2013-05-04  
这个确实挺让人迷惑的

相关推荐

    js判断undefined类型,undefined,null,NaN的区别

    在 JavaScript 中,undefined、null、NaN 是三个经常被混淆的概念,但它们有着不同的含义和用途。今天,我们将深入探讨这三个概念的区别和应用。 undefined 在 JavaScript 中,undefined 是一个基本数据类型,表示...

    深入解析JavaScript中的`undefined`与`null`:探索它们的异同

    在JavaScript编程中,undefined和null是两种特殊的值,它们在处理变量和对象时扮演着重要的角色。尽管它们都表示“没有值”的概念,但它们之间存在着一些关键的区别。本文将深入探讨undefined和null的含义、用途以及...

    javascript类型系统--undefined和null全面了解_.docx

    JavaScript 类型系统中的 `undefined` 和 `null` 是两种特殊的原始值,它们分别代表不同的概念。在 JavaScript 中,每个变量都有一个类型,当变量未初始化或引用的对象不存在时,就会出现 `undefined` 或 `null`。 ...

    Javascript类型系统之undefined和null浅析_.docx

    JavaScript 类型系统中的 `undefined` 和 `null` 是两种特殊的原始值,它们分别代表不同的概念。`undefined` 主要用于表示变量已经声明但未被赋值的情况,而 `null` 则是一个特意设置的值,通常用来表示一个“空”的...

    js中 关于undefined和null的区别介绍.docx

    在JavaScript中,使用`==`比较运算符比较`undefined`和`null`会得到`true`,因为这两个值在松散相等比较中被视为相等。然而,使用严格相等运算符`===`比较时,它们被认为是不相等的,因为它们是两种不同的数据类型:...

    javascrit中undefined和null的区别详解.docx

    在JavaScript编程中,`undefined`与`null`是非常常见的两种基本数据类型。虽然它们都表示某种形式的“无”或“空”,但在实际使用中两者有着本质的区别。理解这些区别对于编写高质量、可维护的代码至关重要。 #### ...

    Javascript中的false、0、null、undefined和空字符串对象[归类].pdf

    在JavaScript中,`false`、`0`、`null`、`undefined`和空字符串`""`是五个特殊的值,它们在编程中扮演着不同的角色。理解它们的类型、等价性和在条件语句中的行为是至关重要的。 首先,让我们看看它们的类型: - `...

    JavaScript中Null与Undefined的区别解析

    JavaScript中Null与Undefined的区别解析主要涉及两种特殊数据类型:Null和Undefined。这两种类型是JavaScript中的原始类型,它们经常会使开发者混淆,尤其是在变量的赋值和比较操作中。本文将通过多个实例,详细解释...

    asp.net中对数据库表插入null空值的问题

    ### ASP.NET中对数据库表插入NULL空值的问题 在ASP.NET开发过程中,向数据库表插入数据时遇到NULL值处理不当的...通过上述方法,可以有效地解决ASP.NET中数据库表插入NULL空值的问题,提高应用程序的稳定性和可靠性。

    JavaScript中的null和undefined用法解析

    在JavaScript编程语言中,`null` 和 `undefined` 是两个重要的概念,它们都用来表示某种“不存在”或“没有”的状态,但它们之间存在着微妙的差异。了解这些差异对于编写健壮的JavaScript代码至关重要。 首先,`...

    实验七SQL的空值和空集处理.doc

    IS NULL 和 IS NOT NULL 是两个特殊的谓词,用于判断元组该列是否为空值。它们可以帮助我们更好地处理空值。 4. 对存在取空值的列按值进行 ORDER BY 排序 在进行 ORDER BY 排序时,如果某列存在空值,那么这些空值...

    JavaScript中null与undefined分析

    在JavaScript编程语言中,`null`和`undefined`是两个非常基础且重要的概念。虽然它们经常被用来表示“无值”或“空值”,但它们之间还是存在着一些关键性的区别。本文将详细探讨这两个概念的含义、用法以及它们之间...

    浅谈JavaScript中null和undefined

    在JavaScript编程语言中,null和undefined是两个非常基础且常用的特殊值。尽管它们看起来相似,但它们在JavaScript中有着本质上的区别和各自的应用场景。本文将详细探讨这两个特殊值的相同点和不同点,以及在实际...

    JavaScript中undefined和null的区别

    在JavaScript编程语言中,`undefined` 和 `null` 是两种特殊的数据类型,它们都表示“没有值”,但具有不同的含义和使用场景。了解这两者的差异对于编写健壮的JavaScript代码至关重要。 首先,让我们来明确两者的...

    JavaScript undefined及null区别实例解析

    这两个概念对于理解和编写健壮的JavaScript代码至关重要,特别是对于那些处理变量状态和数据类型的开发者。 首先,让我们来探讨 `undefined`。`undefined` 是一种类型,它只有一个值,就是 `undefined` 本身。当你...

    javascript类型系统——undefined和null全面了解

    JavaScript 类型系统中,`undefined` 和 `null` 是两种重要的原始值,它们各自具有特定的含义和用途。本文将深入探讨这两种类型的起源、差异、使用场景以及类型转换。 首先,`undefined` 在 JavaScript 中主要表示...

    MySQL数据库:空值比较.pptx

    MySQL有一个特殊的等于运算符“”,当两个表达式彼此相等或都等于空值时,它的值为TRUE,其中有一个空值或都是非空值但不相等,这个条件就是FALSE。 【例】 查询Sell表中还未收货的订单情况。 SELECT * FROM Sell ...

    区分JS中的undefined,null,,0和false

    其实标题里面我已经列出了JavaScript中所有的”空值”和”假值”,除了boolean值本身就是true和false这两种情况外,其它数据类型的”空值”主要是undefined和defined这两大类。这些空值的类型分别是: 代码如下: ...

Global site tag (gtag.js) - Google Analytics