首先ES大家并不陌生,首次接触的时候应该是在初次接触 JavaScript。 JavaScript主要由ECMAScript,BOM,DOM组成。 这里的 ECMAScript 就是我们接下来要提到的 ES6 的原始版
ES6,全称ECMAScript6.0,是2015年6月发布的javascript脚本语言的标准化规范,也称之为《ECMAScript 2015 标准》(简称 ES2015)
本篇主要讲解ES6的知识点,内容如下:let和const、解构赋值、字符串操作、函数、数组API、集合、对象拷贝、延展操作符、对象补充、Generator、Proxy、Reflect。
es6中新增的用于声明变量的关键字
具有块级作用域,let声明的变量只在所处于的块级有效不存在变量提升暂时性死区(个人理解 原因 还是因为没有变量提升)用于声明常量 1.具有块级作用域 4. 声明变量时必须赋值 5. 常量赋值后,值不能修改 针对第三点详细理解: const定义引用类型的数据的时候,可以修改数据内部结构,但是不能修改地址
const arr = [3, 4, 5, 6] arr.push(78) // 这样是可以的 console.log(arr) // 这样出现了等号 重新赋值了,就不被允许 arr = [3,4,5,6] //个人理解 : 只要有等于号的出现 就代表赋值, const 不允许赋值出现从数组中提取值,按照对应位置,对变量赋值,对象也可以解构。
如果解构的变量小于数组元素,那么只会解析前几个元素 如果解构的变量大于数组元素,那么多余的变量就是 undefined
上代码,看效果
//普通的函数 var test = function (x) { return x + 4 } console.log(test(4)) // 箭头函数 不需要 function 关键字来创建函数,省略 return 关键字 // 此处如果你的函数有且只有一个参数,可以省略掉括号 var test2 = x => { return x + 4 } console.log(test2(4)) // 此处如果你的函数有且只有一个表达式的时候,可以省略掉 {} var test3 = x => x + 4 console.log(test3(4))箭头函数的详细用法以及一些特点(敲黑板: 箭头函数没有自己的 this )
const obj = { name: "zhangsan", say: function () { const _this = this // 声明一个新的变量存储当前的 this ,不要改变,为后面使用 setTimeout(function () { // console.log(this.name) 这句里的 this 指向的是匿名函数, //没有明确指向,就是指向 window.name = '' 空字符串 console.log(_this.name) }, 1000) } } obj.say() // 输出的结果为 zhangsan const obj1 = { name: "zhangsan", say: function () { // 此处将定时器内部的普通函数改为箭头函数, // 箭头函数没有自己的 this 所以,下面的 this 在找自己对应的对象时, //会透过 箭头函数继续向上去找,直到找到下一个函数 setTimeout(() => { console.log(this.name) }, 1000) } } obj1.say() zhangsan 总结: // 1. 如果希望 this 指向当前对象,那么就用普通函数 // 2. 如果希望 this 指向外层对象,就用箭头函数(用其没有自己的 this 特性实现) // 3. 如果内外层都要, 用普通函数, this 指向内层 // 在外层声明一个变量把外层的 this 存下来,比如 const _this = this // 然后,用的时候, 就直接 调用 _this 这个变量模板字面量 是允许嵌入表达式的字符串字面量。你可以使用多行字符串和字符串插值功能。它们在ES2015规范的先前版本中被称为“模板字符串”。
我们知道JS函数内部有个arguments对象,可以拿到全部实参。现在ES6给我们带来了一个新的对象,可以拿到除开始参数外的参数,即剩余参数 这个新的对象和arguments不一样,它是程序员自定义的一个普通标识符,只是需要在前面加上三个点:…
let arr1 = ['zs', 'ls', 'ww'] let [a, ...b] = arr1 console.log(a) //zs console.log(b) //ls, ww // 剩余参数后面如果跟了其他参数,则会报错 function func(a, ...rest, b) { // SyntaxError parameter after rest parameter } //使用剩余参数后,函数的length属性会发生一些变化 function func(a, b, ...rest) { } func.length // 2 //即length不包含rest,为2。arguments和剩余参数的区别 arguments是一个伪数组(Array-like) 剩余参数是一个真正数组(Array),具有Array.prototype上的所有方法
上代码,看效果
function fn(a, b, c) { console.log(a + b + c) } var arr = [2, 3, 4] // fn(arr[0],arr[1],arr[2]) fn(...arr) // ... 运算符可以把数组展开 console.log(...arr) var arr1 = arr // 这种写法赋值的是引用(完全相同的数组) // var arr2 = [...arr,25] 可以在后面新增元素 var arr2 = [...arr] //这种写法arr1和arr是两个 值 相同的数组(引用即地址不同) console.log(arr2) var obj = { name: "流沙卫庄", age: '20' } // obj1具有obj的所有属性,并且还新增了一个gender,他们是两个不同的对象 var obj1 = { ...obj, gender: '男性' } console.log(obj1) console.log(obj) // 用于合并数组 //方法一 let arr1 = [1,2,3] let arr2 = [4,5,6] let arr3 = [...arr1, ...arr2] //方法二 arr1.push(...arr2) //将伪数组转换为真正的数组 var divs = document.querySelectorAll('div') console.log(divs) //伪数组 var arr = [...divs] console.log(arr) //真正的数组 arr.push('a') //可以使用数组方法用于找出第一个符合条件的数组成员,如果没有找到返回undefined
let arr = [{id:1, name:'zs'},{id:2, name:'ls'}] /*let target = arr.find( item => item.id == 2) console.log(target)*/ //上下写法等价 /*var retFind = arr.find(function(item){ return item.id === 2; }) console.log(retFind )*/用于找出第一个符合条件的数组成员的位置,如果没有找到返回-1
let arr = [1,5,10,22,35] let target = arr.findIndex( item => item>20 ) console.log(target) //3表示某个数组是否包含给定的值,返回布尔值。
let arr1 = [1,2,3] let arr2 = [4,5,6] let target = arr1.includes(3) console.log(target) //true表示参数字符串是否在原字符串的头部,返回布尔值
let str = 'hello lfl 2020' let a = str.startsWith('hello') console.log(a) //true表示参数字符串是否在原字符串的尾部,返回布尔值
let b = str.endsWith('2020') console.log(b) //truerepeat方法表示将原字符串重复n次,返回一个新字符串。
console.log('x'.repeat(5)) //'xxxxx'新增数据类型 Set :同数组存放数据,但不存放重复元素; 上代码,看效果
// Set函数可以接受一个数组作为参数,用来初始化。 const s = new Set([1,2,3,4,5]) console.log(s.size) //5 const s = new Set([1,1,1,2,2,2]) console.log(s.size) //2 // 利用set数据结构做数组去重 const s = new Set([1,1,1,2,2,2]) let arr = [...s] console.log(arr) //[1,2] const s = new Set() // add(value):添加某个值,返回Set结构本身 s.add(1).add(2).add(3) // console.log(s) // {1, 2, 3} //delete(value):删除某个值,返回一个布尔值,表示删除是否成功 s.delete(2) // console.log(s) // {1, 3} //has(value):返回一个布尔值,表示该值是否为Set的成员 var ha = s.has(3) //console.log(ha) // true //clear():清除所有成员,没有返回值 s.clear() //console.log(s) // {}Set结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。
const s = new Set([1,2,3,4,5]) s.forEach( value => { console.log(value)} ) // 1 2 3 4 5