javascript基础学习系列四百三十九:Null类型

3.4.3 Null类型
Null 类型同样只有一个值,即特殊值 null。逻辑上讲,null 值表示一个空对象指针,这也是给 typeof 传一个 null 会返回"object"的原因:
let car = null;
console.log(typeof car); // “object”
在定义将来要保存对象值的变量时,建议使用 null 来初始化,不要使用其他值。这样,只要检查 这个变量的值是不是 null 就可以知道这个变量是否在后来被重新赋予了一个对象的引用,比如:
if (car != null) {
// car 是一个对象的引用
}
undefined 值是由 null 值派生而来的,因此 ECMA-262 将它们定义为表面上相等,如下面的例 子所示:
console.log(null == undefined); // true
用等于操作符(==)比较 null 和 undefined 始终返回 true。但要注意,这个操作符会为了比较 而转换它的操作数(本章后面将详细介绍)。
即使 null 和 undefined 有关系,它们的用途也是完全不一样的。如前所述,永远不必显式地将 变量值设置为 undefined。但 null 不是这样的。任何时候,只要变量要保存对象,而当时又没有那个 对象可保存,就要用 null 来填充该变量。这样就可以保持 null 是空对象指针的语义,并进一步将其 与 undefined 区分开来。
null 是一个假值。因此,如果需要,可以用更简洁的方式检测它。不过要记住,也有很多其他可 能的值同样是假值。所以一定要明确自己想检测的就是 null 这个字面值,而不仅仅是假值。
let message = null;
let age;
if (message) { // 这个块不会执行
}
if (!message) { // 这个块会执行
}

3.4 数据类型
33
if (age) {
// 这个块不会执行
}
if (!age) {
// 这个块会执行
}
3.4.4 Boolean类型
1
2
3
Boolean(布尔值)类型是 ECMAScript 中使用最频繁的类型之一,有两个字面值:true 和 false。 这两个布尔值不同于数值,因此 true 不等于 1,false 不等于 0。下面是给变量赋布尔值的例子: 4
let found = true;
let lost = false;
注意,布尔值字面量 true 和 false 是区分大小写的,因此 True 和 False(及其他大小混写形式) 5 是有效的标识符,但不是布尔值。
虽然布尔值只有两个,但所有其他 ECMAScript 类型的值都有相应布尔值的等价形式。要将一个其 他类型的值转换为布尔值,可以调用特定的 Boolean()转型函数:
let message = “Hello world!”;
let messageAsBoolean = Boolean(message);
在这个例子中,字符串 message 会被转换为布尔值并保存在变量 messageAsBoolean 中。 Boolean()转型函数可以在任意类型的数据上调用,而且始终返回一个布尔值。什么值能转换为 true 或 false 的规则取决于数据类型和实际的值。下表总结了不同类型与布尔值之间的转换规则。
6 7
8
9 10
11 12
13 14
数据类型
Boolean String Number Object Undefined
转换为 true 的值 true
非空字符串 非零数值(包括无穷值) 任意对象
N/A(不存在)
转换为 false 的值 false
“”(空字符串) 0、NaN(参见后面的相关内容) null
undefined
理解以上转换非常重要,因为像 if 等流控制语句会自动执行其他类型值到布尔值的转换,例如:
let message = “Hello world!”;
if (message) {
console.log(“Value is true”);
}
在这个例子中,console.log 会输出字符串"Value is true",因为字符串 message 会被自动 转换为等价的布尔值 true。由于存在这种自动转换,理解流控制语句中使用的是什么变量就非常重要。 错误地使用对象而不是布尔值会明显改变应用程序的执行流。
3.4.5 Number类型
ECMAScript 中最有意思的数据类型或许就是 Number 了。Number 类型使用 IEEE 754 格式表示整 数和浮点值(在某些语言中也叫双精度值)。不同的数值类型相应地也有不同的数值字面量格式。

34 第3章 语言基础 最基本的数值字面量格式是十进制整数,直接写出来即可:
let intNum = 55; // 整数
整数也可以用八进制(以 8 为基数)或十六进制(以 16 为基数)字面量表示。对于八进制字面量, 第一个数字必须是零(0),然后是相应的八进制数字(数值 0~7)。如果字面量中包含的数字超出了应 有的范围,就会忽略前缀的零,后面的数字序列会被当成十进制数,如下所示:
let octalNum1 = 070; letoctalNum2=079; let octalNum3 = 08;
// 八进制的56 //无效的八进制值,当成79处理 // 无效的八进制值,当成 8 处理
八进制字面量在严格模式下是无效的,会导致 JavaScript 引擎抛出语法错误。1
要创建十六进制字面量,必须让真正的数值前缀 0x(区分大小写),然后是十六进制数字(0~9 以 及 A~F)。十六进制数字中的字母大小写均可。下面是几个例子:
let hexNum1 = 0xA; // 十六进制10 let hexNum2 = 0x1f; // 十六进制31
使用八进制和十六进制格式创建的数值在所有数学操作中都被视为十进制数值。

  1. 浮点值
    要定义浮点值,数值中必须包含小数点,而且小数点后面必须至少有一个数字。虽然小数点前面不 是必须有整数,但推荐加上。下面是几个例子:
    let floatNum1 = 1.1;
    let floatNum2 = 0.1;
    let floatNum3 = .1; // 有效,但不推荐
    因为存储浮点值使用的内存空间是存储整数值的两倍,所以 ECMAScript 总是想方设法把值转换为 整数。在小数点后面没有数字的情况下,数值就会变成整数。类似地,如果数值本身就是整数,只是小 数点后面跟着 0(如 1.0),那它也会被转换为整数,如下例所示:
    let floatNum1 = 1.; // 小数点后面没有数字,当成整数 1 处理 let floatNum2 = 10.0; // 小数点后面是零,当成整数 10 处理
    对于非常大或非常小的数值,浮点值可以用科学记数法来表示。科学记数法用于表示一个应该乘以 10 的给定次幂的数值。ECMAScript 中科学记数法的格式要求是一个数值(整数或浮点数)后跟一个大 写或小写的字母 e,再加上一个要乘的 10 的多少次幂。比如:
    let floatNum = 3.125e7; // 等于31250000
    在这个例子中,floatNum 等于 31 250 000,只不过科学记数法显得更简洁。这种表示法实际上相 当于说:“以 3.125 作为系数,乘以 10 的 7 次幂。”
    科学记数法也可以用于表示非常小的数值,例如 0.000 000 000 000 000 03。这个数值用科学记数法 可以表示为 3e17。默认情况下,ECMAScript 会将小数点后至少包含 6 个零的浮点值转换为科学记数法
    ——————————
    1 ECMAScript 2015 或 ES6 中的八进制值通过前缀 0o 来表示;严格模式下,前缀 0 会被视为语法错误,如果要表示 八进制值,应该使用前缀 0o。——译者注
    注意 由于JavaScript保存数值的方式,实际中可能存在正零(+0)和负零(0)。正零和 负零在所有情况下都被认为是等同的,这里特地说明一下。

是 0.3,而是 0.300 000 000 000 000 04。由于这种微小的舍入错误,导致很难测试特定的浮点值。比如下 面的例子:
3.4 数据类型 35
1
(例如,0.000 000 3 会被转换为 3e7)。
浮点值的精确度最高可达 17 位小数,但在算术计算中远不如整数精确。例如,0.1 加 0.2 得到的不
2
3
4
5
6 7
8
9
10 11
失败了(而不是抛出错误)。比如,用 0 除任意数值在其他语言中通常都会导致错误,从而中止代码执 12 行。但在 ECMAScript 中,0、+0 或0 相除会返回 NaN:
if (a + b == 0.3) { // 别这么干! console.log(“You got 0.3.”);
}
这里检测两个数值之和是否等于 0.3。如果两个数值分别是 0.05 和 0.25,或者 0.15 和 0.15,那没问 题。但如果是 0.1 和 0.2,如前所述,测试将失败。因此永远不要测试某个特定的浮点值。
注意 之所以存在这种舍入错误,是因为使用了IEEE754数值,这种错误并非ECMAScript 所独有。其他使用相同格式的语言也有这个问题。
2. 值的范围
由于内存的限制,ECMAScript 并不支持表示这个世界上的所有数值。ECMAScript 可以表示的最小 数值保存在 Number.MIN_VALUE 中,这个值在多数浏览器中是 5e324;可以表示的最大数值保存在 Number.MAX_VALUE 中,这个值在多数浏览器中是 1.797 693 134 862 315 7e+308。如果某个计算得到的 数值结果超出了 JavaScript 可以表示的范围,那么这个数值会被自动转换为一个特殊的 Infinity(无 穷)值。任何无法表示的负数以-Infinity(负无穷大)表示,任何无法表示的正数以 Infinity(正 无穷大)表示。
如果计算返回正 Infinity 或负 Infinity,则该值将不能再进一步用于任何计算。这是因为 Infinity 没有可用于计算的数值表示形式。要确定一个值是不是有限大(即介于 JavaScript 能表示的 最小值和最大值之间),可以使用 isFinite()函数,如下所示:
let result = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(result)); // false
虽然超出有限数值范围的计算并不多见,但总归还是有可能的。因此在计算非常大或非常小的数值 时,有必要监测一下计算结果是否超出范围。
注意 使用Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY也可以获 取正、负 Infinity。没错,这两个属性包含的值分别就是-Infinity 和 Infinity。
3. NaN
有一个特殊的数值叫 NaN,意思是“不是数值”(Not a Number),用于表示本来要返回数值的操作
console.log(0/0); // NaN
console.log(-0/+0); // NaN
如果分子是非 0 值,分母是有符号 0 或无符号 0,则会返回 Infinity 或-Infinity:
console.log(5/0); // Infinity
console.log(5/-0); // -Infinity
13 14

36 第3章 语言基础
NaN 有几个独特的属性。首先,任何涉及 NaN 的操作始终返回 NaN(如 NaN/10),在连续多步计算 时这可能是个问题。其次,NaN 不等于包括 NaN 在内的任何值。例如,下面的比较操作会返回 false:
console.log(NaN == NaN); // false
为此,ECMAScript 提供了 isNaN()函数。该函数接收一个参数,可以是任意数据类型,然后判断 这个参数是否“不是数值”。把一个值传给 isNaN()后,该函数会尝试把它转换为数值。某些非数值的 值可以直接转换成数值,如字符串"10"或布尔值。任何不能转换为数值的值都会导致这个函数返回 true。举例如下:
console.log(isNaN(NaN));
console.log(isNaN(10));
console.log(isNaN(“10”));
console.log(isNaN(“blue”));
console.log(isNaN(true));
// true
// false,10 是数值
// false,可以转换为数值10 // true,不可以转换为数值 // false,可以转换为数值1
上述的例子测试了 5 个不同的值。首先测试的是 NaN 本身,显然会返回 true。接着测试了数值 10 和字符串"10",都返回 false,因为它们的数值都是 10。字符串"blue"不能转换为数值,因此函数返 回 true。布尔值 true 可以转换为数值 1,因此返回 false。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值