ES6整理
1.let
传统的变量声明都是用var
eg:
(function(){
var i = 1;
var i = 10;
console.log(i);
})();
ES6改用let变量声明
eg:
(function(){
let i = 2;
cosole.log(i);
}
与var的区别:
1.let声明的变量只在当前代码块有效
2.同一代码块里不允许出现重名let变量
3.let特别适合用于循环(因为var声明的变量会有变量提升的情况)
eg:
var arr = [];
for(var i = 0;i < 10;i++){
arr[i] = function(){
console.log(i);
}
}
arr[3]();//此时i=10
/****************************/
var arr = [];
for(let i = 0;i < 10;i++){
arr[i] = function(){
console.log(i);
}
}
arr[3]();//此时i=3
2.set
(1)set是ES6新增的一种数据类型,语法特点与数组类似。
(2)与数组不同的是set数据结构里的所有数据都是唯一的。
eg:
/******传统写法******/
var arr = [1,2,3,4,6,6,7,7,8];
/*传统遍历数组方法一*/
for(var i = 0;i < arr.length;i++){
console.log(arr[i]);//此时输出1,2,3,4,6,6,7,7,8
}
/*传统遍历数组方法二*/
arr1.map(function(val){
console.log(val);
});
/******set写法******/
var set = new Set(arr);
/*set遍历数组方法*/
for(var element of set){//for in 循环不能遍历set集合,得用for of
console.log(element );//此时输出1,2,3,4,6,7,8
}
/*set添加数据方法*/
var set2 = new Set();
for(var i = 0;i <10;i++){
set2.add(i*2);
}
console.log(set2);
/*set将集合转换为数组 扩展运算符*/
var arr3 = [...set2];
console.log(arr3);
/*清空和删除set*/
set2.delete(2);//没有索引,直接删除数据2
console.log(set2);
set2.clear();//清空set2数据
console.log(set2);
tip:为什么在删除的时候没有用索引?
因为set数组的索引和数据是一样的。
eg:
let set3 = new Set([1,7,9,4,2,3,4]);
set3.forEach(function(index,val){
console.log(index+":"+val);//此时结果是1:1 7:7 9:9 4:4 2:2 3:3 4:4
});
/*判断set中是否有对应数据*/
console.log(set3.has(9));//此时答案是true
/*set数组长度*/
console.log(set3.size);//此时是6,set没有length的属性
3. weakSet
与set使用方式类似。但与set的不同的地方在于WeakSet只能保存对象类型的数据,
有add,clear,delete,has方法,但不能遍历,取值。
eg:
let ws1 = new WeakSet();
let num = new Number(5);
ws1.add(5);//报错,因为5不是对象类型的数据
ws1.add(num);//不报错,因为num是对象类型的数据
4.const
用来声明变量,语法规则和let一样,但是const声明的变量不可修改,且只在当前的代码块有效,
同一代码块里不允许出现重名const常量。
eg:
(function () {
{
const PI = Math.PI;
const n = 2;
//n = 5; //同一代码块里不允许出现重名const常量
alert(n);
let m = 3;
m = 5;
alert(m);
}
//alert(n); //const声明的常量只在当前的代码块有效
})();
5.symbol
ES6新增的一种数据类型,表示独一无二的值。
eg:
{
var a = "ccy";
var b = "ccy";
alert(a == b);
}
{
let a = Symbol("ccy");
let b = Symbol("ccy");
alert(a == b);
}
6.map
map也是ES6新增的一种数据类型,它的本质和对象一样都是键值对的集合。
与对象不同的是,它的键值可以是各种数据类型。
let map1 = new Map();
var obj1 = new Object();
var obj2 = new Object();
/*set方法 添加值*/
map1.set(obj1,"对象键值1");
map1.set(obj2,"对象键值2");
/*get方法获取值*/
console.log(map1.get(obj1));
console.log(map1.get(obj2));
/*has方法判断是否存在*/
console.log(map1.has(obj2));
/*delete方法删除数据*/
map1.delete(obj2);
console.log(map1.size);
/*clear清空数据*/
map1.clear();
console.log(map1.size);
/*数组作为构造函数参数*/
let arrMap = new Map([['name','ccy'],['age','18']]);
console.log(arrMap);
/*forEach遍历Map*/
arrMap.forEach(function(val,key){
console.log(key+":"+val);
});
/*转换成数组 扩展运算符*/
let arr = [...arrMap];
console.log(arr);
/*for of循环*/
for(let i of arrMap){
console.log(i);
}
/*键迭代器*/
let keys = arrMap.keys();
console.log(keys);
for(var i = 0 ; i < arrMap.size; i++){
console.log(keys.next().value);
}
/*值迭代器*/
let vals = arrMap.values();
console.log(vals);
/*获取map的大小*/
let size = arrMap.size;
console.log(size);
/*数字类型的键名*/
let ccy = new Map([[1,"zhangsan"],[2,"lisi"]]);
ccy.forEach(function(val,key){
console.log(key+":"+val);
});
7.weakMap
weakMap和Map相似,但是区别是weakMap只能接收对象键值的数据
eg:
let wm = new WeakMap();
let obj = new Object();
obj.name = "name";
wm.set(obj,"hello");
console.log(wm.has(obj));
console.log(wm.get(obj));
wm.delete(obj);
console.log(wm.get(obj));
8.Arrow
/*标准函数定义形式*/
function show(){ //无参
console.log("hello");
}
show();
/*箭头函数写法*/
let show2=()=>{ //无参
console.log("hello");
}
show2();
/*标准写法*/
function showName(name){ //有参
console.log(name);
}
showName("ccy");
/*箭头函数写法*/
let showName2=(name)=>{ //有参
console.log(name);
}
showName2("ccy");
/*标准写法*/
function add(a,b){ //有参有返回值
return a+b;
}
console.log(add(2,3));
/*箭头函数写法*/
let add2=(a,b)=>a+b; //有参有返回值
console.log(add2(2,3));
/*标准写法*/
function add3(a,b){ //有参有返回值有输出操作
console.log("我是加法运算");
return a+b;
}
console.log(add3(2,3));
/*箭头函数写法*/
let add4=(a,b)=>{ //有参有返回值有输出操作
console.log("我是加法运算");
return a+b;
}
console.log(add4(2,3));
看惯了标准函数,箭头函数看起来是不是很难看,那ECMA设计它来干什么??
箭头函数可以优化对this的操作,它对this的处理与一般的普通函数不一样。
箭头函数的this始终指向函数定义时的this,而不是执行时。
var obj = {
data:"我是测试数据",
fun:function(){
console.log(this.data);//this指向谁?
},
fun2:function(){
setTimeout(function(){
//console.log(this);
this.fun();
},1000);
}
}
obj.fun();
//obj.fun2() //报错! 因为定时器函数里的this的指向已经发生偏移,指向window对象
/*用箭头函数解决这个问题*/
var obj2 = {
data:"我是测试数据",
fun:function(){
console.log(this.data);
},
fun2:function(){
setTimeout(()=>{//匿名函数 没有参数
this.fun();
},1000);
}
}
obj2.fun();
obj2.fun2();
9.promise
function fun1(){
return new Promise(function(resolve,reject){
setTimeout(function(){
console.log("我是函数1");
resolve(111);
//reject("函数1发生错误");
param = "我是函数1的数据";//往后面的函数传递参数
},4000);
});
}
function fun2(){
return new Promise(function(resolve,reject){
setTimeout(function(){
console.log("我是函数2");
console.log(param);
resolve(222);
},3000);
});
}
function fun3(){
return new Promise(function(resolve,reject){
setTimeout(function(){
console.log("我是函数3");
console.log(param);
resolve(333);
},2000);
});
}
function fun4(){
return new Promise(function(resolve,reject){
setTimeout(function(){
console.log("我是函数4");
console.log(param);
},1000);
});
}
fun1().then(function(data){
console.log(data);//fun1的resolve传递的数据
}).then(fun2).then(function(data){
console.log(data)
}).then(fun3).then(function(data){
console.log(data)
}).then(fun4).then(function(data){
console.log(data);
}).catch(function(err){
console.log(err);
if(err == "函数1发生错误"){
//fun2().then(fun3).then(fun4);//哪怕函数1发生错误,我也也可安排函数继续往下进行。
}
});
10.Iterator
/*声明一个数组*/
let arr = [1,2,3,4,5];
/*声明一个遍历器*/
let it = arr[Symbol.iterator]();
for(;;){
let ele = it.next();
if(ele.done == true){
break;
}
console.log(ele.value);
}
/*能使用遍历器的有数组、对象、set和map,能使用遍历器的,就可以使用for of*/
for(var i of arr){
console.log(i);
}
/*展开运算符*/
var newArr = [...arr];
console.log(newArr);
11.generator
/*每一个yeild语句定义不同的状态,它是一个代码执行暂停标识。
return也是定义了一个状态。*/
function* show(){
yield "第一个阶段";
yield "第二个阶段";
yield "第三个阶段";
yield "第四个阶段";
return "end";
}
/*调用show函数,函数不会立即执行,而是返回一个遍历器对象*/
var itFunction = show();
/*对遍历器对象依次调用next()去执行*/
console.log(itFunction.next());
console.log(itFunction.next());
console.log(itFunction.next());
console.log(itFunction.next());
console.log(itFunction.next());
function* show2(){
yield function fun1(){
setTimeout(function(){
console.log('chenchuanyin');
},1000);
};
yield function fun2(){
console.log("ccy");
}
}
var itFun = show2();
var fun1 = itFun.next().value;
var fun2 = itFun.next().value;
fun1();
fun2();
13.destructuring
/*数组解构赋值*/
function arr(){
{
/*完全解析*/
let [a,b,c] = [1,2,3];//普通
console.log(a+":"+b+":"+c);
let [a1, [[b1], c1]] = [1, [[2], 3]];//嵌套
console.log(a1+":"+b1+":"+c1);
let [ , , third] = ["foo", "bar", "baz"];
console.log(third);
let [x, , y] = [1, 2, 3];
console.log(x+":"+y);
/*不完全解析*/
let [x1, y1] = [1, 2, 3];
console.log(x1+":"+y1);
let [x3,, y3 = "cc", z3 = "ccy"] = [1, 2, 3];
console.log(x3+":"+y3+":"+z3);
let [a2, [b2], d2] = [1, [2, 3], 4];
console.log(a2+":"+b2+":"+d2);
}
};
arr();
/*对象解构赋值*/
function obj(){
/*对象的属性没有次序,变量必须与属性同名,才能取到正确的值*/
let {foo, bar ,arr:[name,age,id="001"]} = {foo: "aaa", bar: "bbb" ,arr:["zhangsan","18"]};
console.log(foo+":"+bar+":"+name+":"+age+":"+id);
}
obj();
/*字符串解构*/
let [q,w,e] = "ccy";
console.log(e);
/*函数参数解构*/
let funObj = {
name:"ccy",
age:"18"
};
function show({name,age,id="002"}){
console.log(name+":"+age+":"+id);
}
show(funObj);
14.class
/*之前语法定义类*/
/*定义一个类*/
function Person(name,age,add){
this.name = name;
this.age = age;
this.add = add;
this.say = function(){
console.log(this.name+":"+this.age+":"+this.add);
}
}
/*定义鼎泰属性和静态方法*/
Person.node = "ccy";
Person.run = function () {
};
/*实例化出来一个对象*/
var student1 = new Person("王**",28,"福山区");
student1.say();
/*ES6定义类的语法*/
class Human{//定义类名
constructor(name,age,add){//构造函数
this.name = name; //成员属性
this.age = age;
this.add = add;
this.say = function(){ //成员方法
console.log(this.name+":"+this.age+":"+this.add+":1");
};
/*方法重载:在同一个类里面,方法名相同,参数列表不一样。
但是这里没有重载!!!只是覆盖!*/
/*this.say = function (id,no) {
console.log(this.name+":"+this.age+":"+this.add+":"+":2");
}*/
}
/*静态属性和方法*/
//static 'n' = "jereh";
static sayName(){
console.log("我是类方法!");
}
}
let student2 = new Human("龚*",27.5,"莱山区");
//Human.sayName();
student2.say();
student2.say("10001","1608");
//console.log(Human.n);
Human.sayName();
/*继承*/
class Animal{
constructor(kind){
this.kind = kind;
}
say(){
console.log(this.kind+"也会说话");
}
}
let dog = new Animal("狗");
dog.say();
class Dog extends Animal{
/*如果又自定义构造函数,一定注意调用super()*/
constructor(kind,CatchR){
super();
this.kind = kind;
this.CatchR = CatchR;
}
/*之前的方法不能满足需要,这里进行 重写 !!*/
say(){ //方法的重写
console.log(this.kind+"汪汪!"+this.kind+"追"+this.CatchR);
}
}
let dog2 = new Dog("狗","兔子");
dog2.say();
class Cat extends Animal{
constructor(kind,EatFish){
super();
this.kind = kind;
this.EatFish = EatFish;
}
say(){
console.log(this.kind +"喵喵!"+this.kind+"吃"+this.EatFish)
}
}
var cat = new Cat("猫","鱼");
cat.say();