# 类型、值和变量
# 1、数值
10; // 十进制
0xff; // 十六进制
0b10101; // 二进制
0o377; // 八进制
3.14; // 浮点值
1_000_000; // 分隔符
1234n; // BigInt类型数值
1
2
3
4
5
6
7
2
3
4
5
6
7
BigInt 只能表示整数,Math 对象不接收 BigInt 操作数
# 2、文本
三种方式创建字符串字面量
const a = 'test1';
const b = 'test2';
const c = `test3`;
const d =
'111\
ddd'; // 每行末尾加一个反斜杠(\)从而把字符串字面量写到多行上。
1
2
3
4
5
6
2
3
4
5
6
字符串是不可修改的
# 3、null 和 undefined
- undefined 表示一种系统级别、意料之外或类似错误的没有值
- null 表示程序级别、正常或意料之中的没有值
# 4、不可修改的原始值与可修改的对象引用
原始值(undefined、null、布尔值、数值和字符串)与对象(包括数组和函数)有一个本质的区别。原始值是不可修改的
- 原始值是按值比较的
- 对象不是按值比较的,两个不同的对象即使拥有完全相同的属性和值,它们也不相等。
let a = { x: 1 },
b = { x: 1 };
a === b; // false
let c = [],
d = [];
c === b; // false
let e = c;
e[0] = 1;
e === c; // true,e和c引用同一个对象,所以它们相等
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 4、类型转换
值 | 转换为字符串 | 转换为数值 | 转换为布尔值 |
---|---|---|---|
undefined | "undefined" | NaN | false |
null | "null" | 0 | false |
true | "true" | 1 | true |
false | "false" | 0 | false |
"" (空字符串) | "" | 0 | false |
"1.2" (非空,数值) | "1.2" | 1.2 | true |
"one" (非空,非数值) | "one" | NaN | true |
0 | "0" | 0 | false |
-0 | "0" | -0 | false |
1(有限,非零) | "1" | 1 | true |
Infinity | "Infinity" | Infinity | true |
-Infinity | "-Infinity" | -Infinity | true |
NaN | "NaN" | NaN | false |
{}(任何对象) | - | - | true |
[](空数组) | "" | 0 | true |
[9] (一个数值元素) | "9" | 9 | true |
['a'] (任何其他数组) | "使用join()方法" | - | true |
function(){} (任何函数) | "-" | - | true |
除 null 和 undefined 之外的所有值都有 toString()方法
# 5、使用 var 的变量声明
- 使用 var 声明的变量不具有块作用域。这种变量的作用域仅限于包含函数的函数体,无论它们在函数中嵌套的层次有多深。
- 如果在函数体外部使用 var,则会声明一个全局变量。
- 通过全局 var 创建的这个属性不能使用 delete 操作符删除
- 使用 var 多次声明同名变量是合法的
- 在使用 var 声明变量时,该声明会被提高(或提升)到包含函数的顶部。、
# 6、解构赋值
let [x, y] = [1, 2]; // 相当于 let x=1, y=2
[x, y] = [x + 1, y + 1]; // 相当于 x = x + 1, y = y + 1
[x, y] = [y, x]; // 交换两个变量的值
[x, y]; // => [3,2]: 递增和交换后的值
1
2
3
4
2
3
4