10.1 对象的展开运算符
- 展开对象
- 对象的展开,把属性罗列出来,用逗号分隔,放到一个{}中,构成新对象
const apple = {
color:'红色',
shape:'球形',
taste:'甜'
}
console.log({...apple});
const apple = {
color:'红色',
shape:'球形',
taste:'甜'
}
const pen = {
color:'黑色',
shape:'圆柱形',
use:'写字'
}
console.log({...pen,apple});
10.2 对象展开运算符的注意事项
- 空对象的展开(如果展开一个空对象,则没有任何效果)
console.log({...{},a:1});
- 非对象的展开(如果展开的不是对象,则会自动将其转为对象,再将其属性罗列出来)
console.log({...1});
console.log(new Object(1));
console.log({...undefined});
console.log({...null});
console.log({...true});
- 如果展开运算符后面是字符串,它会自动转成一个类似数组的对象,因此返回的不是空对象
console.log({...'alex'});
console.log([...'alex']);
const apple = {
feature:{
taste:'甜'
}
};
const pen = {
feature:{
color:'黑色',
shape:'圆柱形'
},
use:'写字'
}
10.3 对象展开运算符的应用
const a = {x:1,y:2};
const c = {...a};
console.log(c,c === a);
const logUser = userParam => {
const defaultParam = {
username:'ZhangSan',
age:0,
sex:'male'
}
const param = {...defaultParam,...userParam};
console.log(param.username);
}
logUser()
11.1 Set是什么
- Set是一系列无序,没有重复值的数据集合
- Set没有下标去标示每一个值,所以Set是无序的,也不能像数组那样通过下标去访问Set的成员
const s = new Set();
s.add(1);
s.add(2);
s.add(1);
console.log(s);
11.2 Set实例的方法和属性
const s = new Set();
s.add(2).add(1);
console.log(s);
console.log(s.has(1));
console.log(s.has(0));
s.delete(2)
console.log(s);
s.clear()
console.log(s);
s.forEach(function(value,key,set){
console.log(value,key,set);
},console.log(this))
console.log(s,111);
s.forEach((value,key,set)=>{
console.log(value,key,set);
},console.log(this))
console.log(s.size);
console.log(s);
11.3 Set构造函数的参数
const s = new Set([1,2,2]);
console.log(s);
<p>1</p> // nodelist
<p>2</p>
<p>3</p>
console.log(new Set('hih'));
function func(){
console.log(new Set(arguments));
}
func(1,2,5);
console.log(new Set(document.querySelectorAll('p')));
const s = new Set([1,2,1]);
console.log(new Set(s)===s);
console.log(s);
11.4 Set的注意事项
- 什么时候用Set?
- 数组和字符串去重时
- 不需要通过下标访问,只需要遍历时
- 为了使用Set提供的方法和属性时(add delete clear has forEach size)
const s = new Set([NaN,2,NaN])
const s = new Set([1,2,1]);
console.log(s);
const s = new Set();
s.add({}).add({})
console.log({}==={});
console.log(s);
11.5 Set的应用
const s = new Set([1,2,1]);
console.log(s);
console.log([...s]);
console.log([...new Set([1,2,1,1,1,3])]);
const s = new Set('abbbacbd');
console.log([...new Set('abbbacbd')].join());
const s = new Set(document.querySelectorAll('p'));
console.log(s);
s.forEach(function(elem){
elem.style.color = 'red'
elem.style.backgroundColor = 'yellow'
})
12.1 Map是什么
const person = {
name:'alex',
age:18
}
const m = new Map();
m.set('name','alex')
console.log(m);
const obj = {
name:'alex',
true:'true'
}
const m = new Map();
m.set('name','alex');
m.set(true,'true');
m.set({},'object');
m.set(new Set([1,2]),'set');
m.set(undefined,'undefined');
console.log(m);
12.2 Map实例的方法和属性
const m = new Map();
m.set(true,'true').set('age',18).set('age',20);
console.log(m);
console.log(m.get(true));
console.log(m.get('age'));
console.log(m.get(false));
console.log(m.has('age'));
console.log(m.has('undefined'));
m.delete('age');
console.log(m);
m.clear();
console.log(m);
m.forEach(function(value,key,map){
console.log(value,key,map,111);
})
console.log(m.size);
console.log(m);
12.3 Map构造函数的参数
console.log(
new Map([
['name','alex'],
['age',18]
])
);
const s = new Set([
['name','alex'],
['age',18]
])
console.log(new Map(s));
console.log(s);
const m1 = new Map([
['name','alex'],
['age',18]
])
console.log(m1);
const m2 = new Map(m1);
console.log(m2,m2===m1);
12.4 Map的注意事项
const m = new Map();
console.log(m.set(NaN,1).set(NaN,2))
12.5 Map的应用
<p>1</p>
<p>2</p>
<p>3</p>
const [p1,p2,p3] = document.querySelectorAll('p')
console.log(p1,p2,p3);
const m = new Map();
m.set(p1,'red').set(p2,'green').set(p3,'blue');
1
const m = new Map([
[p1,'red'],
[p2,'green'],
[p3,'blue'],
])
console.log(m);
m.forEach((value,elemt)=>{
elemt.style.color = value
})
<p>1</p>
<p>2</p>
<p>3</p>
const m = new Map([
[p1,{
color:'red',
backgroundColor:'yellow',
fontSize:'40px'
}],
[p2,{
color:'green',
backgroundColor:'pink',
fontSize:'40px'
}],
[p3,{
color:'blue',
backgroundColor:'orange',
fontSize:'40px'
}],
])
console.log(m);
m.forEach((prop,elemt)=>{
for(const p in prop){
elemt.style[p]=prop[p]
}
})
13.1 iterator
const it = [1,2][Symbol.iterator]();
console.log(it.next());
console.log(it.next());
console.log(it.next());
13.2 iterator解惑
console.log([][Symbol.iterator]());
13.3 for...of的用法1
const arr = [1,2,3];
const it = arr[Symbol.iterator]();
let next = it.next();
console.log(next);
while(!next.done){
console.log(next.value);
next = it.next();
console.log(next);
}
for(const item of arr){
console.log(item);
}
13.4 for...of的用法2
const arr = [1,2,3];
for(const item of arr){
if(item === 2){
continue;
}
console.log(item);
}
const arr = [1,2,3];
console.log(arr.keys());
for(const key of arr.keys()){
console.log(key);
}
for(const value of arr.values()){
console.log(value);
}
for(const entries of arr.entries()){
console.log(entries);
}
for(const [index,value] of arr.entries()){
console.log(index,value);
}
13.5 原生可遍历与非原生可遍历
const person = {sex:'male',age:18}
person[Symbol.iterator] = () => {
let index = 0;
return {
next(){
index++
if(index === 1){
return {
value:person.age,
done:false
}
}else if(index === 2){
return {
value:person.sex,
done:false
}
}else {
return {
done:true
}
}
}
}
}
for(const item of person){
console.log(item);
}
const obj = {
0:'alex',
1:'male',
length:2
};
obj[Symbol.iterator] = () => {
let index = 0;
return {
next(){
let value,done;
if(index<obj.length){
value = obj[index];
done;false
}else{
value = undefined;
done = true;
}
index++;
return{
value,done
}
}
}
}
obj[Symbol.iterator] = Array.prototype[Symbol.iterator];
for(const item of obj){
console.log(item);
}
13.6 使用iterator的场合
console.log(...new Set([1,2,3]));
const [a,b] = [...new Set([3,4])]