3-1

  1. 简单数据类型
  2. Undefined、
  3. Null、
  4. Boolean、
  5. Number、
  6. String 和 Symbol。Symbol(符号)是 ECMAScript 6 新增
  7. 复杂数据类型
  8. Object(对象)。Object 是一种无序名值对的集合。
  1.  "undefined"表示值未定义;
  2.  "boolean"表示值为布尔值;
  3.  "string"表示值为字符串;
  4.  "number"表示值为数值;
  5.  "object"表示值为对象(而不是函数)或 null;
  6.  "function"表示值为函数;
  7.  "symbol"表示值为符号。

undefined

  1. let message; // 这个变量被声明了,只是值为 undefined
  2. // 确保没有声明过这个变量
  3. // let age
  4. console.log(message); // "undefined"
  5. console.log(age); // 报错
  6. let message; // 这个变量被声明了,只是值为 undefined
  7. // 确保没有声明过这个变量
  8. // let age
  9. console.log(typeof message); // "undefined"
  10. console.log(typeof age); // "undefined"
  11. 无论是声明还是未声明,typeof 返回的都是字符串"undefined"。逻辑上讲这是对的,因为虽然严格来讲这两个变量存在根本性差异,但它们都无法执行实际操作。

注意 :即使未初始化的变量会被自动赋予 undefined 值,但我们仍然建议在声明变量的 同时进行初始化。这样,当 typeof 返回”undefined”时,你就会知道那是因为给定的变 量尚未声明,而不是声明了但未初始化。

  1. let message; // 这个变量被声明了,只是值为 undefined
  2. // age 没有声明
  3. if (message) {
  4. // 这个块不会执行
  5. }
  6. if (!message) {
  7. // 这个块会执行
  8. }
  9. if (age) {
  10. // 这里会报错
  11. }

null

  1. Null 类型同样只有一个值,即特殊值 null。逻辑上讲,null 值表示一个空对象指针,这也是给
  2. typeof 传一个 null 会返回"object"的原因:
  3. let car = null;
  4. console.log(typeof car); // "object"
  1. let message = null;
  2. let age;
  3. if (message) {
  4. // 这个块不会执行
  5. }
  6. if (!message) {
  7. // 这个块会执行
  8. }
  9. if (age) {
  10. // 这个块不会执行
  11. }
  12. if (!age) {
  13. // 这个块会执行
  14. }

Boolean

  1. 这两个布尔值不同于数值,因此 true 不等于 1,false 不等于 0。下面是给变量赋布尔值的例子:
  2. let found = true;
  3. let lost = false;
数据类型 转换为 true 的值 转换为 false 的值
Boolean true false
String 非空字符串 (空字符串)
Number 非零数值(包括无穷值) 0、NaN
Object 任意对象 null
Undefined N/A(不存在) undefined
  1. let message = "Hello world!";
  2. if (message) {
  3. console.log("Value is true");
  4. }
  5. 因为字符串 message 会被自动转换为等价的布尔值 true。

number

  1. let intNum = 55; // 整数
  2. 如果字面量中包含的数字超出了应有的范围,就会忽略前缀的零,后面的数字序列会被当成十进制数,如下所示:
  3. let octalNum1 = 070; // 八进制的 56
  4. let octalNum2 = 079; // 无效的八进制值,当成 79 处理
  5. let octalNum3 = 08; // 无效的八进制值,当成 8 处理
  6. 必须让真正的数值前缀 0x(区分大小写),然后是十六进制数字(0~9 以及 A~F)。十六进制数字中的字母大小写均可。
  7. let hexNum1 = 0xA; // 十六进制 10
  8. let hexNum2 = 0x1f; // 十六进制 31
  1. let floatNum = 3.125e7; // 等于 31250000
  1. 要确定一个值是不是有限大(即介于 JavaScript 能表示的最小值和最大值之间),可以使用 isFinite()函数,如下所示:
  2. let result = Number.MAX_VALUE + Number.MAX_VALUE;
  3. console.log(isFinite(result)); // false

NaN

  1. console.log(NaN == NaN); // false
  2. console.log(isNaN(NaN)); // true
  3. console.log(isNaN(10)); // false,10 是数值
  4. console.log(isNaN("10")); // false,可以转换为数值 10
  5. console.log(isNaN("blue")); // true,不可以转换为数值
  6. console.log(isNaN(true)); // false,可以转换为数值 1
  1. Number
  2. let num1 = Number("Hello world!"); // NaN
  3. let num2 = Number(""); // 0
  4. let num3 = Number("000011"); // 11
  5. let num4 = Number(true); // 1
  6. 可以看到,字符串"Hello world"转换之后是 NaN,因为它找不到对应的数值。空字符串转换后
  7. 是 0。字符串 000011 转换后是 11,因为前面的零被忽略了。最后,true 转换为 1。
  1. ParseInt
  2. let num1 = parseInt("1234blue"); // 1234
  3. let num2 = parseInt(""); // NaN
  4. let num3 = parseInt("0xA"); // 10,解释为十六进制整数
  5. let num4 = parseInt(22.5); // 22
  6. let num5 = parseInt("70"); // 70,解释为十进制值
  7. let num6 = parseInt("0xf"); // 15,解释为十六进制整数
  8. 不同的数值格式很容易混淆,因此 parseInt()也接收第二个参数,用于指定底数(进制数)
  9. let num1 = parseInt("10", 2); // 2,按二进制解析
  10. let num2 = parseInt("10", 8); // 8,按八进制解析
  11. let num3 = parseInt("10", 10); // 10,按十进制解析
  12. let num4 = parseInt("10", 16); // 16,按十六进制解析
  1. parseFloat
  2. parseFloat()只解析十进制值,因此不能指定底数。
  3. let num1 = parseFloat("1234blue"); // 1234,按整数解析
  4. let num2 = parseFloat("0xA"); // 0
  5. let num3 = parseFloat("22.5"); // 22.5
  6. let num4 = parseFloat("22.34.5"); // 22.34
  7. let num5 = parseFloat("0908.5"); // 908.5
  8. let num6 = parseFloat("3.125e7"); // 31250000

String 类型

  1. 字符串可以使用双引号(")、单引号(')或反引号(`)标示,因此下面的代码都是合法的:
  2. let firstName = "John";
  3. let lastName = 'Jacob';
  4. let lastName = `Jingleheimerschmidt`
  1. \n 换行
  2. \t 制表
  3. \b 退格
  4. \r 回车
  5. \f 换页
  6. \\ 反斜杠(\)
  7. \' 单引号('),在字符串以单引号标示时使用,例如'He said, \'hey.\''

转换为字符串

  1. 1、toString()方法
  2. toString()方法可见于数值、布尔值、对象和字符串值。(没错,字符串值也有 toString()方法,
  3. 该方法只是简单地返回自身的一个副本。)null 和 undefined 值没有 toString()方法。
  4. let age = 11;
  5. let ageAsString = age.toString(); // 字符串"11"
  6. let found = true;
  7. let foundAsString = found.toString(); // 字符串"true"
  8. 默认情况下,toString()返回数值的十进制字符串表示。而通过传入参数,可以得到数值的二进制、八进制、十六进制,或者其他任何有效基数的字符串表示,比如:
  9. let num = 10;
  10. console.log(num.toString()); // "10"
  11. console.log(num.toString(2)); // "1010"
  12. console.log(num.toString(8)); // "12"
  13. console.log(num.toString(10)); // "10"
  14. console.log(num.toString(16)); // "a"
  1. 2 String()
  2.  如果值有 toString()方法,则调用该方法(不传参数)并返回结果。
  3.  如果值是 null,返回"null"。
  4.  如果值是 undefined,返回"undefined"。
  5. let value1 = 10;
  6. let value2 = true;
  7. let value3 = null;
  8. let value4;
  9. console.log(String(value1)); // "10"
  10. console.log(String(value2)); // "true"
  11. console.log(String(value3)); // "null"
  12. console.log(String(value4)); // "undefined"

模板字面量

  1. ECMAScript 6 新增了使用模板字面量定义字符串的能力。与使用单引号或双引号不同,模板字面量
  2. 保留换行字符,可以跨行定义字符串:
  1. 字符串插值通过在${}中使用一个 JavaScript 表达式实现:
  2. let value = 5;
  3. let exponent = 'second';
  4. // 以前,字符串插值是这样实现的:
  5. let interpolatedString =
  6. value + ' to the ' + exponent + ' power is ' + (value * value);
  7. // 现在,可以用模板字面量这样实现:
  8. let interpolatedTemplateLiteral =
  9. `${ value } to the ${ exponent } power is ${ value * value }`;
  1. // Unicode 示例
  2. // \u00A9 是版权符号
  3. console.log(`\u00A9`); // ©
  4. console.log(String.raw`\u00A9`); // \u00A9
  5. // 换行符示例
  6. console.log(`first line\nsecond line`);
  7. // first line
  8. // second line

3-2 typeof 操作符

  1. let message = "some string";
  2. console.log(typeof message); // "string"
  3. console.log(typeof(message)); // "string"
  4. console.log(typeof 95); // "number"
  1. 注意typeof在某些情况下返回的结果可能会让人费解,但技术上讲还是正确的。比如,调用typeof null 返回的是"object"。这是因为特殊值 null 被认为是一个对空对象的引用。