9月阅读周·JavaScript权威指南:类型、值和变量,布尔值、null和undefined篇
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。
这个“玩法”虽然常见且板正,但是有效,已经坚持阅读八个月。
已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》。
当前阅读周书籍:《JavaScript权威指南》。
布尔值
JavaScript程序中的比较语句的结果通常都是布尔值,例如:
a==4
这段代码用来检测变量a的值是否等于4。如果等于,比较结果的布尔值就是true;如果不等,比较结果则为false。
布尔值通常用于JavaScript中的控制结构中。例如,JavaScript中的if/else语句,如果布尔值为true执行第一段逻辑,如果为false执行另一段逻辑。通常将一个创建布尔值的比较直接与使用这个比较的语句结合在一起,结果如下所示:
if(a==4)
b=b+1;
else
a=a+1;
这段代码检测变量a是否等于4。如果等于,则b加1;否则,a加1。任意JavaScript的值都可以转换为布尔值。下面这些值会被转换成false:
undefined
null
0
-0
NaN
""//空字符串
所有其他值,包括所有对象(数组)都会转换成true。false和上面6个可以转换成false的值有时称做“假值”(falsy value),其他值称做“真值”(truthy value)。JavaScript期望使用一个布尔值的时候,假值会被当成false,真值会被当成true。
来看一个例子,假设变量o是一个对象或是null,可以通过一条if语句来显式地检测o是否是非null值:
if(o!==null)...
不等操作符“!==”将o和null比较,并得出结果为true或false。可以先忽略这里的比较语句,null是一个假值,对象是一个真值:
if(o)...
对于第一种情况,只有当o不是null时才会执行if后的代码,第二种情况的限制没那么严格:只有o不是false或任何假值(比如null或undefined)时它才会执行这个if。到底选用哪条语句取决于期望赋给o的值是什么。如果需要将null与0或""区分开来,则需要使用一个显式的比较。
布尔值包含toString()方法,因此可以使用这个方法将字符串转换为"true"或"false",但它并不包含其他有用的方法。除了这个不重要的API,还有三个重要的布尔运算符。
“&&”运算符执行了逻辑与(AND)操作。当且仅当两个操作数都是真值时它才返回true;否则返回false。“||”运算符是布尔或(OR)操作,如果两个操作数其中之一为真值它就返回true,如果两个操作数都是假值则返回false。最后,一元操作符“!”执行了布尔非(NOT)操作:如果操作数是真值则返回false;如果是假值,则返回true。比如:
if((x==0&&y==0)||!(z==0)){//x和y都是零或z是非零
}
null和undefined
对null执行typeof预算,结果返回字符串"object",也就是说,可以将null认为是一个特殊的对象值,含义是“非对象”。但实际上,通常认为null是它自有类型的唯一一个成员,它可以表示数字、字符串和对象是“无值”的。大多数编程语言和JavaScript一样含有null:你可能对null或nil很眼熟。
JavaScript还有第二个值来表示值的空缺。用未定义的值表示更深层次的“空值”。它是变量的一种取值,表明变量没有初始化,如果要查询对象属性或数组元素的值时返回undefined则说明这个属性或元素不存在。如果函数没有返回任何值,则返回undefined。引用没有提供实参的函数形参的值也只会得到undefined。undefined是预定义的全局变量(它和null不一样,它不是关键字),它的值就是“未定义”。在ECMAScript 3中,undefined是可读/写的变量,可以给它赋任意值。这个错误在ECMAScript 5中做了修正,undefined在该版本中是只读的。如果使用typeof运算符得到undefined的类型,则返回"undefined",表明这个值是这个类型的唯一成员。
尽管null和undefined是不同的,但它们都表示“值的空缺”,两者往往可以互换。判断相等运算符“==”认为两者是相等的(要使用严格相等运算符“===”来区分它们)。在希望值是布尔类型的地方它们的值都是假值,和false类似。null和undefined都不包含任何属性和方法。实际上,使用“.”和“[]”来存取这两个值的成员或方法都会产生一个类型错误。
你或许认为undefined是表示系统级的、出乎意料的或类似错误的值的空缺,而null是表示程序级的、正常的或在意料之中的值的空缺。如果你想将它们赋值给变量或者属性,或将它们作为参数传入函数,最佳选择是使用null。
总结
JavaScript是一种面向对象的语言。不严格地讲,这意味着我们不用全局的定义函数去操作不同类型的值,数据类型本身可以定义方法(method)来使用值。
JavaScript中的原始类型包括数字、字符串和布尔值。JavaScript中有两个特殊的原始值:null(空)和undefined(未定义),它们不是数字、字符串和布尔值。它们通常分别代表了各自特殊类型的唯一的成员
布尔值指代真或假、开或关、是或否。这个类型只有两个值,保留字true和false。
null是JavaScript语言的关键字,它表示一个特殊值,常用来描述“空值”。undefined是预定义的全局变量(它和null不一样,它不是关键字),它的值就是“未定义”。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)