3-1
简单数据类型Undefined、Null、Boolean、Number、String 和 Symbol。Symbol(符号)是 ECMAScript 6 新增复杂数据类型Object(对象)。Object 是一种无序名值对的集合。
"undefined"表示值未定义; "boolean"表示值为布尔值; "string"表示值为字符串; "number"表示值为数值; "object"表示值为对象(而不是函数)或 null; "function"表示值为函数; "symbol"表示值为符号。
undefined
let message; // 这个变量被声明了,只是值为 undefined// 确保没有声明过这个变量// let ageconsole.log(message); // "undefined"console.log(age); // 报错let message; // 这个变量被声明了,只是值为 undefined// 确保没有声明过这个变量// let ageconsole.log(typeof message); // "undefined"console.log(typeof age); // "undefined"无论是声明还是未声明,typeof 返回的都是字符串"undefined"。逻辑上讲这是对的,因为虽然严格来讲这两个变量存在根本性差异,但它们都无法执行实际操作。
注意 :即使未初始化的变量会被自动赋予 undefined 值,但我们仍然建议在声明变量的 同时进行初始化。这样,当 typeof 返回”undefined”时,你就会知道那是因为给定的变 量尚未声明,而不是声明了但未初始化。
let message; // 这个变量被声明了,只是值为 undefined// age 没有声明if (message) {// 这个块不会执行}if (!message) {// 这个块会执行}if (age) {// 这里会报错}
null
Null 类型同样只有一个值,即特殊值 null。逻辑上讲,null 值表示一个空对象指针,这也是给typeof 传一个 null 会返回"object"的原因:let car = null;console.log(typeof car); // "object"
let message = null;let age;if (message) {// 这个块不会执行}if (!message) {// 这个块会执行}if (age) {// 这个块不会执行}if (!age) {// 这个块会执行}
Boolean
这两个布尔值不同于数值,因此 true 不等于 1,false 不等于 0。下面是给变量赋布尔值的例子:let found = true;let lost = false;
| 数据类型 | 转换为 true 的值 | 转换为 false 的值 |
|---|---|---|
| Boolean | true | false |
| String | 非空字符串 | (空字符串) |
| Number | 非零数值(包括无穷值) | 0、NaN |
| Object | 任意对象 | null |
| Undefined | N/A(不存在) | undefined |
let message = "Hello world!";if (message) {console.log("Value is true");}因为字符串 message 会被自动转换为等价的布尔值 true。
number
let intNum = 55; // 整数如果字面量中包含的数字超出了应有的范围,就会忽略前缀的零,后面的数字序列会被当成十进制数,如下所示:let octalNum1 = 070; // 八进制的 56let octalNum2 = 079; // 无效的八进制值,当成 79 处理let octalNum3 = 08; // 无效的八进制值,当成 8 处理必须让真正的数值前缀 0x(区分大小写),然后是十六进制数字(0~9 以及 A~F)。十六进制数字中的字母大小写均可。let hexNum1 = 0xA; // 十六进制 10let hexNum2 = 0x1f; // 十六进制 31
let floatNum = 3.125e7; // 等于 31250000
要确定一个值是不是有限大(即介于 JavaScript 能表示的最小值和最大值之间),可以使用 isFinite()函数,如下所示:let result = Number.MAX_VALUE + Number.MAX_VALUE;console.log(isFinite(result)); // false
NaN
console.log(NaN == NaN); // falseconsole.log(isNaN(NaN)); // trueconsole.log(isNaN(10)); // false,10 是数值console.log(isNaN("10")); // false,可以转换为数值 10console.log(isNaN("blue")); // true,不可以转换为数值console.log(isNaN(true)); // false,可以转换为数值 1
Numberlet num1 = Number("Hello world!"); // NaNlet num2 = Number(""); // 0let num3 = Number("000011"); // 11let num4 = Number(true); // 1可以看到,字符串"Hello world"转换之后是 NaN,因为它找不到对应的数值。空字符串转换后是 0。字符串 000011 转换后是 11,因为前面的零被忽略了。最后,true 转换为 1。
ParseIntlet num1 = parseInt("1234blue"); // 1234let num2 = parseInt(""); // NaNlet num3 = parseInt("0xA"); // 10,解释为十六进制整数let num4 = parseInt(22.5); // 22let num5 = parseInt("70"); // 70,解释为十进制值let num6 = parseInt("0xf"); // 15,解释为十六进制整数不同的数值格式很容易混淆,因此 parseInt()也接收第二个参数,用于指定底数(进制数)let num1 = parseInt("10", 2); // 2,按二进制解析let num2 = parseInt("10", 8); // 8,按八进制解析let num3 = parseInt("10", 10); // 10,按十进制解析let num4 = parseInt("10", 16); // 16,按十六进制解析
parseFloatparseFloat()只解析十进制值,因此不能指定底数。let num1 = parseFloat("1234blue"); // 1234,按整数解析let num2 = parseFloat("0xA"); // 0let num3 = parseFloat("22.5"); // 22.5let num4 = parseFloat("22.34.5"); // 22.34let num5 = parseFloat("0908.5"); // 908.5let num6 = parseFloat("3.125e7"); // 31250000
String 类型
字符串可以使用双引号(")、单引号(')或反引号(`)标示,因此下面的代码都是合法的:let firstName = "John";let lastName = 'Jacob';let lastName = `Jingleheimerschmidt`
\n 换行\t 制表\b 退格\r 回车\f 换页\\ 反斜杠(\)\' 单引号('),在字符串以单引号标示时使用,例如'He said, \'hey.\''
转换为字符串
1、toString()方法toString()方法可见于数值、布尔值、对象和字符串值。(没错,字符串值也有 toString()方法,该方法只是简单地返回自身的一个副本。)null 和 undefined 值没有 toString()方法。let age = 11;let ageAsString = age.toString(); // 字符串"11"let found = true;let foundAsString = found.toString(); // 字符串"true"默认情况下,toString()返回数值的十进制字符串表示。而通过传入参数,可以得到数值的二进制、八进制、十六进制,或者其他任何有效基数的字符串表示,比如:let num = 10;console.log(num.toString()); // "10"console.log(num.toString(2)); // "1010"console.log(num.toString(8)); // "12"console.log(num.toString(10)); // "10"console.log(num.toString(16)); // "a"
2 String() 如果值有 toString()方法,则调用该方法(不传参数)并返回结果。 如果值是 null,返回"null"。 如果值是 undefined,返回"undefined"。let value1 = 10;let value2 = true;let value3 = null;let value4;console.log(String(value1)); // "10"console.log(String(value2)); // "true"console.log(String(value3)); // "null"console.log(String(value4)); // "undefined"
模板字面量
ECMAScript 6 新增了使用模板字面量定义字符串的能力。与使用单引号或双引号不同,模板字面量保留换行字符,可以跨行定义字符串:
字符串插值通过在${}中使用一个 JavaScript 表达式实现:let value = 5;let exponent = 'second';// 以前,字符串插值是这样实现的:let interpolatedString =value + ' to the ' + exponent + ' power is ' + (value * value);// 现在,可以用模板字面量这样实现:let interpolatedTemplateLiteral =`${ value } to the ${ exponent } power is ${ value * value }`;
// Unicode 示例// \u00A9 是版权符号console.log(`\u00A9`); // ©console.log(String.raw`\u00A9`); // \u00A9// 换行符示例console.log(`first line\nsecond line`);// first line// second line
3-2 typeof 操作符
let message = "some string";console.log(typeof message); // "string"console.log(typeof(message)); // "string"console.log(typeof 95); // "number"
注意typeof在某些情况下返回的结果可能会让人费解,但技术上讲还是正确的。比如,调用typeof null 返回的是"object"。这是因为特殊值 null 被认为是一个对空对象的引用。
