ES5
1、严格模式
*理解
1、除了正常运行的模式(混杂模式),es5添加了第二种运行模式:‘严格模式’
2、顾名思义,这种模式使得javascript在更加严格的条件下运行
*目的
1、消除javascript语法的一些不合理,不严谨之处。
2、消除代码的一些不安全之处,为代码的安全运行保驾护航
*使用:在script标签的开始添加‘use strict’
*与普通模式的差别
1、必须使用var定义变量
2、禁止自定义的函数中this指向window
3、创建eval作用域,在一般模式中eval()函数执行的代码相当于放到全局作用域中,eval没有自己的作用,当添加严格模式后,eval有了自己的作用域,这样就防止的污染全局作用域

2、JSON
1、JSON主要用于前端和服务器发送信息,他本质是一个特殊的字符串,因为所有的语言都可以识别字符串。
2、JSON和js对象的格式一样,不过JSON中的字符串属性名必须加双引号
3、JSON分类:
对象{}, 比如: '{"name":"wang","age":"18"}'
数组[],比如: ‘[1,2,3,“hello”,ture] ’
4、JSON(对象/数组)中的值
字符串,数值,bool,对象,数组
5、JSON.stringfy(obj/arr)将js对象转换为JSON对象
6、JSON.parse(json)将json对象转换为js对象
3、ES5给Object扩展的方法
1、Object.create(prototype,{descriptors})
*作用:以指定对象为原型创建新的对象。
*为新的对象指定新的属性,并且对属性进行描述
-value:属性的值
-writeable: 标识sex属性是否可以修改 默认false(不可修改)
-configurable: 标识当前实行是否可以被删除 默认false(不可删除)
-enumerable:标识当前属性是否可以用for in 遍历

2、Object.defineProperties(object,descriptors)
*作用:为指定的对象添加属性,可以同时修改或添加多个属性
*get: 用来获取当前属性值得回调函数,查看添加的属性值是自动调用
*set:修改当前属性值触发的回调函数,并且实参为修改之后的值
*Object.defineProperties也可以用Object.create()类似的方法添加属性的描述

3、对象本身的两个方法(用法和definrProperties中的类似)
*get propertyName(){}用来得到当前属性值的回调函数
*set propertyName(){}用来监视当前属性值变化的回调函数

4、ES5给数组扩展的方法
1、Array.prototype.indexOf(value) :得到值在数组中的第一个下标
2、Array.prototype.lastIndexOf(value) : 得到值在数组中的最后一个第一个下标
3、Array.prototype.forEach(function(item,index){}): 遍历数组
4、Array.prototype.map(function(item,index){}): 返回函数处理后的数组
5、Array.prototype.filter(function(item,index){}):遍历数组过滤出一个新的子数组,返回条件为true的值
5、ES5给函数扩展的方法
1、call(obj,params),apply(obj,[params]),bind()修改函数中this的指向
call()和apply()区别:call()和apply()的却别主要是传递函数参数是的区别,call()的参数是在传入的对象之后,参数依次传入,而apply()传入参数是放到一个数组中的。
bind()和call()以及apply()的区别:bind()执行后返回复制的函数,不会自动执行需要调用或者使用回调函数调用,而apply()和call()可以自动调用,bind()传入参数和call()相同
ES6
1、let关键字:
*作用:
-和var类似定义一个变量
*特点
-在块作用域内有效
-不能重复声明
-不会预处理,不存在提升
*应用
-循环遍历加监听,因为let的块作用域
2、const关键字
*作用:定义一个常量
*特点:值不能修改,其他特点和let相同
*应用:定义一个常量
3、解构赋值
*理解:从对象或者数组中提取数据,并赋值给变量(多个)
*对象的解构赋值:let {a,b} = {a:'123', b:'456'},变量名必须和对象中的键相同
*数组的解构赋值:let [a,b] = [1,2,3,'abc',true],位置是相互对应,如果想要获取数组中间的元素let [,,a,b] = [1,2,3,'abc',true],输出3,‘abc’,因为两个逗号占用两个位置
4、模板字符串:简化字符串的拼接
*模板字符串必须使用``包含
*替换的部分可以用${xxx}来替换
5、对象的简写
*省略同名的属性值
*省略方法的function
*例如

6、箭头函数
1、当函数没有形参时 let fun1 = ()=>{}
2、只有一个形参时()可以省略, let fun1 = a =>{console.log(a)}
3、当有多个形参时()不可以省略:let fun1 = (a,b) =>{console.log(a)}
4、函数体只有一条语句时或者是表达式的时候{}可以省略-->会制动返回语句执行的结果或者表达式运算的结果 let fun1 = (x,y) => x+y 相当于let fun1 = (x,y) =>{return x+y}
5、函数体有多条语句时正常使用一样
6、箭头函数特点
*简洁
*箭头函数没有自己的this,箭头函数的this不是调用的使用决定的,而是在定 义的时候处在的对象就是他的this
*扩展理解: 箭头函数的this看外层是否有函数,
如果有,外层函数的this就是内部箭头函数的this
如果没有,则this表示window

7、三点运算符
1、用途:
1、可以用来取代arguments但是比arguments更加灵活,因为arguments是一个伪数组没有数组的一些方法比如forEach等而...可以是真正的数组可以使用数组的一些方法,但是他只能获取形参最后部分的参数。

2、
var b = [2,3,4,5]
arr = [1, ...b, 6] // [1,2,3,4,5,6]
console.log(...b) //2 3 4 5 6
8、形参默认默认值
*形参默认值---当不传递参数是使用形参的默认值作为参数

9、Promise
1、promise对象:代表了未来某个时间将要发生的事件(通常是一个异步操作),有了promise对象,可以将异步操作以同步的流程表达出来,避免了层层嵌套的地狱回调问题,ES6的Promise是一个构造函数,用来生成promise实例

10、Symbol
1、概念:ES6中的添加了一宗原始数据类型symbol(已有的原始数据类型:String,Number,boolean,null,undefined,对象)
2、特点:
*Symbol属性对应的值是唯一的相当于调用Symbol函数,返回一个唯一的值类似于id,解决了命名冲突
*Symbol值不能与其他数据进行计算,包括通字符串拼接
*for in,for of遍历时不会遍历symbol属性
3、使用
*使用Symbol来作为对象的属性名(因为属性名不允许相同的值)
let symbol =Symbol()
let obj = {}
obj[symbol] = 'hello'
11、iterator
1、概念:iterator是一种接口机制,为各种不同的数据结构提供一种统一的访问机制
2、作用:
-为各种数据结构,提供一个统一的、简便的访问接口
-使得数据结构的成员能够按照某种次序排列
-ES6创造了一种新的遍历命令for...of循环,但是只用部署了iterator接口的数据结构才可使使用for...of循环。for...of非常适合用来遍历数组,与原来的遍历数组的方法相比for...of好处更多。forEach不能使用 break 语句来跳出循环,也不能使用 return 语句来从闭包函数中返回。for...in会遍历原型上的属性
3、工作原理:
-创建一个指针对象(遍历器对象),指向数据结构的起始位置
-第一次调用next方法,指针自动指向数据结构的第一个成员
-接下来不断的调用next方法,指针会一直往后移动,直到最后一个成员
-每一次调用next返回一个包含value和done的对下对象,{value:当前成员的值,done:布尔值},done对应的布尔值表示当前的数据结构是否遍历结束,当遍历结束时,返回{value: undefined , done :true}
4、扩展理解
-当数据结构上部署了Symbol.iterator接口,改数据就是可以用for of遍历
-可以使用for of遍历的数据结构:Array, arguments, set容器, map容器,String,不可以遍历对象,如果想要遍历对象那么需要给对象遍历iterator


12、Generator函数
1、概念:
-ES6提供的解决异步编程的方法之一
-Generator函数是一个状态机,内部封装了把不同状态的数据
-用来生成遍历器对象
-可以暂停函数,yoeld可以暂停,next再次启动,每次返回的是yeild的表达式结果
2、特点:
-function 与函数名之间有一个*
-内部用yeild表达式来定义不同的状态
3、generator函数返回一个指针对象,而不会执行函数内部逻辑
4、调用next方法函数内部的逻辑才开始执行调用next返回一个对象和interator的next返回的结果相同,但是遇到yeild表达式停止。
5、再次调用next方法会重上一次停止额yeild开始运行
6、yeild语句执行返回的结果是undefined,当调用next方法时传入参数,参数的内容将会是启动yeild语句的返回值


13、async函数
1、概念:真正意义上的解决异步回调问题,同步流程表达异步操作
2、语法 async function foo(){
await 异步操作
await 异步操作}
3、特点:
-不需要Generator去调用next方法,遇到await等待,当前的异步操作完成就往下执行
-返回的总是promise对象,可以用then方法进行下一步操作
-使用await代替了Generator中的yeild
-语义明确,使用简单


14、Class
1、es6中通过class来创建一个构造函数,并且可以通过extend实现继承

15、字符串扩展,数值扩展,数组扩展
1、字符串
-includes(str):判断是否包含指定的字符串
-startWith(str) : 判断是否以指定的字符串开始
-endWith(str): 判断是否以指定的字符串结束
-repeat(count): 将原来的字符串重复指定的次数
2、数值
-二进制用0b表示,八进制用0o表示
-Number.isNan(i):判断是否为Nan
-Number.isInteger(i):判断是否为正数
-Number.trunc(i) : 去除小数部分
3、数组
-Array.from(): 将伪数组对象或者可遍历对象转换为真数组 Array.from(btns).forEach
arr = Array.prototype.slice.call(伪数组) 将伪数组转换成真实的数组
-Array.of() (v1,v2,v3) :将一系列的值转换为数组
-arr.find(function(value,index){return true}) :找到第一个满足条件为true的元素
-arr.findIndex(function(value,index) {return true}) :返回第一个满足条件的元素的下表

4、对象
-Object.assign(target,source1,source2..) : 将原对象的属性赋值到目标对象上
-直接操作__proto__属性,es6之前没有,只能操作prototype属性

16、深克隆和浅克隆
1、拷贝数据:
-基本数据类型:拷贝后会生成一份新的数据,修改拷贝之后的数据不会影响原来的数据类似于深拷贝
-对象数组:拷贝后不会生成新的数据,而是拷贝引用,修改拷贝以后的数据会影响原来的数据类似于浅拷贝
2、拷贝数据的方法:
1、直接复制给另一个数据 //浅拷贝
2、Object.assgin() // 浅拷贝
3、Array.prototype.concat() // 浅拷贝
4、Array.prototype.slice() // 浅拷贝
5、JSON.parse(JSON.stringfy()) //深拷贝
3、浅拷贝:特点拷贝的引用,修改拷贝的值元数据也会受到影响,使得原数据不安全
4、深拷贝:拷贝的时候生成新的数据,修改拷贝之后的值元数据不受影响
5、实现深拷贝:
思想:不断遍历数组/对象将每一项,直到拿到基本的数据类型,然后去复制
实现:
-首先要知道数据类型,因为typeof返回的数据类型:String,Number,Boolean,Undefined,Object,Function,不能准确的判断是Array或者Object
-准确检测数据类型的方法: Object.prototype.toString.call(obj)
或者可以使用jQuery中的jQuery.type(测试的值)来实现数据类型的准确判断
还可以用 console.log([].constructor.name ) // Array


实现深拷贝方法二:通过JSON.parse()和JSON.stringify()

17、Set容器和Map容器
1、Set容器:无序不可重复的多个value的集合体
*Set()
*Set(array) //初始化Set容器时,里面的是数组
*add(value) //添加
*delete(value)
*has(value)
*clear()
*size
2、Map容器:无序的key不重复的多个key-value集合体
*Map()
*Map(array)
*set(key,value)
*get(key)
*delete(key)
*has(key)
*clear()
*size


ES7
指数运算符:**
Array.prototype.includes(value) : 判断数组中是否包含指定的value