14.布尔值
基本类型 _ 布尔 _ 包含两个值 - false
和true
:
> typeof false
'boolean'
> typeof true
'boolean'
14.1。转换为布尔值
这三种方法可以将任意值x
转换为布尔值。
Boolean(x)
最具描述性;推荐的。x ? true : false
使用条件运算符(本章后面的解释)。!!x
使用逻辑非运算符(!
)。此运算符将其操作数强制转换为布尔值。它被第二次应用以获得非否定的结果。
TBL。 4 描述了各种值如何转换为布尔值。
Table 4: Converting values to booleans.
x | Boolean(x) |
---|---|
undefined | false |
null | false |
布尔值 | x (无变化) |
数值 | 0 → false ,NaN → false |
其他数字→ true | |
字符串值 | '' → false |
其他字符串→ true | |
对象值 | 总是true |
14.2。虚假和真实的值
在 JavaScript 中,如果您阅读了不存在的内容(例如缺少参数或缺少属性),则通常会得到undefined
。在这些情况下,存在性检查相当于将值与undefined
进行比较。例如,以下代码检查对象obj
是否具有属性.prop
:
if (obj.prop !== undefined) {
// obj has property .prop
}
为简化此检查,我们可以使用if
语句始终将其条件值转换为布尔值的事实:
if ('abc') { // true, if converted to boolean
console.log('Yes!');
}
因此,我们可以使用以下代码来检查obj.prop
是否存在。这与undefined
相比不太精确,但也更短:
if (obj.prop) {
// obj has property .prop
}
这种简化的检查非常流行,引入了以下两个名称:
- 如果在转换为布尔值时它是
true
,则称为 truthy 。 - 如果在转换为布尔值时它是
false
,则称为 falsy 。
咨询 tbl。 4 ,我们可以列出一个详尽的虚假值列表:
undefined
,null
- 布尔:
false
- 数字:
0
,NaN
- 字符串:
''
所有其他值(包括 _ 所有 _ 对象)都是真实的:
> Boolean('abc')
true
> Boolean([])
true
> Boolean({})
true
14.2.1。陷阱:真实性检查是不精确的
真实性检查有一个陷阱:它们不是很精确。考虑前面的例子:
if (obj.prop) {
// obj has property .prop
}
如果出现以下情况,则跳过if
语句的正文:
- 缺少
obj.prop
(在这种情况下,JavaScript 返回undefined
)。
但是,如果出现以下情况,也会跳过它:
obj.prop
是undefined
。obj.prop
是任何其他假值(null
,0
,''
等)。
在实践中,这很少会引起问题,但你必须意识到这个陷阱。
14.2.2。检查真实性或虚假性
if (x) {
// x is truthy
}
if (!x) {
// x is falsy
}
if (x) {
// x is truthy
} else {
// x is falsy
}
const result = x ? 'truthy' : 'falsy';
最后一行中使用的条件运算符将在本章后面的中解释。
14.2.3。使用案例:是否提供了参数?
真值检查通常用于确定函数的调用者是否提供了参数:
function func(x) {
if (!x) {
throw new Error('Missing parameter x');
}
// ···
}
从好的方面来说,这种模式已经建立并且很短。它正确地为undefined
和null
抛出错误。
在负面,有前面提到的陷阱:代码也会抛出所有其他虚假值的错误。
另一种方法是检查undefined
:
if (x === undefined) {
throw new Error('Missing parameter x');
}
14.2.4。用例:存在属性吗?
真实性检查通常也用于确定属性是否存在:
function readFile(fileDesc) {
if (!fileDesc.path) {
throw new Error('Missing property: .path');
}
// ···
}
readFile({ path: 'foo.txt' }); // no error
这种模式也已建立,并且有一个常见的警告:它不仅会在属性丢失时抛出,而且如果它存在并且具有任何虚假值。
如果你真的想检查属性是否存在,你必须使用in
运算符:
if (! ('path' in fileDesc)) {
throw new Error('Missing property: .path');
}
exercises/booleans/truthiness_exrc.js
14.3。条件运算符(? :
)
条件运算符是if
语句的表达式版本。它的语法是:
«condition» ? «thenExpression» : «elseExpression»
评估如下:
- 如果
condition
是真实的,请评估并返回thenExpression
。 - 否则,评估并返回
elseExpression
。
条件运算符也称为 _ 三元运算符 _,因为它有三个操作数。
例子:
> true ? 'yes' : 'no'
'yes'
> false ? 'yes' : 'no'
'no'
> '' ? 'yes' : 'no'
'no'
下面的代码演示了,通过条件选择“then”和“else”两个分支中的任何一个 - 只评估该分支。另一个分支不是。
const x = (true ? console.log('then') : console.log('else'));
// Output:
// 'then'
14.4。二进制逻辑运算符:和(x && y
),或(x || y
)
运算符&&
和||
是 _ 值保持 _ 和 _ 短路 _。那是什么意思?
_ 值保存 _ 意味着操作数被解释为布尔值,但返回不变:
> 12 || 'hello'
12
> 0 || 'hello'
'hello'
_ 短路 _ 表示:如果第一个操作数已经确定了结果,则不评估第二个操作数。延迟评估其操作数的唯一其他运算符是条件运算符:通常,在执行操作之前评估所有操作数。
例如,如果第一个操作数是假的,则逻辑 And(&&
)不会计算其第二个操作数:
const x = false && console.log('hello');
// No output
如果第一个操作数是真实的,则执行console.log()
:
const x = true && console.log('hello');
// Output:
// 'hello'
14.4.1。逻辑和(x && y
)
表达式a && b
(“a
和b
”)的评估如下:
- 评估
a
。 - 结果是假的吗?把它返还。
- 否则,评估
b
并返回结果。
换句话说,以下两个表达式大致相同:
a && b
!a ? a : b
例子:
> false && true
false
> false && 'abc'
false
> true && false
false
> true && 'abc'
'abc'
> '' && 'abc'
''
14.4.2。逻辑或(||
)
表达式a || b
(“a
或b
”)的评估如下:
- 评估
a
。 - 结果是真的吗?把它返还。
- 否则,评估
b
并返回结果。
换句话说,以下两个表达式大致相同:
a || b
a ? a : b
例子:
> true || false
true
> true || 'abc'
true
> false || true
true
> false || 'abc'
'abc'
> 'abc' || 'def'
'abc'
14.4.3。通过逻辑或(||
)的默认值
有时您会收到一个值,如果它不是null
或undefined
,则只想使用它。否则,您希望使用默认值作为后备。您可以通过||
运算符执行此操作:
const valueToUse = valueReceived || defaultValue;
以下代码显示了一个真实示例:
function countMatches(regex, str) {
const matchResult = str.match(regex); // null or Array
return (matchResult || []).length;
}
如果str
内有regex
的一个或多个匹配项,则.match()
返回一个数组。如果没有匹配,则很遗憾地返回null
(而不是空数组)。我们通过||
运算符来解决这个问题。
exercises/booleans/default_via_or_exrc.js
14.5。逻辑不(!
)
表达式!x
(“Not x
”)的评估如下:
- 评估
x
。 - 这是真的吗?返回
false
。 - 否则,返回
true
。
例子:
> !false
true
> !true
false
> !0
true
> !123
false
> !''
true
> !'abc'
false
参见测验应用程序。