
2024-11-24 日报 Day16

今日的鸡汤
你有多自律,就有多自由。
今日学习内容
1、JS红皮书P30-37 第三章:语言基础
今日笔记
1、ECMAScript中有6种简单数据类型(也称为原始数据类型):Undefined、Null、Boolean、Number、String、Symbol(ES6新增)。
2、ECMAScript中有一种复杂数据类型——对象(Object)。
3、typeof操作符:用于检测给定变量的数据类型。typeof会返回下列字符串之一:
- “undefined”:如果这个值未定义
- “boolean”:如果这个值是布尔值
- “string”:如果这个值是字符串
- “number”:如果这个值是数值
- “object”:如果这个值是对象或null
- “function”:如果这个值是函数
- “symbol”:如果这个值是符号
1 | let message = "some string"; |
调用typeof null会返回”object”,这是因为特殊值null被认为是一个对空对象的引用。
注意 严格来讲,函数在 ECMAScript 中被认为是对象,并不代表一种数据类型。可是,
函数也有自己特殊的属性。为此,就有必要通过 typeof 操作符来区分函数和其他对象。
1 | let message; |
4、Null类型:Null类型只有一个值,即特殊的null。逻辑上讲,null值表示一个空对象指针,因此用typeof操作符检测null值会返回”object”。
let car = null;
console.log(typeof car); // “object”
5、Boolean类型:Boolean类型有两个字面值:true和false。这两个值不是数字,但它们在需要时会被转换为数字。true转换为1,false转换为0。
虽然布尔值只有两个,但所有其他 ECMAScript 类型的值都有相应布尔值的等价形式。要将一个其他类型的值转换为布尔值,可以调用特定的 Boolean()转型函数:
let message = “Hello world!”;
let messageAsBoolean = Boolean(message);
其转化规则如下表:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “” |
Number | 任何非零数字(包含无穷值) | 0和NaN |
Object | 任何对象 | null |
Undefined | N/A(不存在) | undefined |
6、Number类型:ECMAScript 中的所有数字都是浮点数。在其他编程语言中,整数和浮点数是不同的数据类型,但在 ECMAScript 中,它们是同一种数据类型。在 ECMAScript 中,可以使用十进制、八进制(在数字前加0)和十六进制(在数字前加0x)。 | ||
整数也可以用八进制(以 8 为基数)或十六进制(以 16 为基数)字面量表示。对于八进制字面量, | ||
第一个数字必须是零(0),然后是相应的八进制数字(数值 0~7)。如果字面量中包含的数字超出了应 | ||
有的范围,就会忽略前缀的零,后面的数字序列会被当成十进制数,如下所示: |
1 | let octalNum1 = 070; // 八进制的56 |
十六进制字面量的第一部分必须是 0x,然后是任何十六进制数字(09 和 af)。字母 a~f 可以是大写的,也可以是小写的。如下所示:
1 | let hexNum1 = 0xA; // 十六进制的10 |
- 浮点数:科学计数法表示的浮点数:
1
2
3let floatNum1 = 1.1; // 小数点后没有数字
let floatNum2 = 0.1; // 小数点前没有数字
let floatNum3 = .1; // 可以省略整数部分和小数点浮点值的精确度最高可达 17 位小数,但在算术计算中远不如整数精确。例如,0.1 加 0.2 得到的不1
let floatNum = 3.125e7; // 等于31250000
是 0.3,而是 0.300 000 000 000 000 04。由于这种微小的舍入错误,导致很难测试特定的浮点值。比如下
面的例子:
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,如前所述,测试将失败。因此永远不要测试某个特定的浮点值。
注意 之所以存在这种舍入错误,是因为使用了 IEEE 754 数值,这种错误并非 ECMAScript
所独有。其他使用相同格式的语言也有这个问题。 - 值的范围:由于内存的限制,ECMAScript 并不支持表示这个世界上的所有数值。ECMAScript 可以表示的最小数值保存在 Number.MIN_VALUE 中,这个值在多数浏览器中是 5e324;可以表示的最大数值保存在Number.MAX_VALUE 中,这个值在多数浏览器中是 1.797 693 134 862 315 7e+308。如果某个计算得到的数值结果超出了 JavaScript 可以表示的范围,那么这个数值会被自动转换为一个特殊的 Infinity(无穷)值。任何无法表示的负数以-Infinity(负无穷大)表示,任何无法表示的正数以 Infinity(正无穷大)表示。
- NaN(Not a Number),用来表示本来要返回数值的操作失败了(而不是抛出错误)。NaN 是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。例如,0 除以 0 会返回 NaN——这是一个数学错误,而不是一个 JavaScript 错误。NaN 与任何值都不相等,包括它自己:NaN 有几个独特的属性。首先,任何涉及 NaN 的操作始终返回 NaN(如 NaN/10),在连续多步计算时这可能是个问题。其次,NaN 不等于包括 NaN 在内的任何值。例如,下面的比较操作会返回 false:
1
2
3
4console.log(0/0); // NaN
console.log(-0/0); // NaN
console.log(5/0); // Infinity
console.log(-5/0); // -Infinity
console.log(NaN == NaN); // false - 数值转换:Number()、parseInt()和parseFloat()。
Number()函数: - 如果是 Boolean 值,true 和 false 将分别被转换为 1 和 0。
- 如果是数字值,只是简单的传入和返回。
- 如果是 null 值,返回 0。
- 如果是 undefined,返回 NaN。
- 如果是字符串,遵循下列规则:
- 字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值(忽略前导零)。
- 字符串中包含有效的浮点格式,如”10.1”,则将其转换为对应的浮点数值(同样忽略前导零)。
- 字符串中包含有效的十六进制格式,如”0xf”,则将其转换为对应的十进制整数值。
- 字符串中包含字面量”null”,返回 0。
- 字符串中包含字面量”undefined”,返回 NaN。
- 如果字符串是空的(不包含任何字符),则返回 0。
- 如果字符串中包含除上述情况之外的字符,则返回 NaN。
1
2
3
4
5console.log(Number("Hello world!")); // NaN
console.log(Number("")); // 0
console.log(Number("000011")); // 11
console.log(Number(true)); // 1
console.log(Number(false)); // 0
- 如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值。
parseInt()函数:parseInt()函数会忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()会返回 NaN。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。例如:parseInt()函数还可以接受第二个参数,用于指定转换时使用的基数(即多少进制)。如果字符串以”0x”开头,那么基数是 16(十六进制)。如果字符串以”0”开头,那么基数是 8(八进制)。如果字符串以其他任何值开头,那么基数是 10(十进制)。例如:1
2
3
4
5console.log(parseInt("1234blue")); // 1234
console.log(parseInt("")); // NaN
console.log(parseInt("0xA")); // 10
console.log(parseInt(22.5)); // 22
console.log(parseInt("070")); // 70parseFloat()函数:parseFloat()函数用于解析浮点数,但它始终会忽略字符串前面的空格。如果字符串的第一个字符不能转换为数字,parseFloat()会返回 NaN。例如:1
2
3
4
5
6
7console.log(parseInt("0xAF", 16)); // 175
console.log(parseInt("AF", 16)); // 175
console.log(parseInt("AF")); // NaN
console.log(parseInt("10", 2)); // 2
console.log(parseInt("10", 8)); // 8
console.log(parseInt("10", 10)); // 10
console.log(parseInt("10", 16)); // 161
2
3
4
5console.log(parseFloat("1234blue")); // 1234
console.log(parseFloat("")); // NaN
console.log(parseFloat("0xA")); // 0
console.log(parseFloat("22.5")); // 22.5
console.log(parseFloat("22.34.5")); // 22.34