ECMAScript中的真值和假值

简介: 看了下很多书上和网上文章中介绍ECMAScript中的布尔值,都是干巴巴地一句话:如果值是null, undefined, 0, 空字符串和false,则值为false,其他值都是true.说得当然是没错,不过不利于初学的同学理解。 其实,借着学习真假值的时候,正好是可以将很多知识串在一起的时候。

ECMAScript中的真值和假值

看了下很多书上和网上文章中介绍ECMAScript中的布尔值,都是干巴巴地一句话:如果值是null, undefined, 0, 空字符串和false,则值为false,其他值都是true.说得当然是没错,不过不利于初学的同学理解。
其实,借着学习真假值的时候,正好是可以将很多知识串在一起的时候。

下面我准备了一些真假值的练习题,请同学们写下它对应的值是true还是false:

null
undefined
''
""
" ".trim()
NaN
{}.notHere
(function () { } ())
(function () { return undefined } ())
{}
[]
"NaN"
"false"
0
-0
0.0
-0.0
() => undefined
{}.__proto__
NaN.__proto__
{ undefined }
{ undefined: undefined }
Symbol()
Symbol('')
new Boolean("false")
new Boolean(false)
new Boolean()
Boolean("false")
Boolean(NaN)
(new Boolean()).valueOf()

false的定义值

下面这6个,当然毫无疑义是false. 如果可以等价于这几个值的,自然也是false,除此之外,都是true。

null
undefined
''
""
NaN
0
false

像这个:

" ".trim()

去掉空格就是空串,完全等价,没有异议。

下面两个不是空串,又没有类型转换函数,所以是true,很简单。

"NaN"
"false"

数字

下面,好玩的事情开始了。
数字里面有两个从Java或C等其他语言转过来的同学需要学习的:

  • ECMAScript没有整型数,都是浮点数。所以0.0和0是一回事,都是false.不管是===还是Object.is,都无法判断出它们的区别,因为本来就是一回事。
  • ECMAScript中,+0和-0时而相同,时而不同. 0===-0是成立的,但是Object.is(0,-0)不成立。

在取布尔值时,我们采用===的逻辑,这+0,-0,+0.0,-0.0全是false.

对象

{}.notHere

未定义的属性,是undefined,这个没啥可说的。

{}
[]

上面两个虽然都是空对象,没有定义属性和方法,但是都不是null,也不是undefined,所以为true

NaN.__proto__

NaN也是Number对象的实例,它的原型值虽然是0,但是是非空对象,所以为true.

() => undefined
{}.__proto__
{ undefined }
{ undefined: undefined }

上面第一个是lambda表达式,也是个函数对象,虽然返回undefined,但本身是个非空函数对象。
后面三个也都是非空对象

函数

(function () { } ())
(function () { return undefined } ())

上面的两个是等价的,都是求值之后为undefined的结果。

符号

符号是一种新的数据类型,第七种数据类型,所以不可能跟前面定义的6种情况等价。所以可以放心的认为都是true.

Boolean对象

请注意,Boolean对象不与上面6种false情况的任一种等价,它是一个有值的对象,所以统统是true。
想要用Boolean对象的值怎么办?Boolean.prototype.valueOf()可以将其转换成值。

所以下面这些统统是true:

new Boolean("false")
new Boolean(false)
new Boolean()
Boolean("false")

下面这两个是false。Boolean函数是将其他值转换成布尔值,而不是生成Boolean对象,所以可以为false.

Boolean(NaN)
(new Boolean()).valueOf()
目录
相关文章
|
7月前
|
存储 前端开发 JavaScript
【JavaScript】浮点数精度问题
浮点数精度问题是指在计算机中使用二进制表示浮点数时,由于二进制无法精确表示某些十进制小数,导致计算结果可能存在舍入误差或不精确的情况。 这个问题主要源于浮点数的存储方式。在计算机中,浮点数通常使用IEEE 754标准来表示。该标准将浮点数分为符号位、指数位和尾数位,使用科学计数法来表示一个浮点数。
108 0
|
7月前
|
JavaScript 前端开发
JavaScript中的短路表达式
JavaScript中的短路表达式
34 1
|
7月前
|
JavaScript 前端开发 数据可视化
JavaScript 什么是三元表达式?
JavaScript 什么是三元表达式?
81 1
|
存储 JavaScript 前端开发
JavaScript逆波兰表达式求值
JavaScript逆波兰表达式求值
89 0
|
JavaScript 前端开发
JavaScript | 运算符与表达式
这里是`JavaScript`系列教程第四期啦!
|
JavaScript 前端开发 安全
在 JavaScript 中将浮点数转换为整数
在 JavaScript 中将浮点数转换为整数
242 0
JavaScript_算数运算符 及 表达式的理解
JavaScript_算数运算符 及 表达式的理解
|
JavaScript 前端开发
JavaScript运算符与表达式
JavaScript运算符与表达式
78 0
|
JavaScript 前端开发
【JavaScript】5_一元运算符等与自增自减
## 3、一元± 一元的± #### +正号 - 不会改变数值的符号 #### -负号 - 可以对数值进行符号位取反 #### **当我们对非数值类型进行正负运算时,会先将其转换为数值然后再运算** ```html <script> let a = -10 a = -a let b = '123' b = +b // b = Number(b) console.log(typeof b, b) </script> ``` ## 4、自增和自减 ++ 自增运算符 - ++ 使用后会使得原来的变量立刻增加1
106 0
【JavaScript】5_一元运算符等与自增自减
|
存储 JavaScript 前端开发
JavaScript 数值始终是 64 位的浮点数
JavaScript 数值始终是 64 位的浮点数
87 0