一、临时死区
临时死区:用let和const声明的变量,放在‘临时死区’,使用let声明的变量、const声明的常量的作用域不会被提升
二、在循环中使用var的情况
let arr = []
for(var i=0;i<5;i++){ //var定义的i是全局的,若将var改为let,则输出0 1 2 3 4
arr.push(function(){ //arr是一个函数数组:数组的每个单元都是函数
console.log(i)
})
}
arr.forEach(function(item){ //item是函数:输出5个5
item()
})
三、解构赋值:
1.Rest运算符:”…”
(1)当迭代器使用:会按顺序遍历容器中的元素
function fun(x,y,z){
console.log(x,y,z)
}
let arr = [11,22,33]
fun(...arr) //'...'运算符的作用是一个迭代器:依次遍历数组中的元素
(2)替代函数的内置属性arguments
function fun(...args){
console.log(args)
}
let arr = [11,22,33]
fun(arr)
(3)通过解构赋值可以简化变量的赋值
let arr = [11,22,33]
let [a,b,c] = arr
console.log(a)
(4)通过”…”把特定的元素放在变量里
let [a,...arr] = [11,22,33] //将11赋给a,将22,33赋给arr,arr就是一个数组
console.log(a)
console.log(arr)
(5)通过解构来交换变量的值
let a = 10
let b = 20; //必须要以分号结尾
[a,b] = [b,a]
console.log(a,b)
2.对象的解构
(1)将对象的属性解构出来赋给变量
let obj = {
id:1001,
userName:'关羽',
sex:'男'
}
let { id,userName,sex } = obj //变量名必须和对象的属性名相同
console.log('编号:',id)
console.log('用户名:',userName)
console.log('性别:',sex)
(2)解构多层对象
let obj = {
id:1001,
userName:'关羽',
sex:'男',
score:{
html: 98,
css:95,
js: 85
}
}
let { id,userName,sex,score:{html,css,js} } = obj //变量名必须和对象的属性名相同
console.log('编号:',id)
console.log('用户名:',userName)
console.log('性别:',sex)
console.log('css的成绩:',css)
(3)在解构时可以给变量取别名
let obj = {
id:1001,
userName:'关羽',
sex:'男',
score:{
html: 98,
css:95,
js: 85
}
}
let { id:userId,userName:name } = obj //userId是id的别名,name是userName的别名
console.log('编号:',userId)
console.log('用户名:',name)
console.log('性别:',sex)
3.、模板字符串:使用反引号``和${ 变量名 } 将字符串常量和变量写在一个串里。就不需要使用’+’进行字符串的拼接
4.Symbol类型
(1)ES5的数据类型:number、string、boolean、bigint、null、undefined、object
(2)ES6新增的Symbol:表示一个唯一的值
a、直接创建:let 变量名 = Symbol
b、间接创建:传字符串 let 变量名 = Symbol(字符串)
5.Set集合:是一种数据结构,里面不能存放重复的值。可以用于数组去重、字符串去重
(1)创建方式:
a、使用new运算符:let 变量 = new Set()
b、通过数组来创建:let 变量名 = new Set( [1,2,3,5,6] ) ,去除重复的元素
let s1 = new Set() //创建一个空集合
console.log(s1)
let arr = [1,2,3,2,0,3,5]
let s2 = new Set(arr)
console.log(s2)
(2)常用的方法:
a、add(val):向集合中添加元素
b、delete(val):删除集合中的元素。删除成功返回true,删除失败返回false
c、has(val):判断val在集合中是否存在,若存在返回true,不存在返回false
d、clear():清空集合,没有返回中
e、values():获取的是集合中所有value
f、keys():获取集合中的key
强调:Set集合也是key-value格式,它的key和value是相同的
(3)属性:size 存放的是集合中元素的个数
(4)遍历方法:
a、for … of
for(let i of s1.keys()){
console.log(i)
}
b、forEach
s1.forEach(function(value,key){
console.log(value+' ---- '+key)
})
(5)集合运算
a、并集
let setA = new Set([4,5,6])
let setB = new Set([5,6,7])
let bj = new Set([...setA,...setB])
console.log(bj)
b、交集
let arr = [...setA] //解构集合setA,将其转换成数组
//对arr进行过滤:使用filter函数
//依次从arr中取出元素传递给item,在函数体内设置筛选条件,将满足条件的元素返回给temp
let temp = arr.filter(function(item){
if(setB.has(item)){
return item
}
})
console.log(temp)
c、差集
let arr = [...setA] //解构集合setA,将其转换成数组
//对arr进行过滤:使用filter函数
//依次从arr中取出元素传递给item,在函数体内设置筛选条件,将满足条件的元素返回给temp
let temp = arr.filter(function(item){
if(setB.has(item)==false){
return item
}
})
console.log(temp)
问题1:创建Set集合时为什么用new运算符?
(1)Set是一个构造函数,凡是用构造函数创建对象时都要用new
6、WeakSet集合:只是一个对象集合。即集合中只能存放对象。它支持 add,has 和 delete 方法
课堂练习:创建构造函数Student,它的属性有id、name、html、CSS、js。
(1)利用该构造函数创建5对象,并将这5个对象存放到Set集合中
(2)把css成绩不及格的对象挑选出来
function Student(id, name, html, css, js) {
this.id = id,
this.name = name,
this.html = html,
this.css = css,
this.js = js
}
let s1 = new Student(1, 'A', 80, 92, 73)
let s2 = new Student(2, 'B', 100, 20, 85)
let s3 = new Student(3, 'C', 60, 59, 70)
let s4 = new Student(4, 'D', 88, 69, 75)
let s5 = new Student(5, 'E', 91, 52, 77)
let setA = new Set()
setA.add(s1).add(s2).add(s3).add(s4).add(s5)
let t = [...setA].filter(function(item){
if (item.css<60) {
return item
}
})
console.log(t);