es6终极分享(一)

1.扩展运算符,rest(剩余)运算符,用于操作数组和对象( {} )
  ...

之前在解构赋值里提到过

let [a,b,...c] = [1,2,3,4,5,6,7];
//  a :1
//  b :2
//  c:[4,5.6.7]

注意,...只能写在最后,不能写在中间,比如 :

let [a,b,...c,d] = [1,2,3,4,5,6,7]; // 报错

可以用来展开数组

let arr = ['a','b','c'];
console.log(...arr) // a b c

用来给函数传参,比如要给一串数字进行简单的排序

show(1,8,3,4,5); // [1,3,4,5,8]

function show(...arr){
      return arr.sort();
}

如果不用...的话,用不定参来写,那就需要写成这样的

show(1,8,3,4,5); // [1,3,4,5,8]

function show(){
    let arr = Array.prototype.slice.call(arguments);
    return arr.sort();
}

很明显用...的话语法会简洁很多。(而且,如果你使用箭头函数的话,箭头函数是没有arguments这个东西的)

还可以利用...快速复制一个数组,很方便

let arr = [1,2,3,4,5];
let arr2 = [...arr]; // 将数组arr复制到arr2 ,并且修改arr2不会改变arr;

复制数组,还可以用Array.from();

let arr = [1,2,3,4,5];
let arr2 = Array.from(arr); // 作用同上
2.数组的循环

数组的循环有很多,arr.forEach(); arr.map(); arr.filter(); arr.some(); arr.every(); arr.reduce(); arr.reduceRight(); 但是常用的也就是arr.forEach() 和 arr.map(),所以只说一下这两个的语法。
arr.forEach() 和 arr.map()的参数都是一样的,接收三个参数。

arr.forEach(( val, index , arr )=>{});
// val:数组每一项的值,index:数组的下标,arr:将原数组原模原样的返回

看个例子:

let arr = ['apple','banana','orange'];
arr.forEach(( val, index , arr )=>{
  console.log(val,index,arr);
});
// apple   0   ['apple','banana','orange']
// banana  1   ['apple','banana','orange']
// orange  2   ['apple','banana','orange']

arr.forEach()就是用来代替for循环的,一般没有返回值,对比之下arr.map()一般都需要配合return使用,如果不写return的话,就跟forEach没有什么区别了,所以建议在使用map的时候写上返回值,emmm
arr.map()的用处主要就是改变数据结构,比如后台返回的数据,我们需要做一下处理,举个栗子

let arr = [
    {time:'04-28',name:'aaa'},
    {time:'04-29',name:'bbb'},
    {time:'04-30',name:'ccc'},
];
let arr2 = arr.map(( val, index , arr )=>{
    let json = {...val}; //剩余运算符也可以对json使用
     json.time = `2019-${val.time}`;
     return json;
});
console.log(arr);
console.log(arr2);
1.jpg

提一嘴arr.filter();顾名思义,就是过滤,它的参数跟forEach和map一样,如果回调函数返回true就留下来。

3.for...of...

for...of...循环可以代替forEach循环

let arr = ['apple','banana','orange'];
for(let val of arr){
  console.log(val);// apple  banana  orange
}

可能你也发现了,这个返回值只有值没有下标,如果你想要下标,可以这么写

let arr = ['apple','banana','banana'];
for(let index of arr.keys()){
  console.log(index );// 0 1 2
}

可能你又发现了,谁只要下标啊,当然是值和下标都想要啊,那你可以这么写

let arr = ['apple','banana','orange'];
for(let item of arr.entries()){
  console.log(item );
// [0, "apple"]
// [1, "banana"]
// [2, "orange"]
}

可能你又又发现了,返回的是个数组?那不如解构一下?

let arr = ['apple','banana','orange'];
for(let [index,val] of arr.entries()){
  console.log(index,val);
// 0 "apple"
// 1 "banana"
// 2 "orange"
}

完美~~~

4.对象 (json)

1.对象的简洁语法

let name = 'aaa';
let age = '18';
let json = {
    name,
    age,
    showName(){
      // .......
    }
}

注意,对象里面的函数就不要用箭头函数了,可能会出现this指向不对的问题,举一反三要分情况,emmmm

2.Object.assign(); 用来合并对象

let json1 = {a:1};
let json2 = {b:2};
let json3 = {c:3};
Object.assign({},json1 ,json2 ,json3 ); //{a: 1, b: 2, c: 3}

而且,后面的会覆盖前面的

let json1 = {a:1};
let json2 = {b:2};
let json3 = {c:3,a:3};
Object.assign({},json1 ,json2 ,json3 ); //{a: 3, b: 2, c: 3}

这个可以用来传参,比如封装ajax,默认一套参数,传过去另一套,最后合并,自己传的参数会覆盖掉默认的参数.....

5.模块化module

需要在script 标签里加上 type="module"

<script type="module"></script>

定义和使用

 // 定义模块                      //使用模块         
                                 import './module/1.js';    //路径可以是相对路径也可以是绝对路径
export const a = 12;             import {a} from  './module/1.js';  
export {                         import {a,b,c} from  './module/1.js';  
  a,
  b,
  c
}  

export {                         import {aaa,bbb,ccc} from  './module/1.js';  
  a as aaa,                      import {aaa as a,bbb as b,ccc as c} from  './module/1.js';  
  b as bbb,
  c as ccc
} 

export default a = 12;           import a from  './module/1.js';  

export default a = 12;           import a , {b,c} from  './module/1.js';  
export let b = 5;
export let c = 102;

import 只会导入一次,而且有提升效果。
默认import 语法不能写入if语句当中,如果想要动态引入js模块,可以使用import();

let a = 12;
if(a==12){
    import( './module/1.js');
}else{
    import( './module/2.js');
}

import()的返回值是一个promise对象,可以使用.then

6.类和继承

1.1让我们先来回忆下ES6之前的类

funciton Person(name,age){
    this.name = name; // 属性
    this.age = age;
}
// 方法
Person.prototype.showName = function(){
    return `姓名为${this.name}`;
}
let p1  = new Person('Clark Gable',28);
console.log(p1.name);// Clark Gable
console.log(p1.showName );// 姓名为Clark Gable

1.2ES6之前的继承

比如上面的是父类,那子类的写法是

function Student(name,skill){
    Person.call(this,name); //继承属性
    this.skill = skill ;
}
Student.prototype = new Person(); // 继承方法
let stu1 =  new Student('Jack','啥也不会');

console.log(stu1.name);// Jack
console.log(stu1.skill);// 啥也不会
console.log(stu1.showName()); // 姓名为Jack

2.1下面我们看看ES6的类

class Person{
     constructor(name,age){ // 属性
          this.name = name;
          this.age = age;
      }
      showName(){
          return `姓名为${this.name}`;
      }
      showAge(){
          return `年纪为${this.age}`;
      }
}
let p1  = new Person('Clark Gable',28);
console.log(p1.showName());// 姓名为Clark Gable
console.log(p1.showAge());// 年纪为28

2.2看看ES6的继承

class Student extends Person{
    constructor(name,skill){
        super(name);
        this.skill = skill;
    }
    showSkill(){
        return `技能是${this.skill}`;
    }
}
let stu1 = new Student('Jack','会点啥');
console.log(stu1.name); //Jack
console.log(stu1.skill); //会点啥
console.log(stu1.showSkill()); //技能是会点啥
console.log(stu1.showName()); //姓名为Jack
7.Set

Set本身是一个构造函数,用来生成 Set 数据结构。类似数组,但是里面的成员不能有重复值

let arr1 = new Set(['a','b','c','b']);
console.log(arr1) ;// {'a','b'}

怕你们不信,截图为证:


2.jpg

利用不能有重复值这一点可以进行数组去重...

let arr = [1,3,5,2,3,4,2,10,9];
let arr1 = [...new Set(arr)]; // [1, 3, 5, 2, 4, 10, 9]

set身上本身有一些方法,

let arr1 = new Set(['a','b','c','b']);

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

推荐阅读更多精彩内容