2.4 变量

可以将变量想象为盒子,盒子里存放着变量的值,这个值可以是数值,字符串,也可以是对象的地址

常用大写字母表示“硬编码(hard-coded)”的常量。或者,换句话说就是,当值在执行之前或在被写入代码的时候,我们就知道值是什么了。

2.5 数据类型

  • number 用于任何类型的数字:整数或浮点数,在 ±(253-1) 范围内的整数。
  • bigint 类型用于存储任意长度的整数, 在整数后加 n,如 873762671287282863818373n
  • string 用于字符串:一个字符串可以包含 0 个或多个字符,所以没有单独的单字符类型。
  • boolean 用于 true 和 false。
  • null 用于未知的值,typeof null 的结果是 “object”。这是官方承认的 typeof 的行为上的错误,这个问题来自于 JavaScript 语言的早期,并为了兼容性而保留了下来。null 绝对不是一个 object。null 有自己的类型,它是一个特殊值。
  • undefined 用于未定义的值
  • object 用于更复杂的数据结构。
  • symbol 类型用于创建对象的唯一标识符

在 JavaScript 语言中没有一个特别的 “function” 类型。函数隶属于 object 类型。但是 typeof 会对函数区分对待,并返回 “function”。这也是来自于 JavaScript 语言早期的问题。从技术上讲,这种行为是不正确的,但在实际编程中却非常方便。

2.6 浏览器交互

alert 显示信息。

prompt 显示信息要求用户输入文本。点击确定返回文本,直接敲回车得到空字符串,点击取消或按下 Esc 键返回 null。

confirm 显示信息等待用户点击确定或取消。点击确定返回 true,点击取消或按下 Esc 键返回 false。

  1. "use strict";
  2. let name = prompt("your name?", "name");
  3. let userConfirm = confirm(`Is ${name} your name?`);
  4. if (userConfirm) {
  5. alert(`hello ${name}`);
  6. }

2.7 类型转换

Number(undefined) === NaN

Number(null) === 0

5 个 falsy 值:NaN, 0, ‘’, null, undefined

-可以将字符串转换为数值: -‘123’ === -123

+可以将数值转换为字符串: ‘1’ + 23 === ‘123’

2.8 基础运算

求幂 **

  1. alert(4 ** (1 / 2)); // 2(1/2 次方与平方根相同)
  2. alert(8 ** (1 / 3)); // 2(1/3 次方与立方根相同)

+可以连接字符串,也可以将非数字转化为数字

  1. 1 +
  2. "2" + // "12"
  3. "1" + // 1
  4. "2" +
  5. +"3" + // 5
  6. true + // 1
  7. ""; // 0

赋值 = 返回一个值

  1. let a = 1,
  2. b = 2;
  3. let c = 1 + (a = b + 1);
  4. a = b = c = 2 + 2; // 链式赋值

习题

  1. "" + 1 + 0 = "10"; // (1)
  2. "" - 1 + 0 = -1; // (2)
  3. true + false = 1;
  4. 6 / "3" = 2;
  5. "2" * "3" = 6;
  6. 4 + 5 + "px" = "9px";
  7. "$" + 4 + 5 = "$45";
  8. "4" - 2 = 2;
  9. "4px" - 2 = NaN;
  10. 7 / 0 = Infinity;
  11. " -9 " + 5 = " -9 5"; // (3)
  12. " -9 " - 5 = -14; // (4)
  13. null + 1 = 1; // (5)
  14. undefined + 1 = NaN; // (6)
  15. " \t \n" - 2 = -2; // (7)

解析

  1. 有字符串的加法 “” + 1,首先会将数字 1 转换为一个字符串:”” + 1 = “1”,然后我们得到 “1” + 0,再次应用同样的规则得到最终的结果。
  2. 减法 -(像大多数数学运算一样)只能用于数字,它会使空字符串 “” 转换为 0。
  3. 带字符串的加法会将数字 5 加到字符串之后。
  4. 减法始终将字符串转换为数字,因此它会使 “ -9 “ 转换为数字 -9(忽略了字符串首尾的空格)。
  5. null 经过数字转换之后会变为 0。
  6. undefined 经过数字转换之后会变为 NaN。
  7. 字符串转换为数字时,会忽略字符串的首尾处的空格字符。在这里,整个字符串由空格字符组成,包括 \t、\n 以及它们之间的“常规”空格。因此,类似于空字符串,所以会变为 0。

总结

  • +只有在两个元中有一元是字符串,才会把另一个转换为字符串
  • +若做一元运算,则会把非数字转换为数字
  • -/*都会试图把元转换为数字,字符串转换为数字时会忽略首尾处的空格

2.9 数值比较

  • 当对不同类型的值进行比较时,它们会先被转化为数字(不包括严格相等检查)再进行比较。
  • 在非严格相等 == 下,null 和 undefined 相等且各自不等于任何其他的值。

2.11 逻辑运算

一个或运算 || 的链,将返回第一个真值,如果不存在真值,就返回该链的最后一个值。

&& 与运算返回第一个假值,如果没有假值就返回最后一个值。

与运算 && 的优先级比或运算 || 要高。所以代码 a && b || c && d 跟 && 表达式加了括号完全一样:(a && b) || (c && d)。

两个非运算 !! 有时候用来将某个值转化为布尔类型:

  1. alert(!!"non-empty string"); // true
  2. alert(!!null); // false

2.12 空值合并运算符 ??

null/undefined 为未定义,??返回第一个已定义的值

  1. // 当 height 的值为 null 或 undefined 时,将 height 的值设置为 100
  2. height = height ?? 100;

2.16 函数表达式

回调函数

将函数作为参数传递,当符合某个条件时就调用这个函数

  1. function ask(question, yes, no) {
  2. if (confirm(question)) yes();
  3. else no();
  4. }
  5. ask(
  6. "Do you agree?",
  7. function () {
  8. alert("You agreed.");
  9. }, // 匿名函数作为回调函数
  10. function () {
  11. alert("You canceled the execution.");
  12. }
  13. );

函数可以被视为一个 行为(action)。

我们可以在变量之间传递它们,并在需要时运行。

代码块内的函数声明外部不可见