ES5、ES6、ES7

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

自定义的iterator接口
给对象部署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语句的返回值

Generator处理异步任务

           13、async函数

                  1、概念:真正意义上的解决异步回调问题,同步流程表达异步操作

                  2、语法 async function foo(){

                                     await 异步操作

                                      await 异步操作}

                   3、特点:

                   -不需要Generator去调用next方法,遇到await等待,当前的异步操作完成就往下执行

                   -返回的总是promise对象,可以用then方法进行下一步操作

                   -使用await代替了Generator中的yeild

                   -语义明确,使用简单


await返回值


async应用

                 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



利用set去重

ES7

指数运算符:**

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容