> typeof false 'boolean' > typeof true 'boolean'
值 | 转换为布尔值 |
|
|
|
|
布尔值 | 与输入相同(无需转换) |
数字 |
|
其他数字 → | |
字符串 |
|
其他字符串 → | |
对象 |
|
任何值都可以通过三种方式转换为布尔值:
| (作为函数调用,而不是作为构造函数) |
| |
| 单个“非”转换为取反的布尔值;使用两次进行非取反转换。 |
我更喜欢 Boolean()
,因为它更具描述性。以下是一些示例:
> Boolean(undefined) false > Boolean(null) false > Boolean(0) false > Boolean(1) true > Boolean(2) true > Boolean('') false > Boolean('abc') true > Boolean('false') true
在 JavaScript 需要布尔值的地方,您可以提供任何类型的值,它会自动转换为布尔值。因此,JavaScript 中有两组值:一组转换为 false
,而另一组转换为 true
。这些集合称为 假值 和 真值。 根据上表,以下是所有假值:
undefined
, null
false
0
, NaN
''
所有其他值(包括所有对象,即使是空对象、空数组和 new Boolean(false)
)都是真值。因为 undefined
和 null
是假值,所以您可以使用 if
语句来检查变量 x
是否有值
if
(
x
)
{
// x has a value
}
需要注意的是,前面的检查将所有假值解释为“没有值”,而不仅仅是 undefined
和 null
。但是,如果您能够接受这种限制,那么您就可以使用一种紧凑且已建立的模式。
所有对象都是真值:
> Boolean(new Boolean(false)) true > Boolean([]) true > Boolean({}) true
这与对象转换为数字或字符串的方式不同,在转换为数字或字符串时,您可以通过实现 valueOf()
和 toString()
方法来控制结果:
> Number({ valueOf: function () { return 123 } }) 123 > String({ toString: function () { return 'abc' } }) 'abc'
转换为布尔值的方式有所不同,这是历史原因造成的。对于 ECMAScript 1,决定不允许对象配置该转换(例如,通过 toBoolean()
方法)。理由是布尔运算符 ||
和 &&
保留其操作数的值。因此,如果您链接这些运算符,则可能会多次检查相同值的真假性。对于基元类型来说,这种检查成本很低,但如果对象能够配置其转换为布尔值的方式,则对于对象来说成本会很高。ECMAScript 1 通过使对象始终为真值来避免这种成本。
在本节中,我们将介绍 And (&&)、Or (||) 和 Not (!) 逻辑运算符的基础知识。
二元逻辑运算符是:
它们始终返回其中一个操作数,且保持不变
> 'abc' || 123 'abc' > false || 123 123
如果第一个操作数已经确定了结果,则不会计算第二个操作数。 例如(console.log
的结果是 undefined
):
> true || console.log('Hello') true > false || console.log('Hello') Hello undefined
这对于运算符来说是不常见的行为。通常,所有操作数都会在调用运算符之前进行计算(就像函数一样)。
如果第一个操作数可以转换为 false
,则返回它。否则,返回第二个操作数:
> true && false false > false && 'def' false > '' && 'def' '' > 'abc' && 'def' 'def'
如果第一个操作数可以转换为 true
,则返回它。否则,返回第二个操作数:
> true || false true > true || 'def' true > 'abc' || 'def' 'abc' > '' || 'def' 'def'
有时在某些情况下,值(参数、函数的结果等)可以是非值(undefined
、null
)或实际值。如果您想为前一种情况提供默认值,可以使用 Or 运算符:
theValue
||
defaultValue
函数 saveText()
的参数 text
是可选的,如果省略了该参数,则应为空字符串:
function
saveText
(
text
)
{
text
=
text
||
''
;
...
}
这是 ||
作为默认运算符的最常见用法。有关可选参数的更多信息,请参阅可选参数。
对象 options
可能有也可能没有属性 title
。如果缺少该属性,则在设置标题时应使用值 'Untitled'
setTitle
(
options
.
title
||
'Untitled'
);
函数 countOccurrences
统计 regex
在 str
中匹配的次数
function
countOccurrences
(
regex
,
str
)
{
// Omitted: check that /g is set for `regex`
return
(
str
.
match
(
regex
)
||
[]).
length
;
}
问题是 match()
(请参阅String.prototype.match: 捕获组或返回所有匹配的子字符串)要么返回一个数组,要么返回 null
。由于使用了 ||
,因此在后一种情况下会使用默认值。因此,您可以在两种情况下安全地访问属性 length
。