ES6 常用语法

1.新的声明方式

字面理解ES6的三种声明方式:

  • var 它是variable的简写,可以理解成变量的意思。
  • let 它在英文中是“让”的意思,也可以理解为一种声明的意思。
  • const 它在英文中也是常量的意思,在ES6也是用来声明常量的,常量你可以简单理解为不变的量。

2.变量的解构赋值

  • 数组的解构赋值:

以前,为变量赋值,我们只能直接指定值。比如下面的代码:

let a=0;
let b=1;
let c=2;

而现在我们可以用数组解构的方式来进行赋值。

let  [a,b,c]=[1,2,3];

上面的代码表示,可以从数组中提取值,按照位置的对象关系对变量赋值。

  • 数组模式和赋值模式统一

可以简单的理解为等号左边和等号右边的形式要统一,如果不统一解构将失败。

let [a,[b,c],d]=[1,[2,3],4];

如果等号两边形式不一样,很可能获得undefined或者直接报错。

  • 解构的默认值

解构赋值是允许你使用默认值的,先看一个最简单的默认是的例子。

let [foo = true] =[];
console.log(foo); //控制台打印出true

上边的例子数组中只有一个值,可能你会多少有些疑惑,我们就来个多个值的数组,并给他一些默认值。

let [a,b="天天向上"]=['好好学习']
console.log(a+b); //控制台显示“好好学习天天向上”

现在我们对默认值有所了解,需要注意的是undefined和null的区别。

let [a,b="天天向上"]=['好好学习',undefined];
console.log(a+b); //控制台显示“好好学习天天向上”

undefined相当于什么都没有,b是默认值。

let [a,b="天天向上"]=['好好学习',null];
console.log(a+b); //控制台显示“好好学习null”

null相当于有值,但值为null。所以b并没有取默认值,而是解构成了null。

  • 对象的解构赋值

解构不仅可以用于数组,还可以用于对象。

let {foo,bar} = {foo:'好好学习',bar:'天天向上'};
console.log(foo+bar); //控制台打印出了“好好学习天天向上”

注意:对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

  • 圆括号的使用

如果在解构之前就定义了变量,这时候你再解构会出现问题。下面是错误的代码,编译会报错。

let foo;
{foo} = {foo:'好好学习'};
console.log(foo);

要解决报错,使程序正常,我们这时候只要在解构的语句外边加一个圆括号就可以了。

let foo;
({foo} ={foo:'好好学习'});
console.log(foo); // 好好学习
  • 字符串解构

字符串也可以解构,这是因为,此时字符串被转换成了一个类似数组的对象。

const [a,b,c,d,e,f]="好好学习";
console.log(a);
console.log(b);
console.log(c);
console.log(d);
console.log(e);
console.log(f);

3.扩展运算符和rest运算符

  • 对象扩展运算符(…)

当编写一个方法时,我们允许它传入的参数是不确定的。这时候可以使用对象扩展运算符来作参数,看一个简单的列子:

function fun(...arg){
    console.log(arg[0]);
    console.log(arg[1]);
    console.log(arg[2]);
    console.log(arg[3]);

}
fun(1,2,3);

这时我们看到控制台输出了 1,2,3,undefined,这说明是可以传入多个值,并且就算方法中引用多了也不会报错。

  • 扩展运算符的用处

我们先用一个例子说明,我们声明两个数组arr1和arr2,然后我们把arr1赋值给arr2,然后我们改变arr2的值,你会发现arr1的值也改变了,因为我们这是对内存堆栈的引用,而不是真正的赋值。

let arr1=['www','baidu','com'];
let arr2=arr1;
console.log(arr2); 
arr2.push('Google');
console.log(arr1);

控制台输出:

["www", "baidu", "com"]
["www", "baidu", "com", "Google"]

这是我们不想看到的,可以利用对象扩展运算符简单的解决这个问题,现在我们对代码进行改造。

let arr1=['www','baidu','com'];
//let arr2=arr1;
let arr2=[...arr1];
console.log(arr2);
arr2.push('Google');
console.log(arr2);
console.log(arr1);

现在控制台预览时,你可以看到我们的arr1并没有改变,简单的扩展运算符就解决了这个问题。

  • rest运算符

如果你已经很好的掌握了对象扩展运算符,那么理解rest运算符并不困难,它们有很多相似之处,甚至很多时候你不用特意去区分。它也用…(三个点)来表示,我们先来看一个例子。

function fun(first,...arg){
    console.log(arg.length);
}

fun(0,1,2,3,4,5,6,7);

这时候控制台打印出了7,说明我们arg里有7个数组元素,这就是rest运算符的最简单用法。

  • 如何循环输出rest运算符

这里我们用for…of循环来进行打印出arg的值。

function fun(first,...arg){
    for(let val of arg){
        console.log(val);
    }
}

fun(0,1,2,3,4,5,6,7);

4.字符串模版

  • 字符串模版

先来看一个在ES5下我们的字符串拼接案例:

let skill='js';
let blog = '我是一名前端工程师,我会 '+skill;
document.write(blog);

ES5下必须用+skill这样的形式进行拼接,这样很麻烦而且很容易出错。ES6新增了字符串模版,可以很好的解决这个问题。字符串模版不再使用‘xxx’这样的单引号,而是换成了xxx这种形式,也叫连接号。这时我们再引用skill变量就需要用${skill}这种形式了,我们对上边的代码进行改造。

let skill='js';
let blog = `我是一名前端工程师,我会${skill}`;
document.write(blog);

可以看到浏览器出现了和上边代码一样的结果。而且这里边支持html标签,可以试着输入一些。

  • 对运算的支持
let a=1;
let b=2;
let result=`${a+b}`;
document.write(result);

字符串查找

  • 查找是否存在
//es5 中
let skill='js';
let blog = `我是一名前端工程师,我会${skill}`;
document.write(blog.indexOf(skill));

这是网页中输出了12,我们还要自己判断。

ES6直接用includes就可以判断,不再返回索引值,这样的结果我们更喜欢,更直接。

let skill='js';
let blog = `我是一名前端工程师,我会${skill}`;
document.write(blog.includes(skill));
  • 判断开头是否存在
blog.startsWith(skill);
  • 判断结尾是否存在
blog.endsWith(skill)

需要注意的是:starts和ends 后边都要加s。

  • 复制字符串

我们有时候是需要字符串重复的,比如分隔符和特殊符号,这时候复制字符串就派上用场了,语法很简单。

document.write('skill|'.repeat(3));

5.ES6的数组

  • JSON数组格式转换
let  json = {
    '0': '好好学习',
    '1': '天天向上',
    '2': '努力工作',
    length:3
}

这就是一个标准的JSON数组格式,跟普通的JSON对比是在最后多了一个length属性。只要是这种特殊的json格式都可以轻松使用ES6的语法转变成数组。在ES6中绝大部分的Array操作都存在于Array对象里。我们就用Array.from(xxx)来进行转换。我们把上边的JSON代码转换成数组,并打印在控制台。

let  json = {
    '0': '好好学习',
    '1': '天天向上',
    '2': '努力工作',
    length:3
}

let arr=Array.from(json);
console.log(arr)

实际开发中这种方法还是比较常用的,毕竟节省了我们代码行数,也让我们的程序更清晰。

  • Array.of()

它负责把一堆文本或者变量转换成数组。在开发中我们经常拿到了一个类似数组的字符串,需要使用eval来进行转换,如果你一个老手程序员都知道eval的效率是很低的,它会拖慢我们的程序。这时候我们就可以使用Array.of方法。我们看下边的代码把一堆数字转换成数组并打印在控制台上:

let arr =Array.of(3,4,5,6);
console.log(arr);

当然它不仅可以转换数字,字符串也是可以转换的,看下边的代码:

let arr =Array.of('好好学习','天天向上','努力工作');
console.log(arr);
  • find()

所谓的实例方法就是并不是以Array对象开始的,而是必须有一个已经存在的数组,然后使用的方法,这就是实例方法(不理解请看下边的代码,再和上边的代码进行比对,你会有所顿悟)。这里的find方法是从数组中查找。在find方法中我们需要传入一个匿名函数,函数需要传入三个参数:

  1. value:表示当前查找的值。
  2. index:表示当前查找的数组索引。
  3. arr:表示当前数组。

在函数中如果找到符合条件的数组元素就进行return,并停止查找。你可以拷贝下边的代码进行测试,就会知道find作用。

let arr=[1,2,3,4,5,6,7,8,9];
console.log(arr.find(function(value,index,arr){
    return value > 5;
}))
  • fill( )

fill()也是一个实例方法,它的作用是把数组进行填充,它接收三个参数,第一个参数是填充的变量,第二个是开始填充的位置,第三个是填充到的位置。

let arr=[0,1,2,3,4,5,6,7,8,9];
arr.fill('好好学习',2,5);//把数组从第二位到第五位用“好好学习”进行填充
console.log(arr);//[0, 1, "好好学习", "好好学习", "好好学习", 5, 6, 7, 8, 9]

上边的代码是把数组从第二位到第五位用“好好学习”进行填充。

  • for…of循环

这种形式比ES5的for循环要简单而且高效。先来看一个最简单的for…of循环

let arr=['好好学习','天天向上','努力工作']

for (let item of arr){
    console.log(item);
}
//好好学习
//天天向上
//努力工作

for…of数组索引:有时候开发中是需要数组的索引的,那我们可以使用下面的代码输出数组索引。

let arr=['好好学习','天天向上','努力工作']
for (let index of arr.keys()){
    console.log(index);
}

可以看到这时的控制台就输出了0,1,2,也就是数组的索引。

同时输出数组的内容和索引:我们用entries()这个实例方法,配合我们的for…of循环就可以同时输出内容和索引了。

let arr=['好好学习','天天向上','努力工作']
for (let [index,val] of arr.entries()){
    console.log(index+':'+val);
}
  • entries( )

entries()实例方式生成的是Iterator形式的数组,那这种形式的好处就是可以让我们在需要时用next()手动跳转到下一个值。我们来看下面的代码:

let arr=['好好学习','天天向上','努力工作']
let list=arr.entries();
console.log(list.next().value);
console.log(list.next().value);
console.log(list.next().value);
6. ES6中的箭头函数和扩展

之前我们写函数:

function add(a,b){
    return a+b;
}
console.log(add(1,2));

我们声明了一个add函数,然后传入a和b两个值,返回a+b的值。 然后我们在控制台打印了这个函数的返回结果,这里是3.

  • 默认值

在ES6中给我们增加了默认值的操作,我们修改上边的代码,可以看到现在只需要传递一个参数也是可以正常运行的。

function add(a,b=2){
    return a+b;
}
console.log(add(1));//3
  • 主动抛出错误
    在使用Vue的框架中,可以经常看到框架主动抛出一些错误,比如v-for必须有:key值。那尤大神是如何做到的那?其实很简单,ES6中我们直接用throw new Error( xxxx ),就可以抛出错误。
function add(a,b=1){

    if(a == 0){
        throw new Error('This is error')
    }
     return a+b;
}

console.log(add(0));
  • 函数中的严谨模式

我们在ES中就经常使用严谨模式来进行编程,但是必须写在代码最上边,相当于全局使用。在ES6中我们可以写在函数体中,相当于针对函数来使用。

function add(a,b=1){
    'use strict'
    if(a == 0){
        throw new Error('This is error');
    }
     return a+b;
}

console.log(add(1));

上边的代码如果运行的话,你会发现浏览器控制台报错,这是ES6中的一个坑,这个错误的原因就是如果你使用了默认值,再使用严谨模式的话,就会有冲突,所以我们要取消默认值的操作,这时候你在运行就正常了。

  • 获得需要传递的参数个数

如果你在使用别人的框架时,不知道别人的函数需要传递几个参数怎么办?ES6为我们提供了得到参数的方法(xxx.length).我们用上边的代码看一下需要传递的参数个数。

function add(a,b){
    'use strict'
    if(a == 0){
        throw new Error('This is error');
    }
     return a+b;
}

console.log(add.length);

这时控制台打印出了2,但是如果我们去掉严谨模式,并给第二个参数加上默认值的话,这时候add.length的值就变成了1, 也就是说它得到的是必须传入的参数。

箭头函数

改造一下之前学的add函数,写成箭头函数

var add =(a,b=1) => a+b;
console.log(add(1));
  • {}的使用

在箭头函数中,方法体内如果是两句话,那就需要在方法体外边加上{}括号。例如下边的代码就必须使用{}.

var add =(a,b=1) => {
    console.log('111111')
    return a+b;
};
console.log(add(1));

箭头函数中不可加new,也就是说箭头函数不能当构造函数进行使用。

7. ES6中的函数和数组补漏
  • 对象的函数解构

我们在前后端分离时,后端经常返回来JSON格式的数据,前端的美好愿望是直接把这个JSON格式数据当作参数,传递到函数内部进行处理。ES6就为我们提供了这样的解构赋值。

let json = {
    a:'好好学习',
    b:'天天向上'
}
function fun({a,b='努力工作'}){
    console.log(a,b);
}
fun(json);//好好学习 天天向上

  • 数组的函数解构

函数能解构JSON,那解构我们的数组就更不在话下了,我们看下边的代码。我们声明一个数组,然后写一个方法,最后用…进行解构赋值。

let arr = ['好好学习','天天向上','努力工作'];
function fun(a,b,c){
    console.log(a,b,c);
}

fun(...arr);
  • in

in是用来判断对象或者数组中是否存在某个值的。我们先来看一下用in如何判断对象里是否有某个值。

对象判断

let obj={
    a:'好好学习',
    b:'天天向上'
}
console.log('a' in obj); //true
  • 数组判断

先来看一下ES5判断的弊端,以前会使用length属性进行判断,为0表示没有数组元素。但是这并不准确,或者说真实开发中有弊端。

let arr=[,,,,,];
console.log(arr.length); //5

上边的代码输出了5,但是数组中其实全是空值,这就是一个坑啊。那用ES6的in就可以解决这个问题。

let arr=[,,,,,];
console.log(0 in arr); //false

let arr1=['好好学习','天天向上'];
console.log(0 in arr1);  // true

注意:这里的0指的是数组下标位置是否为空。

  • 数组的遍历方法

1.forEach

let arr=['好好学习','天天向上','努力工作'];

arr.forEach((val,index)=>console.log(index,val));

2.filter

let arr=['好好学习','天天向上','努力工作'];

arr.filter(x=>console.log(x));

3.some

let arr=['好好学习','天天向上','努力工作'];

arr.some(x=>console.log(x));

4.map

let arr=['好好学习','天天向上','努力工作'];

console.log(arr.map(x=>'web'));

map在这里起到一个替换的作用,这个我们后续课程会详细讲解。

5.join()

let arr=['好好学习','天天向上','努力工作'];

console.log(arr.join('|'));

6.toString()

let arr=['好好学习','天天向上','努力工作'];

console.log(arr.toString());

8.ES6中对象

  • 对象赋值

ES6允许把声明的变量直接赋值给对象,我们看下面的例子。

let name="xiaoxianxian";
let skill= 'web';
var obj= {name,skill};
console.log(obj);  //Object {name: "xiaoxianxian", skill: "web"}
  • 对象Key值构建

有时候我们会在后台取出key值,而不是我们前台定义好的,这时候我们如何构建我们的key值那。比如我们在后台取了一个key值,然后可以用[ ] 的形式,进行对象的构建。

let key='skill';
var obj={
    [key]:'web'
}
console.log(obj.skill);

自定义对象方法

var obj={
    add:function(a,b){
        return a+b;
    }
}
console.log(obj.add(1,2));  //3
  • Object.is( ) 对象比较

对象的比较方法,以前进行对象值的比较,经常使用===来判断,比如下面的代码:

var obj1 = {name:'xiaoxianxian'};
var obj2 = {name:'xiaoxianxian'};
console.log(obj1.name === obj2.name);//true

那ES6为我们提供了is方法进行对比。

var obj1 = {name:'xiaoxianxian'};
var obj2 = {name:'xiaoxianxian'};
console.log(obj1.name === obj2.name);//true
console.log(Object.is(obj1.name,obj2.name)); //true

区分=== 和 is方法的区别是什么,看下面的代码输出结果。

console.log(+0 === -0);  //true
console.log(NaN === NaN ); //false
console.log(Object.is(+0,-0)); //false
console.log(Object.is(NaN,NaN)); //true

"===为同值相等,is()为严格相等。"

  • Object.assign( )合并对象

操作数组时我们经常使用数组合并,那对象也有合并方法,那就是assgin( )。看一下啊具体的用法。

var a={a:'好好学习'};
var b={b:'天天向上'};
var c={c:'努力工作'};

let d=Object.assign(a,b,c)
console.log(d);

9.Symbol在对象中的作用

  • 声明Symbol
var a = new String;
var b = new Number;
var c = new Boolean;
var d = new Array;
var e = new Object; 
var f= Symbol();
console.log(typeof(d));
  • Symbol的打印

我们先声明一个Symbol,然后我们在控制台输出一下。

var g = Symbol('web');
console.log(g);
console.log(g.toString());

这时候我们仔细看控制台是有区别的,没有toString的是红字,toString的是黑字。

  • Symbol在对象中的应用
var xx = Symbol();
var obj={
    [xx]:'前端开发'
}
console.log(obj[xx]);
obj[xx]='web';
console.log(obj[xx]);
  • Symbol对象元素的保护作用
    在对象中有很多值,但是循环输出时,并不希望全部输出,那我们就可以使用Symbol进行保护

没有进行保护的写法:

var obj={name:'xiaoxianxian',skill:'web',age:18};

for (let item in obj){
    console.log(obj[item]);
}

现在我不想别人知道我的年龄,这时候我就可以使用Symbol来进行循环保护。

let obj={name:'xiaoxianxian',skill:'web'};
let age=Symbol();
obj[age]=18;
for (let item in obj){
    console.log(obj[item]);
} 
console.log(obj);

9.Set和WeakSet数据结构

  • set的声明
let setArr = new Set(['好好学习','天天向上']);
console.log(setArr);//Set {'好好学习','天天向上'}

Set和Array 的区别是Set不允许内部有重复的值,如果有只显示一个,相当于去重。虽然Set很像数组,但是他不是数组。

  • Set值的增删查

追加add

在使用Array的时候,可以用push进行追加值,那Set稍有不同,它用更语义化的add进行追加。

let setArr = new Set(['好好学习','天天向上']);
console.log(setArr);//Set {'好好学习','天天向上'}

setArr.add('前端职场');
console.log(setArr);

删除delete

let setArr = new Set(['好好学习','天天向上']);
console.log(setArr);//Set {'好好学习','天天向上'}

setArr.add('前端职场');
console.log(setArr); //Set {'好好学习','天天向上', "前端职场"}

setArr.delete('前端职场');
console.log(setArr); //Set {'好好学习','天天向上'}

查找has

用has进行值的查找,返回的是true或者false。

let setArr = new Set(['好好学习','天天向上']);
console.log(setArr);//Set {'好好学习','天天向上'}

console.log(setArr.has('好好学习'));//true

删除clear

let setArr = new Set(['好好学习','天天向上']);
console.log(setArr);//Set {'好好学习','天天向上'}
setArr.clear();

console.log(setArray);//true

set的循环 for…of…循环

let setArr = new Set(['好好学习','天天向上']);
for (let item of setArr){
    console.log(item);
}

size属性 size属性可以获得Set值的数量。

let setArr = new Set(['好好学习','天天向上']);
for (let item of setArr){
    console.log(item);
}

console.log(setArr.size);

forEach循环

let setArr = new Set(['好好学习','天天向上']);
setArr.forEach((value)=>console.log(value));
  • WeakSet的声明
let weakObj=new WeakSet();
let obj={a:'好好学习',b:'天天向上'}
weakObj.add(obj);

console.log(weakObj);

这里需要注意的是,如果你直接在new 的时候就放入值,将报错。

WeakSet里边的值也是不允许重复的,我们来测试一下。

let weakObj=new WeakSet();
let obj={a:'好好学习',b:'天天向上'}
let obj1=obj;

weakObj.add(obj);
weakObj.add(obj1);

console.log(weakObj);

10.map数据结构

  • Json和map格式的对比
let json = {
    name:'xiaoxianxian',
    skill:'web'
}
console.log(json.name);

但是这种反应的速度要低于数组和map结构。而且Map的灵活性要更好,你可以把它看成一种特殊的键值对,但你的key可以设置成数组,值也可以设置成字符串,让它不规律对应起来。

let json = {
    name:'xiaoxianxian',
    skill:'web'
}
console.log(json.name);

var map=new Map();
map.set(json,'iam');
console.log(map);

当然也可key字符串,value是对象。我们调换一下位置,依然是符合map的数据结构规范的。

map.set('xiaoxianxian',json);
console.log(map);
  • 取值get

现在取json对应的值。

console.log(map.get(json));
  • 删除delete

删除delete的特定值:

map.delete(json);
console.log(map)
  • size属性
console.log(map.size);

  • 查找是否存在has
consolec .log(map.has('xiaoxianxian'))

  • 清楚所有元素clear
map.clear()

11.用Proxy进行预处理

先了解一个概念“钩子函数”:当我们在操作一个对象或者方法时会有几种动作,比如:在运行函数前初始化一些数据,在改变对象值后做一些善后处理。这些都算钩子函数。

Proxy的存在就可以让我们给函数加上这样的钩子函数,你也可以理解为在执行方法前预处理一些代码。你可以简单的理解为他是函数或者对象的生命周期。

在学习新知识之前,先来回顾一下定义对象的方法。

var obj={
    add:function(val){
        return val+10;
    },
    name:'I am xiaoxianxian'

};
console.log(obj.add(100));
console.log(obj.name);
  • 声明Proxy

我们用new的方法对Proxy进行声明。可以看一下声明Proxy的基本形式。new Proxy({},{});

需要注意的是这里是两个花括号,第一个花括号就相当于我们方法的主体,后边的花括号就是Proxy代理处理区域,相当于我们写钩子函数的地方。

现在把上边的obj对象改成我们的Proxy形式。

var pro = new Proxy({
    add: function (val) {
        return val + 10;
    },
    name: 'I am xiaoxianxian'
}, 
{
    get:function(target,key,property){
        console.log('come in Get');
        return target[key];
    }
});

console.log(pro.name);

可以在控制台看到结果,先输出了come in Get。相当于在方法调用前的钩子函数。

  • get属性

get属性是在你得到某对象属性值时预处理的方法,他接受三个参数

target:得到的目标值

key:目标的key值,相当于对象的属性

property:这个不太常用,用法还在研究中,还请大神指教。
  • set属性

set属性是值你要改变Proxy属性值时,进行的预先处理。它接收四个参数。

target:目标值。
key:目标的Key值。
value:要改变的值。
receiver:改变前的原始值。
var pro = new Proxy({
    add: function (val) {
        return val + 10;
    },
    name: 'I am xiaoxianxian'
}, 
{
    get:function(target,key){
        console.log('come in Get');
        return target[key];
    },
    set:function(target,key,value,receiver){
        console.log(`    setting ${key} = ${value}`);
        return target[key] = value;
    }

});

console.log(pro.name);
pro.name='xiaoxianxian';
console.log(pro.name);
  • apply的使用

apply的作用是调用内部的方法,它使用在方法体是一个匿名函数时。看下边的代码。

get = function () {
    return 'I am xiaoxianxian';
};
var handler = {
    apply(target, ctx, args) {
        console.log('do apply');
        return Reflect.apply(...arguments);
    }
}

var pro = new Proxy(target, handler);

console.log(pro());

proxy的知识是非常多的,这里我建议看阮一峰大神的《ES6》

12.promise对象的使用

  • promise的基本用法

promise执行多步操作非常好用,那我们就来模仿一个多步操作的过程,那就以吃饭为例吧。要想在家吃顿饭,是要经过三个步骤的。

1.洗菜做饭。
2.坐下来吃饭。
3.收拾桌子洗碗。

这个过程是有一定的顺序的,你必须保证上一步完成,才能顺利进行下一步。我们可以在脑海里先想想这样一个简单的过程在ES5写起来就要有多层的嵌套。那我们现在用promise来实现。

let state=1;

function step1(resolve,reject){
    console.log('1.开始-洗菜做饭');
    if(state==1){
        resolve('洗菜做饭--完成');
    }else{
        reject('洗菜做饭--出错');
    }
}


function step2(resolve,reject){
    console.log('2.开始-坐下来吃饭');
    if(state==1){
        resolve('坐下来吃饭--完成');
    }else{
        reject('坐下来吃饭--出错');
    }
}


function step3(resolve,reject){
    console.log('3.开始-收拾桌子洗完');
     if(state==1){
        resolve('收拾桌子洗完--完成');
    }else{
        reject('收拾桌子洗完--出错');
    }
}

new Promise(step1).then(function(val){
    console.log(val);
    return new Promise(step2);

}).then(function(val){
     console.log(val);
    return new Promise(step3);
}).then(function(val){
    console.log(val);
    return val;
});

13.class类的使用

先声明一个最简单的coder类,类里只有一个name方法,方法中打印出传递的参数。

class coder{
    name(val){
        console.log(val);
    }
}
  • 类的声明
    我们已经声明了一个类,并在类里声明了name方法,现在要实例化类,并使用类中的方法。
class Coder{
    name(val){
        console.log(val);
    }
}

let xiaoxianxian= new Coder;
xiaoxianxian.name('xiaoxianxian');
  • 类的多方法声明
class Coder{
    name(val){
        console.log(val);
        return val;
    }
    skill(val){
        console.log(this.name('xiaoxianxian')+':'+'Skill:'+val);
    }
}

let xiaoxianxian= new Coder;
xiaoxianxian.name('xiaoxianxian');
xiaoxianxian.skill('web');

这里需要注意的是两个方法中间不要写逗号了,还有这里的this指类本身,还有要注意return 的用法。

  • 类的传参

在类的参数传递中我们用constructor( )进行传参。传递参数后可以直接使用this.xxx进行调用。

class Coder{
    name(val){
        console.log(val);
        return val;
    }
    skill(val){
        console.log(this.name('xiaoxianxian')+':'+'Skill:'+val);
    }

    constructor(a,b){
        this.a=a;
        this.b=b;
    }

    add(){
        return this.a+this.b;
    }
}

let xiaoxianxian=new Coder(1,2);
console.log(xiaoxianxian.add());

我们用constructor来约定了传递参数,然后用作了一个add方法,把参数相加。这和以前我们的传递方法有些不一样,所以需要注意下。

  • class的继承
class htmler extends Coder{

}

let pang=new htmler;
pang.name('xiaoxianxian');

声明一个htmler的新类并继承Coder类,htmler新类里边为空,这时候我们实例化新类,并调用里边的name方法。结果也是可以调用到的。

14.模块化操作

在ES5中我们要进行模块华操作需要引入第三方类库,随着前后端分离,前端的业务日渐复杂,ES6为我们增加了模块话操作。模块化操作主要包括两个方面。

export :负责进行模块化,也是模块的输出。
import : 负责把模块引,也是模块的引入操作。

export

export可以让我们把变量,函数,对象进行模块话,提供外部调用接口,让外部进行引用。先来看个最简单的例子,把一个变量模块化。我们新建一个temp.js文件,然后在文件中输出一个模块变量。

export var a = 'xiaoxianxian';

然后可以在index.js中以import的形式引入。

import {a} from './temp.js';

console.log(a);

这就是一个最简单的模块的输出和引入。

  • 多变量的输出
    这里声明了3个变量,需要把这3个变量都进行模块化输出,这时候我们给他们包装成对象就可以了。
var a ='xiaoxianxian';
var b ='xiaoxianxian2';
var c = 'web';

export {a,b,c}

函数的模块化输出

export function add(a,b){
    return a+b;
}

as的用法 有些时候我们并不想暴露模块里边的变量名称,而给模块起一个更语义话的名称,这时候我们就可以使用as来操作。

var a ='好好学习';
var b ='天天向上';
var c = 'web';

export {
    x as a,
    y as b,
    z as c
}

export default的使用 加上default相当是一个默认的入口。在一个文件里export default只能有一个。我们来对比一下export和export default的区别

  • export
export var a ='xiaoxianxian';

export function add(a,b){
    return a+b;
}

对应的导入方式

import {a,add} form './temp';//也可以分开写

  • export defalut
export default var a='xiaoxianxian';

对应的引入方式

import str from './temp';

ES6的模块化不能直接在浏览器中预览,必须要使用Babel进行编译之后正常看到结果。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344