1.let和const命令
1-1.let和var的区别
加let的作用域是{},var的作用域是一个function内。都不加的话就不是定义变量了,而是定义属性,可以通过delete命令删除。
1-2.let很适合for循环结构,用完即释放,内部可调用
for (let i = 0; i < 10; i++) {}
console.log(i);
//ReferenceError: i is not defined
1-3.解决变量提升的bug
先调用,后声明var类型的变量,回输出undefined,不报错。而let的会报错。重点内容
1-4.暂时性死区
let的优先级更高,可以理解为比局部变量范围更宅的变量,变量可以先使用后定义,是否会报undefined错误取决于是否加载到(一边加载,一边执行)
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
1-5.暂时性死区结束
let和const关键字可以定义死区的结束
if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
1-6.在同一个代码块不允许重复定义
var和不加的情况,是可以重复定义一个变量的,后面定义的会覆盖前面的,而let就不行,会报错。
// 报错
function () {
let a = 10;
var a = 1;
}
// 报错
function () {
let a = 10;
let a = 1;
}
1-7.不执行并不代表不预加载
就算是false,后面的代码还是会预读,有错误也会报错,但是var的优先级比空的那个高。
var tmp = new Date();
function f() {
console.log(tmp);
if (false) {
var tmp = 'hello world';
}
}
f(); // undefined
1-8.指向内存地址不可变
const
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
2.变量的解析赋值
2-1.花式赋值
多样化的赋值方式
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3
let [ , , third] = ["foo", "bar", "baz"];
third // "baz"
let [x, , y] = [1, 2, 3];
x // 1
y // 3
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
2-2.使用默认值
let [foo = true] = [];
foo // true
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
2-3.也可以直接给一个对象赋值
let { bar, foo } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"
let { baz } = { foo: "aaa", bar: "bbb" };
baz // undefined
3.字符串的扩展
3-1.字符的Unicode表示法
可以用一个Unicode串表示字符串,和直接输入字符串是等效的。这个好像EC5也可以。
'\u4f60\u597d\u554a\uff0c\u4e16\u754c\u3002'
3-2.of遍历字符串,in遍历数组
for (let codePoint of 'foo') {
console.log(codePoint)
}
// "f"
// "o"
// "o"
3-3.repeat方法
重复一个字符串n次。
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""
4.正则的扩展
4-1.实例化一个RegExp对象
var regex = new RegExp('xyz', 'i');
var regex = new RegExp(/xyz/i);
// 等价于
var regex = /xyz/i;
4-2.TODO
5.数值的扩展
5-1.二进制和八进制表示法
要表示2,8,16进制,可以直接用0b,0o,0x开头,后面直接加进制就可以了。
0b111110111 === 503 // true
0o767 === 503 // true
0xa === 10 //true
6.函数的扩展
6-1.可以使用形式参数了(默认值)
function log(x, y = 'World') {
console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello
6-2.函数也有length属性
函数的length属性表示该函数没有指定默认值的参数的个数
(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2
6-3.reset参数(略略略)
形参用…,内部通过of循环,实现
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) // 10