ES5新增的特性:
1、严格模式
2、bind方法/this关键字
3、JSON.parse/JSON.stringify
4、新增Array接口(indexOf,lastIndexOf等)
5、变量结构
严格模式的兼容性:
包括IE 10在内的主流浏览器,都已经支持它。同样的代码,在“严格模式”中,可能会有不一样的运行结果;一些在“正常模式”下可以运行的语句,在“严格模式”下将不能运行。
ES5的严格模式如何调用:“use strict”
“严格模式”有两种方法,使用于不同的场合。
1、针对整个脚本块(文件)的使用
2、针对单个函数
3、针对单个文件
ES5 JSON.parse/JSON.stringify
在ECMAscript代码中,经常会需要与JSON格式的数据进行交换。JSON也通常被用来作为客户端与服务器端之间的数据传输格式。这主要是因为在ECMAScript代码中处理JSON格式非常自然。JSON格式数据经过解析之后,可以直接当成ECMAScript中的对象来使用。在使用JSON格式时的一个重要问题是如何在ECMAScript中的对象与文本形式之间进行互相转换。
JSON.parse:字符串转换成JSON对象
JSON.stringify:JSON对象转换成字符串
ES6
let/const关键字
1、 let用来声明变量
用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效
var声明的变量,可以提升
let声明的变量,不能声明提升
以后能用let不用var
块级作用域
对于同一个变量,var可以重复声明,let不可以
2、const 只读变量,定义时候就赋值,以后不能更改。
const sex = '女';
sex = '男'
console.log(sex) // 值为女
console.log(sex)值为女
console的改变不能改变栈区内容,但是可以改变堆区内容。
const
1、修饰的变量是只读变量,常量,定义时就赋值,以后不能再更改
2、修饰的是直接表示的内存(再引用类型中体现)
const sex = '男';
sex = '女'; //这句话不能成功执行
//不能成功;因为,我们企图改变arr所代表的的内存区域
//这个不是改变arr所代表的内存,而是改变arr[0]所代表的内存区域
ES6=>函数
1、无函数名的箭头函数
let x => x * 5;
等价于
function (x) {
return x * 5
}
例如:
let t = (x => x * 5)(8)
等价于
let t = (function (x) {return x * 5})(8);
2、有函数名的箭头函数
let f = x => x * 5; // 把函数赋给一个变量
可变参数
function sum(...num) {
console.log(num);
}
console.log(10, 20, 30 40, 50, 60)
返回值是对象
var f = (id, name) => ({id: id, name: name}); // 圆括号不能省略
箭头函数的优点:
对this转移的处理:
箭头函数内部的this是词法作用域,使用箭头函数后this不会发生转移
ES6结构赋值
结构数组:
结构赋值可将数组的元素或对象的属性赋予给另一个变量。该变量的定义语法于数组字面量灬对象字面量很相似
Set和Map结构
set和Map在很多的面向对象编辑语言中(java c++)中都有。在其他的编程语言中,有个集合(容器)
Set 它类似于数组,单是成员的值都是唯一的,没有重复的值,可以简单的理解为无重复值的数组
Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化
Set结构的四个操作方法:
1、add(value):添加某个值,(添加之前会先做比较,这是add内部需要做的事情,如果有则不添加)返回set值本身。例如:s.add(10).add(20).add(35).add(56)
2、delete(value):删除某个值,返回的是boolean值,表示是否删除
3、has(value):判断值在集合中有没有
4、clear(value):清除所有成员,没有返回值
set数组的循环用for of循环,例如:for(let item of s){colose.log(item);}
for(let item of s) {
console.log(item);
}
Map结构:
如果需要“键值对”的数据结构,Map比Object更合适。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当做键。Map就是键值对,跟对象有点像。但是Map的键除了可以是字符串外,还可以是任何数据类型(包括对象)。Map结构中的键是唯一的。
Map就是键值对,跟对象有点像。键可以是其它类型的数据。
var m = new Map();
m.set("007"{"id":"007", "name": "张三丰"}); //添加了一个元素,键是:007,值是一个对象
m.set("008"{"id":"008", "name": "张四丰"}); //添加了一个元素,键是:008,值是一个对象
m.set("009"{"id":"009", "name": "张五丰"}); //添加了一个元素,键是:009,值是一个对象
m.set("008"{"id":"008", "name": "李恒"}); //,键是:008,之前已有该键,此时将覆盖之前的键值对
var m=new Map();
m.set("007"{"id":"007","name":"张三丰"}); //添加了一个元素,键是:007,值是一个对象
m.set("008"{"id":"008","name":"张四丰"}); //添加了一个元素,键是:008,值是一个对象
m.set("009"{"id":"009","name":"张五丰"}); //添加了一个元素,键是:009,值是一个对象
m.set("008"{"id":"008","name":"李恒"}); //,键是:008,之前已有该键,此时将覆盖之前的键值对
Map的方法:
set:给Map对象增加一个键值对,如果,存在相同的键,就会覆盖
get:根据键获取值
has:判断Map结构的所有的键
delete:根据键删除Map结构中的对应值
keys:获取Map结构中所有的键
values:获取Map结构中所有的值
Map的属性:
size:Map结构中的数量
Generators(生成器)函数
Generators可以极大地简化代码,可以帮助你逃离“回调地狱”。
生成器函数和普通函数的区别:
1、普通函数使用function声明,而生成器函数使用function*声明。
2、在生成函数内部,有种类似return的语法:关键字yield。二者的区别是,普通函数只可以return一次,而生成器函数可以yield多次(当然也可以只yield一次)。在生成器的执行过程中,遇到yield表达式立即暂停,后续可恢复执行状态。
这就是普通函数和生成器函数之间最大的区别,普通函数不能自暂停,生成器函数可以。
Generators(生成器)函数代码
function* quips(name) {
yield "你好 " + name + "!";
yield "希望你能喜欢这篇介绍ES6的译文";
if (name.startsWith("X")) {
yield "你的名字 " + name + " 首字母是X,这很酷!";
}
yield "我们下次再见!";
}
生成器做了什么
当你调用quips()生成器函数时发生了什么?
> var iter = quips("jorendorff");
[object Generator]
> iter.next()
{ value: "你好 jorendorff!", done: false }
> iter.next()
{ value: "希望你能喜欢这篇介绍ES6的译文", done: false }
> iter.next()
{ value: "我们下次再见!", done: false }
> iter.next()
{ value: undefined, done: true }
ES6 class
类:分类,类型。数据类型。程序员根据项目(业务)的不同,会定义无数的数据类型。
对象:类的具体表现,变量。
定义一个类型,ES6中使用class关键字
定义一个医生类型,相当于定义number、boolean、Array等等
例如:
构造函数:构造医生
class Doctor {
constructor(id, name, dept){
this.id = id;
this.name = name;
this.dept = dept;
}
eat (str) {
alert(this.name + "再吃" + str);
}
work () {
alert(this.name + "再看病");
}
}
实例化一个医生(定义一个医生变量)
var d1 = new Doctor("007","李恒","骨科");
d1.eat("泡面");
d1.work();
函数的定义方式有函数声明和函数表达式两种方式,类的定义也有两种方式
1)声明
2)表达式
继承:子类自动拥有父类的属性和方法
super:子类必须在constructor方法中调用