ECMAScript中的真值和假值
2016-07-21 02:15
246 查看
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()
相关文章推荐
- 2016年7月21日
- 贰:Modbus常用功能码协议详解
- swift中使用OC的方法;在OC中调用swift方法
- BZOJ3868 : The only survival
- Maya 脚本控制物体自转
- ACM-线段树
- 浏览器事件之鼠标事件
- Latex作者单位的写法—AND 首页脚注
- 最新行政区划代码省市区数据库(2018年3月 )
- Blocks(poj3734)组合数学
- Latex作者单位的写法—AND 首页脚注
- 最新手机号段归属地数据库(2018年3月1日)
- 一个IEEE论文LaTeX模板,可能较旧
- diffusion simulation
- # JAVA中集合解析篇一 ArrayList解析
- 大数加法简易理解并实现
- IEEE CSO 2009 修订版论文要求(英文说明)
- typedef
- [bzoj1060][ZJOI2007]时态同步(树上dp)
- Linux下配置两个或多个Tomcat启动