ES6知识点大总结

-----------------------------------小知识--------------------------

先预习下热热身-------------------------------------------------

给变量赋值 var a=110.

解构赋值:把数组或对象中的数据拿出来赋给变量。

解构赋值需要保证等号两侧有相同的解构

ES6的写法可以通过bable(http://www.babeljs.cn/)转换成ES5的写法.

一 数组的解构赋值

1)数组解构赋值的基本使用(把数组中某些元素拿出来赋给某些变量)

例子:let [a,s,c]=[1,2,3];//a,b,c是三个变量

consol..log(a,b,c)//1,2,3

ES5的写法(“use strict” ; var a=1,b=2,c=3; )

2)数组的解构赋值=两侧的数据不相等的情况

let [a,b,c,d] = [1,2,3];

 console.log(a,b,c)//1,2,3给了a,b,c

console.log(d) //d没有赋值就是 undefined

 let [a,b] = [1,2,3];

console.log(a,b) // a,b,从原数组中去了两数,第一个和第二个就是打印出1,2

let [a, ,b] = [1,2,3];

console.log(a,b) // 打印出第一个和第三个数,不需要第二个弄个可以跳过去打印出1,3

3)没赋值情况下,设置默认值,

 let [a,b,c,d = 110] = [1,2,3];

console.log(a,b,c,d)//再解构赋值时给里面的d没有赋值,就直接设置了默认值,打印出来的是1,2,3,110

 如果赋值了,设置了默认值,就不会使用默认值了!

// let [a,b=110] = [1,2,3];

// console.log(a,b) // 在设置默认值时已经给a,b,赋值1,2了,所以给b设置的默认值无效,直接忽略。

4)关于嵌套解构赋值

let [a,b,c,[m,n,k]]=[1,2,3,["a","b","c"]]

console.log(m)//a

console.log(n)//b

console.log(k)//c

//这里普及一点小知识,拓展运算符如果在这里使用只能放在最后一位,因为它会取当前这一位一致到最后作为一个数组

二 对象的解构赋值(键和名一致可以简写)

1)对象的解构赋值的基本使用:相当于把对象中的属性值拿出来,付给某些变量

例子:let wc={name:"wangcai",age:100}

let {name:name,age:age}=wc;

console.log(name,age)//这里的name和age是指键值对的值

2)对象的解构赋值一定要保持声明的变量和对象中的键同名,就是按属性名的一一对应关系来进行赋值。

例子 let wc = {name:"wangcai",age:100};

let {name1,age1} = wc;

 console.log(name1,age1); // 这里不同名,找不到就undefined undefined

3)对象是属性的无序集合,只需要保证变量的名和对象的键同名就OK。

例子:let wc = {name:"wangcai",age:100};

let {age, name} = wc;

console.log(name,age);//只要保证名字对应正确,顺序无所谓。

键和值相同时,可以省略属性值。{}里面只能放键值对。

4)对于对象的解构赋值,必须保证键一样,值对应的可以和键不一样

例子:

let wc = {name:"wangcai",age:100};

 let {name:xx,age:yy} = wc;

console.log(name,age)//键一样,这里不能打印出键, ReferenceError: age is not defined

console.log(xx,yy);//永远记住这里打印的是值不是键。wangcai 100

例子二:

let wc = {name:"wangcai",age:100};

let {xx:name,yy:age} = wc;//不能打印出键。记住打印的是值。

console.log(xx,yy);//这个键对应不一致,直接报错ReferenceError: xx is not defined

注意:值的名字可以随便起,打印出来的是值

5)默认值

如果有赋值操作了,就不会要默认值,直接忽略

let wc = {name:"wangcai",age:100};

let {name,age=110} = wc;

console.log(name,age)//wangcai  100

在没有值的情况下才可以给属性设置默认值。

let wc = {name:"wangcai",age:100};

let {name,age,age1=110} = wc;//我们没有给age1进行赋值操作,所以应该打印出默认值

console.log(name,age,age1)//wangcai  100 110

三 解构赋值的补充与应用

1)拓展运算符

...叫拓展运算符,把剩下的内容存储到z中,z是一个数组,这个运算符只能出现在最后

let [x,y,...z] = ["a","b","c","d","e","f"]

console.log(x)//把a赋值给x

console.log(y)//把b赋值给y

console.log(z)//把剩下的组成一个单独的数组给z,这个数组只能出现在最后

2)忽略一些数据,来得到我们想要的数据

[1,2,[3,4,[5]]]只想得到5这个值,怎么写?

let[, ,[,,[a]]]=[1,2,[3,4,[5]]]

console.log(a)

3)组合使用数组和对象解构赋值

let obj = {

name:"wangcai",

age:110,

hobby:["篮球","足球","双色球"]

}//想拿到双色球怎么写?

let{hobby:[, ,a]};

console.log(a)

4)解构赋值补充,快速得到一个对象的方法

Math 里面有 max min abs

let {max ,min, abs}=Math

let {max,min,abs} = Math;

 let r = max(1,2,3,4,5)//拿着max就可以直接使用喽

console.log(r)//5

快速得到push方法,这个方法是在数组对象的原型对象上

 let {push} = []; // []里面没有,会沿着原型链去找ok的

 console.log(push)

console.log(push === Array.prototype.push); // true

let{length}=[1,2,3]

console.log(length)//3

5)函数参数的解构赋值

function fn({name,age}){

console.log(name,age)

}

let obj = {name:"wangcai",age:100}

fn(obj)

6)解构赋值应用

交换两个数

借助第三方变量 t

let a = 1; let b = 2;

 let t = a; a = b; b = t;

console.log(a,b)//这是以前的方法

通过解构赋值:

 let不允许重复声明

 var a = 1; var b = 2;

 var [b,a] = [a,b];

 console.log(a,b)

快速的得到函数中返回的多个值

function fn(){

var min , max;

min = Math.floor(3.9);

max = Math.ceil(3.1);

--------------------------------------------// return min, max; // JS中默认只能返回一个值,但是有的语言(GO)中可以返回多个值

--------------------------------------------// 在JS,要返回多个值,可以把多个值放到数组或对象中

 //return {min:min,max:max}//对象中

return {min,max}

}

let {min,max} = fn()//解构赋值用对象接收

console.info(min,max)

快速得到服务器返回的JSON数据中的某些数据

let json = {

"status": 0,

"data": {

"films": [

{

"filmId": 4991,

"name": "误杀",

}

],

"total": 46

},

"msg": "ok"

}

得到name:

let {

data:{

films:[

{

name

}

]

}

} = json;

console.log(name)

四 字符串的拓展

trim 去除字符串左右的空格

 trimLeft 去除字符串左边的空格

 trimRight去除字符串右边的空格

例子:

var str = " hello wangcai "

console.log("-----------")

console.log(str)

console.log(str.trim())

console.log(str.trimLeft())

console.log(str.trimRight())

模板字符串

模板字符串  ${} 里面放变量 ${} 里一个对象的属性  ${} 里放表达式

 console.log("今天是"+year+"年"+month+"月"+day+"日");

 console.log("我是"+name+",今年"+age+"了");

自己转换试试

 ${} 里面放变量

let name = "xxx";

let age = 100;

 console.log(`我是${name},今年${age}岁了`)

 ${} 里一个对象的属性

let obj = {

name:"xxx",

 age:11}

console.log(`我是${obj.name},今年${obj.age}岁了`)

 ${} 里放表达式 

 let obj = {

 name:"xxx",

 age:1100 }

console.log(`我是${obj.name},今年${obj.age-100}岁了`)

repeat 重复

let str = "hello"

console.log(str.repeat(10))

includes查看一个字符串中是否包含某个子串

let str = "hello world~"

console.log(str.includes("hello")) // true

console.log(str.includes("world")) // true

console.log(str.includes("he")) // true

console.log(str.includes("h")) // true

console.log(str.includes("x")) // false

// 多个字母需要连着才为ture

console.log(str.includes("ho")) // false

startsWith 是否以子串开始

let str = "hello world~"

console.log(str.startsWith("h")) // true

console.log(str.startsWith("he")) // true

console.log(str.startsWith("hello")) // true

console.log(str.startsWith("ello")) // false

 endsWith 是否以子串结束

let str = "hello world~"

console.log(str.endsWith("~")) // true

console.log(str.endsWith("d~")) // true

console.log(str.endsWith("d")) // false

padStart 在字符串的前面进行填充,以达到指定的长度

let str = "wangcai";

console.log(str.padStart(10,"*")) // ***wangcai

console.log(str.padEnd(10,"*")) // wangcai***

padEnd的第1个参数如果小于字符串的长度,不起作用

console.log(str.padEnd(5,"*")) // wangcai

五.forEach方法的使用与细节

数组中其他的方法:

push, unshift, pop, shift,

join 把数组拼接成字符串,以指定的字符连接

 slice 从已有数组中截取一个新数组

 reverse 数组的倒置

 concat 合并多个数组,返回一个新数据

splice 删除,插入

 sort 排序

 indexOf 查找元素,找到返回元素的索引,找不到,返回-1

 toString 转字符串

================= Array.isArray() 判断是否是一个数组

console.log(Array.isArray(arr)) // true

Array.isArray如果是一个伪数组,得到false

console.log(Array.isArray(arguments)) // false

args是一个真实的数组

console.log(Array.isArray(args)) // true

================= forEach() 对数组进行遍历

let arr = ["a","b","c","d"];

// forEach() 参数是函数

// item表示数组中的每一个元素

// index表示数组中每一个元素的索引

// arr表示遍历的数组

arr.forEach(function(item, index, arr){

console.log(item+"---"+index+"---"+arr)

console.log(Array.isArray(arr))

})

1)当item是基本数据类型的数据时,修改Item不会影响原数组

2)如果item是引用数据类型的数据,修改item会影响原数组

3)forEach方法没有返回值

4)forEach中不能写break,会报错

5)for和forEach有什么区别?

for可以修改数组中的元素

如果想修改数组中的元素,使用for循环,如果仅仅是遍历,不修改元素,使用forEach更简洁一点。

let arr = ["a","b","c"];

for(var i=0; i<arr.length; i++){

 arr[i] = 110;}

console.log(arr)

六.map方法的基本使用

map()方法 逐一对原数组中的元素处理(通过一个函数处理),得到一个新数组

学习react时,map用的比较多

(1)map的参数是一个函数

 (2)函数有三个形参,item表示数组中的每一个元素,index表示索引,arr表示老数组

 (3)map有遍历的功能

(4) map得到的肯定是数组,数组中的元素需要通过函数进行处理,如果不处理,数组中的元素都是undefiend

let res = arr.map(function(item,index,arr){

console.log(item,index,arr)

});

console.log(res)// [undefined, undefined, undefined]

(5)使用return可以给新数组中放数据

let arr = [1,2,3];

let res = arr.map(function(item,index){

return item*2;

})

console.log(res) // [2, 4, 6]

(7)对老数组(数组中有对象)中的元素处理

let arr = [

{name:"z1",score:60},

{name:"z2",score:50},

{name:"z3",score:70},

{name:"z4",score:40}

];

// 需要给上面每一个同学的分数加10分

let res = arr.map(function(item,index){

// item表示上面的每一个同学 {}

item.score = item.score + 10;

return {name:item.name,score:item.score};

})

console.log(res)

七.filter过滤方法的基本使用:返回一个新数组

新数组中的元素是通过函数进行过滤

1)return后面跟上一个布尔值,与if里面的条件表达式结合使用

2)返回true放到新数组中,返回false则把它过滤掉

3)return后面直接跟上一个true,则老数组中全部元素全部都放到新数组

4)return后面直接跟上一个false,则老数组中一个也不放到新数组中

八:reduce方法:不断地让前一项和后一项进行运算,返回一个运算的值

语法:运算的规则有函数提供。

let arr=[1,2,3]

arr.reduce(function(prev,next){}

// ================ 使用reduce求和

let arr = [1,2,3];

let i = 1;

let res = arr.reduce(function(prev,next){

console.log(`第${i++}轮:前一项${prev}, 后一项${next}`)

console.log(`本轮的运算结果是:${prev+next}`)

return prev+next;

})

console.log(res) // 6

// ================ 带初值

let arr = [1,2,3];

let i = 1;

// 100是初值,第1次prev的值是100

let res = arr.reduce(function(prev,next){

console.log(`第${i++}轮:前一项${prev}, 后一项${next}`)

console.log(`本轮的运算结果是:${prev+next}`)

return prev+next;

},100)

console.log(res)

// ================ 求所有学生的总成绩 下面的写法OK

let arr = [

{name:"z1",score:60},

{name:"z2",score:50},

{name:"z3",score:70},

{name:"z4",score:40}

];

let {score} = arr.reduce(function(prev,next){

// 1)return必须返回一个对象

// 2)对象中的键要和原数组中的键一样

return {score:prev.score + next.score};

})

console.log(score) // 220

九.some方法:相当于||

数组中的方法:表示只要数组中的某一个元素符合条件,整体返回true,否则返回false ,在function中指定条件

// ================ 指定条件

let arr = [1,2,3,4,5,6,7]

// 检测数组中有没有元素大于5的元素,只要有一个大于5那么结果就是true

let res = arr.some(function(item){

return item>5;

})

console.log(res) // true

十.every方法:相当于&&

数组中的方法:表示只要数组中的所有元素都要符合条件,返回true,有一个不满足就返回false ,在function中指定条件

// 表示数组中的所有的元素都要满足某个条件

let arr = [1,2,3,4,5,6,7]

let res = arr.every(function(item){

return item>5;

})

console.log(res) // false

// 表示数组中的所有的元素都要满足某个条件

let arr = [1,2,3,4,5,6,7]

let res = arr.every(function(item){

return item>0;

})

console.log(res) // true

十一.ES6.数组新增的方法:

1.Array.from:把伪数组转换为真实的数组

Array.from(arguments)。

把一个元素的集合转换为一个真实的数组

2.Array.of方法:创建数组的,创建数组的几种方式:字面量,new Array创建,let arr=new Array(5)表示长度。

let arr=Array.of(5)//表示数组元素

let arr=Array.of("5")//表示数组元素

3.find方法基本使用:用来找到第一个符合条件的元素,找不到返回undefined

find里面放的函数,只要找到第一个就返回,要全部找到就用filter

4.findIndex:查找第一个满足条件的元素索引

5.includes():判断某个元素是否属于数组中的元素,如果有返回true,否则返回false。

6.indexof:查找某个元素在数组中的位置,返回第一个索引,找不到就是-1

对NaN判断不对,即使存在也对NaN返回-1

7.fill()方法:填充:用来给数组填充指定值的,多用于对空数组进行初始化,已有数据会覆盖。设置具体位置时包前不包后

8.扩展运算符(用的比较多,好好看看)

(1)数据的复制,对于基本类型的数据

例子:let arr=[1,2,3,3,4]

let  newArr=[...arr];//把数组arr展开,分解开一个个的元素

(2)对于引用类型来说,相当于浅copy

let arr = [1,2,["a","b"]]

let newArr = [...arr];

arr[2][0] = "ok";

console.log(arr) // [1,2,["ok","b"]]

console.log(newArr) // [1,2,["ok","b"]]

(3)把一个伪数组转化为真实的数组【...伪数组】

function fn(){

let arr = [...arguments]

console.log(Array.isArray(arr)) // true

}

fn(1,2,3)

(4)可以把一个字符串转成字符数组

let str = "hello"

let arr = [...str];

console.log(arr) // ["h", "e", "l", "l", "o"]

(5)... 合并数组

let arr1 = ["a","b"]

let arr2 = ["c","d"]

console.log(arr1.concat(arr2)) //  ["a", "b", "c", "d"]

console.log(arr2.concat(arr1)) //  ["c", "d", "a", "b"]

let newArr = [...arr1, ...arr2];

console.log(newArr) // ["a", "b", "c", "d"]

(6)...需要使用容器包起来

let arr = ["a","b"]

let m = ...arr; // SyntaxError: Unexpected token '...'

(5)三个点可以合并数组let newArr=[...arr1,...arr2]//快速合并

(6)三个点需要容器包起来,不包起来就报错。

注意:把一个伪数组变成真正·的数组,三种方式:

function fn(){

let arr = [...arguments]

console.log(Array.isArray(arr)) // true

}

fn(1,2,3)

// 总结:JS中把一个伪数组变成真实数组有哪些方法

// Array.from()

// [...伪数组]

// Array.prototype.slice.call()

十一.ES6.函数的扩展:

1,对函数的参数指定默认值

Function fn(a,b){}在函数内部,不能再使用let或const再次声明的局部变量。

赋值了就不用默认值,没赋值可以用默认值。

定义默认值时应该从后向前定义默认值,从前向后不合理

2,rest参数,只能放最后(...args),如果不是就报错。rest参数拿到的是一个真实的数组

十二.ES6.的箭头函数:不能当做类,在箭头函数内没有arguments,可以使用rest参数,箭头函数中没有this。

用来美化和简化js函数中的书写

十三.ES6.对于对象的一个扩展

definProperty():精细化设置configurable,writable,enumerable,value

definPropertys();精细化设置多个属性

getOwnPropertyDescriptor()得到某对象某属性的特征

getOwnPropertyNames()获得自己对象中的私有属性,可以获取不可枚举的属性,放到数组中

key:获得自己对象中的所有属性,包括原型对象,不可以获取不可枚举的属性,放到数组中

value:获得自己对象中的所有值

creat:创建一个新对象来继承这个对象的属性当做自己的公有属性

getPropertyOf:创建这个对象的类的原型对象

assign:将原对象中所有可枚举的属性复制到新对象中。

例子:

1,第一个参数,表示目标对象,从第二个参数起都是源对象。

2,如果多个源对象中有同名的属性,后面的将覆盖前面的。

3,只能复制可枚举的属性。

4,复制的时候复制的是地址,也可以说是一个浅copy。

防篡改保护:(1)preventExtensions()不能新增(2)seal不能新增,不能删除(3)freeze不能新增,不能删除,不能修改

判断防篡改保护:

1)ispreventExtensions()不能新增(2)isseal不能新增,不能删除(3)isfrozen不能新增,不能删除,不能修改

属性的简写:属性值是一个变量,变量的名和键名一样,这样才能简写

方法的简写:把function和:删除掉了。就成为简写方法,也是正确的。

对象上的扩展运算符...:也是浅copy

取出对象中所有可以枚举的属性,copy到当前的对象中,等同于assign作用。

// ============== 对象上的扩展运算符 ...

// 取出对象中所有可以遍历属性,copy到当前的对象,等同于Object.assgin方法。

let obj = {

name:"wangcai",

age:100

}

let newObj = {...obj}

// let newObj = Object.assign({},obj)

console.log(newObj)

// ============== 合并对象 ...也是浅copy

let obj1 = {

name:"wangcai",

}

let obj2 = {

age:100,

arr:[1,2,3]

}

let newObj = {...obj1, ...obj2}

console.log(newObj)

obj2.arr[0] = 666;

console.log(newObj)

十四.ES6.对于类的一个扩展

// ============ class JS慢慢地向主流的面向对象编程语言靠拢,提出class声明一个类

 function Dog(name,age){

 this.name = name;

 this.age = age;

 }

公有属性

 Dog.prototype.say = function(){

console.log("say...")

 }

 下面看类的写法:

class Dog{

constructor(name,age){

this.name = name;

this.age = age;

}

 静态属性,也是通过类来调用

static xxx = "yyy"

 私有方法:

say(){

console.log("say...")}

 公有方法: 静态方法通过类来访问

static jump(){

console.log("jump...")}}

创建对象

let wc = new Dog("wangcai",100)

console.log(wc.name)

console.log(wc.age)

console.log(wc.say())

使用对象来调用静态方法不OK

// console.log(wc.jump()) // wc.jump is not a function

Dog.jump(); // jump...

// console.log(wc.xxx) // undefined

console.log(Dog.xxx)

十五.set map容器

set:也是容器,set中的值都是唯一的,没有重复的值

 ============== set 也是容器,类似于数组,与数组不同的是,set中的值都是唯一的,没有重复的值

// Set也是一个类 new

let s1 = new Set();

console.log(s1)

// 添加数据

s1.add(1)

s1.add("hello")

s1.add(true)

console.log(s1)

// ============== 遍历set容器

let s1 = new Set();

// 添加数据

s1.add(1)

s1.add("hello")

s1.add(true)

// 使用for of进行遍历 for of针对迭代器进行一遍历方案

for(let p of s1){

// p就代表容器中每一个值

console.log(p)

}

// ============== 删除 delete

let s1 = new Set();

s1.add(1)

s1.add("hello")

s1.add(true)

console.log(s1)

s1.delete("hello")

console.log(s1)

// ============== set中不允许有重复的值

let s1 = new Set();

s1.add(1)

s1.add("hello")

s1.add("hello")

s1.add(true)

console.log(s1) // {1, "hello", true}

// ============== 利用set实现数组的去重

let arr = [1,2,3,3,2,1]

// 把数组转成set

let s1 = new Set(arr);

console.log(s1) // {1, 2, 3}

// 把set转成数组 ... 可以把set展开

let newArr = [...s1]

console.log(newArr)

// ============== 利用set实现数组的去重

let arr = [1,2,3,3,2,1]

let newArr = [...(new Set(arr))]

console.log(newArr) // [1, 2, 3]

map:

// ============= 什么是 Map

 Set类似于数组,Map类似于对象

 Map也是键值对的集合。在对象中键一般是字符串,但是在map中,它的键不限于字符串,各种类型的值都可以作为键,

 甚至对象也可以作为键。或者这样理解,对象中是: 字符串---值

 Map中的键可以是任何值,Map中是: 值---值

let obj = {

name:"wangcai",

age:100

}

// ============= 创建Map

// 通过new Map可以创建一个Map

// let m = new Map();

// console.log(m)

// 创建Map时初始化

// let m = new Map([["name","wangcai"]]);

// console.log(m) // {"name" => "wangcai"}

// let m = new Map([

// ["name","wangcai"],

// ["age",100]

// ]);

// console.log(m) // {"name" => "wangcai", "age" => 100}

// ============= Map的值可以是任何数据类型

let m = new Map([

["name","wangcai"],

["age",100],

["isOk",true],

["arr",[1,2,3]],

["obj",{xx:"xx"}],

["func",function f(){}],

]);

console.log(m)

// ============= Map的键可以是任何数据类型

let m = new Map([

["name","wangcai"],

[100,100],

[true,true],

[[1,2,3],[1,2,3]],

[{xx:"xx"},{xx:"xx"}],

[,function f(){}],

]);

console.log(m)

// ============= 添加

let m = new Map([

["name","wangcai"],

]);

m.set(1,2)

m.set([1],true)

console.log(m)

// ============= 获取 get(引用数据类型) ???

let m = new Map([

["name","wangcai"],

[1,2],

[[1,2,3],true]

]);

console.log(m.get("name")) // wangcai

console.log(m.get(1)) // 2

// ????

console.log(m.get([1,2,3])) // undefined

// ============= 有重复的键会覆盖

let m = new Map([

["name","wangcai"],

["name","xq"],

]);

console.log(m.get("name"))

// ============= 有重复的键会覆盖

let m = new Map([

["name","wangcai"],

["name","xq"],

]);

console.log(m.get("name"))

猜你喜欢

转载自blog.csdn.net/zwy1231/article/details/103560342