起源 1996 年 11月
前情回顾:
Ecma国际
Ecma国际(Ecma International)是一家国际性会员制度的信息和电信标准组织。1994年之前,名为欧洲计算机制造商协会(European Computer Manufacturers Association)。因为计算机的国际化,组织的标准牵涉到很多其他国家,因此组织决定改名表明其国际性。现名称已不属于首字母缩略字。
Netscape
Netscape(网景)公司,是一个自1994年开始的品牌。它亦是网景通讯公司(Netscape Communications Corporation,1994年4月4日—2003年7月15日)的常用简称。网景通讯公司曾经是Netscape Navigator浏览器的生产商
javaScript 的创造者 Netscape 公司将 JavaScript 提交给标准化组织 ECMA(European Computer Manufacturers Association)。
TC39
TC39 是技术委员会第 39 号,是 ECMAScript 规范下的 JavaScript 语言标准化的机构,负责开发 JavaScript 的委员会。
1996 年 11月
JavaScript 的创造者 Netscape 公司将 JavaScript 提交给标准化组织 ECMA
1997年 ES1
ECMA 发布 262 号标准文件(ECMA-262),规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript (ES).
1998年 ES2
1999年 ES3
2000年 ES4 , 2008年终止
2009年 ES5(ES3.1)
2011年 ES5.1
成为 ISO 国际标准(ISO/IEC 16262:2011), 到了2012年底,主流浏览器都支持ECMAScript 5.1的全部功能
2015年 ES2015(ES6)
let
1、变量不能重复生命
2、块及作用(其他作用域全局 、函数,eval)
3、不存在变量提升(好处:)
4、不影响作用域链
//实例:
for(var i=0;i<3;i++){
items[i].onClick=function(){
console.log(i)//一直输入 3
}
}
//区别
for(let i=0;i<3;i++){
items[i].onClick=function(){
console.log(i)//输入 0、1、2
}
}
const:
1、一定要赋值初始值
2、一般常量使用大写(小写也行)
3、常量不能修改
4、是块级作用域
5、对数组和对象的元素修改,不算对常量的修改,不回报错(引用地址没有报错)
解构赋值
数组的结构,对象的结构
const obj=['a','b','c','d']
let ['wang','zhu','li','liu']=obj
let {name,age,run}={
name:"xiaosan",
age:14,
run:function(){
}
}
模板字符串 ``
引入新的声明字符串方式
1、换行符
2、可以直接出现换行符
3、变量拼接
const a=`我是模板字符串`
const b=`${a}拼接字符串<br><ui><li>我可以解析标签</li></ul>`
箭头函数
this是静态的,this始终指向函数声明时所在的作用域下的this值
//Call 改变不了this的指向问题
function getName(){
console.log(this.name)
}
let getName2=()=>{
console.log(this.name)
}
window.name="你好箭头函数"
const school={
name:"change"
}
getName.call(school) //change
getName2.call(school)// 你好箭头函数
做了大量的更新,但向后兼容。ES6是一次重大改进。
部分功能:let/const、变量的解构赋值、Promise、箭头函数…
symbol
// 向对象添加到方法 up down
let game={}
let methods={
up:Symbol(),
down:Symbol()
}
game[methods.up]=function(){
console.log('')
}
let home={
name:'shequ',
[Symobol('say')]:function(){
console.log('我是唯一的方法')
}
}
// Symbol内置属性
class borther{
}
// 迭代器
const arr=['a','b','c','d']//
let iterator=arr[Symbol.iterator]()
console.log(iterator.next())//{value: "a", done: false}
console.log(iterator.next())//{value: "b", done: false}
console.log(iterator.next())//{value: "c", done: false}
console.log(iterator.next())//{value: "d", done: false}
console.log(iterator.next())//{value: undefined, done: true}
//声明一个对象
const banji={
name:'班级',
stus:['一班','二班','三班','四班']
}
// 遍历这个对象
for(let v of banji){
console.log(v)
}//会报错,banji不是iterator接口
const nanjing={
name:'南京',
stus:['玄武','建邺','江宁','秦淮'],
[Symbol.iterator](){
let index = 0
let _this=this
return{
next:function(){
if(index<_this.stus.length){
const res={value:_this.stus[index],done:false}
index++
return res
}else{
return {value:undefined,done:true}
}
}
}
}
}
// 遍历这个对象
for(let v of nanjing){
console.log(v)
}
//生成器其实就是一个特殊的函数
//异步编程 纯回掉函数 node fs ajax
function *create(){
yield 'aaa';
yield 'bbb'
yield 'ccc'
}
let iterator=create()//是回掉函数
console.log(iterator.next())//{value: "aaa", done: false}
console.log(iterator.next())//{value: "bbb", done: false}
console.log(iterator.next())//{value: "ccc", done: false}
console.log(iterator.next())//{value: undefined, done: true}
// 生成器函数是迭代器对象,返回的是iterator接口
// 同上可以进行遍历
for(let v of create()){
console.log(v)
}