ECMAScript、EC5、ES6、ES7
2020-01-04 14:05 cascle 阅读(291) 评论(0) 编辑 收藏 举报一.ECMAScript入门介绍
JavaScript是ECMAScript的实现
JavaScript三部分核心:
1.ECMAScript实现
2.额外对象,BOM/DOM扩展
3.额外对象,Server侧扩展
2009,ES5发布
2015,ES6发布
2016,ES7发布(草案为主)
ES8草案也已发布
ES5
二.ES5严格模式
相对于正常模式(混杂模式),语法更严格
'user strict';,打开严格模式,适用于全局或者函数
要求:
1.用var声明变量。
否则自动成为window对象的一个变量,污染全局环境。
2.禁止自定义的函数中this指向window。
也是为了防止污染全局环境。比如类函数如果没有new,直接调用,里边的this指向window而不是相应的对象
3.创建eval作用域。防止通过字符串注入。
eval字符串参数里定义的变量,在外边访问不到
4.对象不能有重名的属性。
三.ES5 json对象扩展
引入JSON
1.JSON.stringify():把js对象/数组转为json对象/数组
2.JSON.parse():把json对象/数组转为js对象/数组
json即为string类型,typeof <对象> 可以看出来
json对象/数组外边要是单引号包起来
四.ES5 Object对象方法扩展
引入的最常用的两个静态方法
1.Object.create(prototype, [descriptors]):prototype对象被放到新对象__prototype__属性里。第二个参数是个对象数组,在新对象里添加一个属性。参数对象key是新对象的key,值又是一个对象,有value,writable,configurable,enumerable。
2.Object.defineProperties(object, descriptors):
为对象添加拓展属性。
拓展属性和属性不同,不能等同对待。他不是独立存在的,内存里没有他的位置,要根据其他属性获取,相应的,修改他也是要改他依赖的值
惰性获取,在浏览器里console log即可看出来
第二个参数key为属性名,value里get属性指定获取function,set属性指定设置function.set不能修改扩展属性的值,但是可以动原来属性的值
get和set在获取/设置拓展属性的时候自动调用
存取性属性:setter和getter
对象里边可以如下定义
{
get propertyName(){},
set propertyName(data){}
}
效果与defineProperties一样
五.ES5 数组扩展
Array.prototype添加了以下几个函数
- indexOf:第一个值为参数的index
- lastIndexOf:最后一个值为参数的index
- forEach:遍历数组每一个值
- map:返回一个新数组,为函数参数返回值
- filter:返回一个子数组,由函数参数为true的值构成
六.ES5 function扩展,apply/bind/call
Function.prototype添加了以下三个方法
- bind:将this与obj绑定,返回函数对象。obj以外参数使用分离形式传入
- call:以分离形式传入obj以外参数,将this与obj绑定,立即调用
- apply:以数组形式传入obj以外参数,将this与obj绑定,立即调用
bind,call/apply都将函数对象的this与参数obj绑定。区别是bind将函数返回,call/apply绑定后立即调用
bind通常用来指定回调函数
ES6
七.let/const
ES7