1.let关键字
let用于声明变量,可以声明一个或多个变量
let的特性
1.变量不能重复声明
2.块级作用域
let声明的变量就是块级作用域,简单来说就是:只在花括号包起来的代码块里面生效,
console.log会报错。
当然,块级作用域不是只有花括号这么一种简单的情形,在if、else、while、for循环等语句的花括号中使用let,都是块级作用域。
3.不存在变量提升
所谓变量提升就是,如果变量在声明之前就被使用,是不报错的,因为声明变量的语句执行顺序会提前
这段的代码输出的结果是undefined,不是报错,它的真实执行顺序是:
var song
console.log(song)
song = '恋爱达人'
上述例子是用var声明变量,存在变量提升。如果使用let声明变量,就不逊在变量提升,就会报错 。
4.不影响作用域链
在块级作用域中let声明变量和函数,函数内部没有school变量,调用函数,函数仍可以用作用域链的规则向上查找,并且使用到school,这证明了作用域链条没有受到影响。
2.const关键字
const用来声明常量,使用时一般有如下如则:
1.声明时要赋值
2.常量一般要大写(潜规则)
3.常量的值不能修改
4.有块级作用域
5.const声明的数组、对象,如果修改了里面的元素,那么不会报错
因为const声明的变量里面存储的是地址,修改了数组、对象里面的具体数据,但是地址没变,那么就不报错。
3.解构赋值
按照一定的规则,从数组或者对象中提取值,然后对变量赋值
数组解构赋值
对象解构赋值
4.模板字符串
ES5中的字符串用单引号 '' 或者双引号括起来"",ES6提供的模板字符串则是利用反引号
特点
1.声明方式没啥变化
let str = ·这是一个模板字符串·
2.内容中可以出现换行
3.变量拼接
在模板字符串中使用 ${变量名} 就可以实现变量的拼接
5.剪头函数
之前声明函数
let fn = function(){
console.log(1)
}
剪头函数
let fn1 = ()=>{
console.log('剪头函数')
}
特点:
1.this是静态的
this始终指向函数声明时所在作用域下的 this的值
//1. this 是静态的. this 始终指向函数声明时所在作用域下的 this 的值
function getName(){
console.log(this.name);
}
let getName2 = () => {
console.log(this.name);
}
//设置 window 对象的 name 属性
window.name = '尚硅谷';
const school = {
name: "ATGUIGU"
}
// call 方法调用
getName.call(school);
getName2.call(school);
结果:
用call改变箭头函数的this,发现没有改变,它的this依然是声明时所指向的。
2.箭头函数不能实例化对象
3.剪头函数不能使用arguments
在函数中,有一个arguments对象,这是一个类数组对象它包含着调用函数时传入的所有参数,但是在箭头函数中没有arguments。
6.rest参数
ES6引入 rest参数,用于获取函数的实参,用来代替arguments
打印结果,得到的是一个数组,下一步可以方便地使用数组的api
另外有一个注意事项,rest参数必须放在最后一个
7.symbol
symbol是一种原始数据类型,他表示独一无二的值,主要特点有以下几个
1.Symbol的值是唯一的,用来解决命名冲突的问题
2.Symbol值不能与其他数据进行运算
3.Symbol定义的对象属性不能使用for...in循环遍历,但是可以使用 Reflect.ownKeys来获取对象的所有键名
创建symbol有两个方式
symbol的具体使用,主要是向对象中添加属性和方法
8.迭代器
迭代器(lterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署lterator接口,就可以完成遍历操作。|
ES6 创造了一种新的遍历命令 for...of 循环,Iterator 接口主要供 for...of 消费
迭代器的工作原理大概是这样的:
迭代器常用于自定义遍历数据,例如,有一个对象如下:
const banji = {
name: "终极一班",
stus: [
'xiaoming',
'xiaoning',
'xiaotian',
'knight'
],
}
我们想要用for ...of的方式来遍历这个对象里面的stus数组,但是banji自己是一个对象,无法使用for...of遍历,即便能遍历,除了stus,还有一个name需要规避掉,这个情况下,就需要用到迭代器进行自定义设置。代码如下:
//声明一个对象
const banji = {
name: "终极一班",
stus: [
'xiaoming',
'xiaoning',
'xiaotian',
'knight'
],
[Symbol.iterator]() {
//索引变量
let index = 0;
//
let _this = this;
return {
next: function () {
if (index < _this.stus.length) {
const result = { value: _this.stus[index], done: false };
//下标自增
index++;
//返回结果
return result;
}else{
return {value: undefined, done: true};
}
}
};
}
}
//遍历这个对象
for (let v of banji) {
console.log(v);
}
通过设置,可以在循环遍历的时候,按照我们的意愿去实现。
9.生成器
生成器函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。
生成器就是一个特殊的函数,主要用来异步编程。
10 set(集合)
set是一种新的数据结构,类似于数组,但是它成员的值都是唯一的。一般会传入一个可迭代的参数,并且会自动去重。
集合实现了iterator接口,所以可以使用『扩展运算符』和『for ...of...』进行遍历。
声明set
传入含有重复数据的数组
打印结果,自动去掉重复的
set还有若干方法可以使用
set的一些方便用法
数组去重
求交集
两个数组的交集,每个数组都用set去重一次
var arr1 = [1,2,3,3,4,5,5,5,7,8]
var arr2 = [2,3,4,4,6]
// 求L两个数组的交集
let result = [...new Set(arr1)].filter(item =>{
let ar2 = new Set(arr2)
if(ar2.has(item)){
return true
}else{
return false
}
})
console.log(result);
当然也可以采用简写形式
let result1 = [...new Set(arr1)].filter(item => new Set(arr2).has(item))
console.log(result1);
求并集
11 map
ES6提供了Map 数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map也实现了iterator接口,所以可以使用「扩展运算符』和『for ....f...』进行遍历。Map的属性和方法: