这篇笔记讲了 ES6 新增的声明变量的方法,箭头函数,剩余参数 扩展运算符(…args),和ES6中新增的数组字符串方法,和 Set 数据结构
let 声明的变量只在块级作用域有效
原来的作用域是一个函数,用 let 的话作用域变成了 {}
之间
let 可以防止循环变量变成全局变量
for(let i = 0;i < 2;i++) {}
console.log(i);
// 报错,i 变量未定义
// 暂时性死区
var num = 10;
if(true) {
let num = 20;
console.log(num);
}
// 输出结果 20
const PI = 3.14;
PI = 100;
// 报错:TypeError: Assignment to constant variable.
const arr = [100,200];
arr[0] = 'a';
arr[1] = 'b';
console.log(arr);
// 输出:['a','b']
arr = ['a','b'];
// 报错
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
存在变量提升 | 不存在变量提升 | 不存在变量提升 |
值可更改 | 值可更改 | 值不可更改 |
let arr = [1,2,3];
let [a,b,c] = arr;
console.log(a);
// 输出 1
里面不止可以使用 let 来定义,还可以使用 var
假如变量名比数组里面的内容多,则未分配到内容的变量值为 undefined
对象结构同理:
let person = { name: '菜鸟小铭', age: 10 }
let { name, age } = person;
console.log(name);
console.log(age);
// 输出:菜鸟小铭 10
// 可以使用键值对的形式来获取变量
let {name: myname,age: myage} = person;
// 冒号左侧仅用于匹配,冒号右侧的变量用来赋值
console.log(myname);
console.log(myage);
// 输出:菜鸟小铭 10
() => {}
小括号放形参,大括号放函数体const fn = () => {
console.log('菜鸟小铭');
}
function sum(num1,num2) {
return num1 + num2;
}
// 上下两个函数等价
const sum = (num1,num2) => num1 + num2;
...args
代表接收所有参数const sum = (...args) => {
let total = 0;
args.forEach(item => total += item);
}
sum(10, 20, 30);
let arr = [1, 2, 3];
let [num, ...num2] = arr;
console.log(num); // 1
console.log(num2); // [2, 3]
...arr
把数组或者对象转为参数序列let arr = [1, 2, 3];
console.log(...ary);
// 等价于 console.log(1,2,3);
// 输出 1 2 3
let arr1 = [1, 2];
let arr2 = [3, 4];
let arr3 = [...arr1, ...arr2];
// 也可以使用 push 方法合并数组
arr1.push(...arr2);
apply(this, [arr])
方法有点像,apply也可以把数组作为参数去调用,只不过他多了一个改变 this 指向的方法var divs = document.getElementsByTagName('div');
const ary = [...divs];
变成真正的数组以后可以使用数组的方法 (例如 push)
方法2:使用 Array.from
方法
// divs 是一个伪数组
var arr = Array.from(divs);
var arr = Array.from(divs, item => item * 2);
let arr = [{
id: 1,
name: '菜鸟小铭'
}];
let target = arr.find((item, index) => item.id == 1);
// 输出 arr里的对象
let arr = [1, 5, 10, 15];
let index = arr.findIndex((value, index) => value > 9);
console.log(index); // 2
let arr = [1, 2, 3];
arr.includes(2);
// true
let name = `菜鸟小铭`;
let name = '菜鸟小铭';
let sayHello = `hello,${name}`;
// 输出 hello,菜鸟小铭
let name = `菜
鸟
小
铭`;
console.log(name);
// 菜
// 鸟
// 小
// 铭
const name = () => {
return '菜鸟小铭';
};
let sayHello = `${name()} hello`;
// 菜鸟小铭 hello
let str = 'noobming';
str.startsWith('noob');
// true
str.endsWith('ming');
// true
'noobming'.repeat(2);
// "noobmingnoobming"
set 结构类似于数组,但是成员的值都是唯一的,没有重复的值
set 是使用构造函数生成 set 数据结构的
创建的时候可以传递数组进去,会自动转换为 set 数据结构(不能像数组一样直接在构造函数中写值,需要把他包裹成一个数组传进去)
set 数据结构里面有 size 属性,表示里面有多少种类的值
const s = new Set(['1', '2', '3']);
console.log(s.size);
// 数组作为参数
const s1 = new Set([1, 2, 2]);
console.log(s1.size);
// 输出 2
const s = new Set([1, 2, 2]);
// 转化为数组
const arr = [...s];
set 常用方法:
set 遍历:同样也用 forEach()
方法
s.forEach(value => console.log(value));