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。
"use strict";
let name = prompt("your name?", "name");
let userConfirm = confirm(`Is ${name} your name?`);
if (userConfirm) {
alert(`hello ${name}`);
}
2.7 类型转换
Number(undefined) === NaN
Number(null) === 0
5 个 falsy 值:NaN, 0, ‘’, null, undefined
-可以将字符串转换为数值: -‘123’ === -123
+可以将数值转换为字符串: ‘1’ + 23 === ‘123’
2.8 基础运算
求幂 **
alert(4 ** (1 / 2)); // 2(1/2 次方与平方根相同)
alert(8 ** (1 / 3)); // 2(1/3 次方与立方根相同)
+可以连接字符串,也可以将非数字转化为数字
1 +
"2" + // "12"
"1" + // 1
"2" +
+"3" + // 5
true + // 1
""; // 0
赋值 = 返回一个值
let a = 1,
b = 2;
let c = 1 + (a = b + 1);
a = b = c = 2 + 2; // 链式赋值
习题
"" + 1 + 0 = "10"; // (1)
"" - 1 + 0 = -1; // (2)
true + false = 1;
6 / "3" = 2;
"2" * "3" = 6;
4 + 5 + "px" = "9px";
"$" + 4 + 5 = "$45";
"4" - 2 = 2;
"4px" - 2 = NaN;
7 / 0 = Infinity;
" -9 " + 5 = " -9 5"; // (3)
" -9 " - 5 = -14; // (4)
null + 1 = 1; // (5)
undefined + 1 = NaN; // (6)
" \t \n" - 2 = -2; // (7)
解析
- 有字符串的加法 “” + 1,首先会将数字 1 转换为一个字符串:”” + 1 = “1”,然后我们得到 “1” + 0,再次应用同样的规则得到最终的结果。
- 减法 -(像大多数数学运算一样)只能用于数字,它会使空字符串 “” 转换为 0。
- 带字符串的加法会将数字 5 加到字符串之后。
- 减法始终将字符串转换为数字,因此它会使 “ -9 “ 转换为数字 -9(忽略了字符串首尾的空格)。
- null 经过数字转换之后会变为 0。
- undefined 经过数字转换之后会变为 NaN。
- 字符串转换为数字时,会忽略字符串的首尾处的空格字符。在这里,整个字符串由空格字符组成,包括 \t、\n 以及它们之间的“常规”空格。因此,类似于空字符串,所以会变为 0。
总结
- +只有在两个元中有一元是字符串,才会把另一个转换为字符串
- +若做一元运算,则会把非数字转换为数字
- -/*都会试图把元转换为数字,字符串转换为数字时会忽略首尾处的空格
2.9 数值比较
- 当对不同类型的值进行比较时,它们会先被转化为数字(不包括严格相等检查)再进行比较。
- 在非严格相等 == 下,null 和 undefined 相等且各自不等于任何其他的值。
2.11 逻辑运算
一个或运算 || 的链,将返回第一个真值,如果不存在真值,就返回该链的最后一个值。
&& 与运算返回第一个假值,如果没有假值就返回最后一个值。
与运算 && 的优先级比或运算 || 要高。所以代码 a && b || c && d 跟 && 表达式加了括号完全一样:(a && b) || (c && d)。
两个非运算 !! 有时候用来将某个值转化为布尔类型:
alert(!!"non-empty string"); // true
alert(!!null); // false
2.12 空值合并运算符 ??
null/undefined 为未定义,??返回第一个已定义的值
// 当 height 的值为 null 或 undefined 时,将 height 的值设置为 100
height = height ?? 100;
2.16 函数表达式
回调函数
将函数作为参数传递,当符合某个条件时就调用这个函数
function ask(question, yes, no) {
if (confirm(question)) yes();
else no();
}
ask(
"Do you agree?",
function () {
alert("You agreed.");
}, // 匿名函数作为回调函数
function () {
alert("You canceled the execution.");
}
);
函数可以被视为一个 行为(action)。
我们可以在变量之间传递它们,并在需要时运行。
代码块内的函数声明外部不可见