# 类型、值和变量
# 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