ECMAScript中的真值和假值

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()
时间: 2024-10-24 19:11:22

ECMAScript中的真值和假值的相关文章

ECMAScript中函数function类型

  这篇文章主要介绍了ECMAScript中函数function类型的相关资料,需要的朋友可以参考下 说起来ECMAScript中上面最有意思,我想那莫过于函数了,有意思的根源,则在于函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定.函数通常是使用函数声明语法定义的,如下例子: 代码如下: function sum(num1,num2) { return num1+nu

JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句_javascript技巧

if语句 语法: 复制代码 代码如下: if(condition){ statement1; } else{ statement2; } 迭代语句 1.do-while语句 语法: 复制代码 代码如下: do{ statement }while(expression); 2.while语句 语法: 复制代码 代码如下: while(expression){ statement } 3.for语句 语法: 复制代码 代码如下: for(initialization;expression;post-

JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)_javascript技巧

2.9.5.加性运算符 加性运算符(即加号和减号)通常是最简单的运算符,不过在ECMAScript中,每个加性运算符都有大量的特殊行为. 1.加法运算符: 复制代码 代码如下: var iResult=1+2; console.log(iResult);//outputs 3 特殊性: 某个运算数是NaN,结果为NaN Infinity加Infinity,结果为Infinity -Infinity加-Infinity,结果为-Infinity Infinity加-Infinity,结果为NaN

JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)_javascript技巧

2.9 运算符 2.9.1.一元运算符 一元运算符只有一个参数,即要操作的对象或值. 1.delete:删除对以前定义的对象属性或方法的引用,但此运算符不能删除开发者未定义的属性和方法.示例: 复制代码 代码如下: var o=new Object; o.name="Nicholas"; o.show=function(){ return "test"; }; console.log(o.name); //outpus Nicholas console.log(o.

JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换_javascript技巧

2.7 类型转换 1.转换成字符串 所有对象都有toString()方法可以转换成字符串,要注意的是Number类型的toString()方法,它有两种模式,即默认模式和基模式,采用默认模式toString()方法只是用相应的字符串输出对应的10进制数字值,用基模式可以用不同的基输出数字.示例: 复制代码 代码如下: var iNum1=10; var iNum2=10.0; var iNum3=10; alert(iNum1.toString()); //outpus "10" al

《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型_javascript技巧

2.8 引用类型 1.Object类 ECMAScript中的所有类都是由Object类继承而来. Object类具有下列属性: Constructor:对创建对象的函数的引用(指针),对于Object类,该指针指向原始的Object()函数 Prototype:对该对象的对象原型的引用. Object类还有几个方法: HasOwnProperty(property):判断对象是否有某个特定的属性.必须用字符串指定该属性值 IsPrototypeOf(object):判断该对象是否为另一个对象的

ECMAScript中函数function类型_javascript技巧

说起来ECMAScript中上面最有意思,我想那莫过于函数了,有意思的根源,则在于函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定.函数通常是使用函数声明语法定义的,如下例子: 复制代码 代码如下:  function sum(num1,num2)  {     return num1+num2;  } 这与下面使用函数表达式定义函数的方式几乎相差无几. 复制代码 代码

无线标记语言(WML)基础之WMLScript基础

WML Script是属于无限应用协议WAP应用层的一部分,使用它可以向WML卡片组和卡片中添加客户端的处理逻辑,目前最新的版本是1.1版.WML Script1.1是在欧洲计算机制造商协议会制定的ECMAScript脚本语言的基础上,经过修改和优化而指定的.它能够更好的支持诸如移动电话类的乍带宽通信设备,在WML编程中使用WML Script可以有效的增强客户端应用的灵活性,而且,我们也可以把WML Script作为一个工具使用,开发出功能强大的WAP网络应用和无限网页.本章我们将详细讲解WM

无线标记语言(WML)基础之WMLScript 基础第1/2页_WML教程

                        WML Script是属于无限应用协议WAP应用层的一部分,使用它可以向WML卡片组和卡片中添加客户端的处理逻辑,目前最新的版本是1.1版.WML Script1.1是在欧洲计算机制造商协议会制定的ECMAScript脚本语言的基础上,经过修改和优化而指定的.它能够更好的支持诸如移动电话类的乍带宽通信设备,在WML编程中使用WML Script可以有效的增强客户端应用的灵活性,而且,我们也可以把WML Script作为一个工具使用,开发出功能强大的