ES6

编译/转换

  1. 在线转换(引入browser.js,<script type="text/babel">...</script>)
  2. 提前编译

变量

var变量存在的缺点:

  1. 可以重复声明
  2. 无法限制修改 PI
  3. 没有块级作用域

let 不能重复声明 变量-可以修改 块级作用域
const 不能重复声明 常量-不能修改 块级作用域

eg:解决了我们想通过循环定义函数,函数内部访问全局变量的问题:

window.onload = function () {
  var aBtn = document.getElementsByTagName("input");
  // for (var i = 0; i<aBtn.length; i++){
  //   (function(i){
  //     aBtn[i].addEventListener('click', function () {
  //       alert(i)
  //     })
  //   })(i)
  // }
  for (let i = 0; i < aBtn.length; i++) {
    aBtn[i].addEventListener('click', function () {
      alert(i)
    })
  }
}

函数

胖剪头

  1. 如果只有一个参数,()可以省略
  2. 如果只有一个return,{}可以省略

{}内部使用到的this和外部使用到的this相同

window.onload = function () {
  console.log(this);
  let Method = {};
  // Method.add = function (a, b) {
  //   console.log(this); //Method
  //   return a + b;
  // }
  Method.add = (a, b) => {
    console.log(this); //Window
    return a + b;
  }
  Method.add();
}

函数的参数

  1. 参数扩展/展开
  2. 默认参数

收集剩余参数,必须为最后一个

function show(a, b, c, ...args) {
  // console.log(a);
  // console.log(b);
  // console.log(c);
  console.log(...args); //4 5 6
}
show(1,2,3,4,5,6);

展开数组

let arr = [1,2,3,4,5,6];
show(...arr); //show(1,2,3,4,5,6);

let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
show(...arr1, ...arr2);

默认参数

function show(a=1, b=2, c=3) {}

解构赋值

  1. 左右两边结构必须一样
  2. 右边必须是一个可以解构的对象
  3. 声明和赋值不能分开,必须在一句话中完成

数组:

let [a,b,c] = [1,2,3];
alert(a+b+c); //6

对象(声明的key和对象中的key必须相同,否则赋值失败!):

let {x,y,z} = {x:1,y:2,z:3};
alert(x+y+z); //6

解构可以使用不同的粒度:

let [obj, arr, num, str] = [{
    a: 5,
    b: 4,
    c: 'qet'
  },
  [1, 2, '3'], 12, 'wds'
]
console.log(obj, arr, num, str);

let [{
    a,
    b,
    c
  },
  [n1, n2, s1], num1, str1
] = [{
    a: 5,
    b: 4,
    c: 'qet'
  },
  [1, 2, '3'], 12, 'wds'
]
console.log(a, b, c, n1, n2, s1, num1, str1);

数组

新增方法

  1. forEach 迭代
  2. map 映射
  3. reduce 汇总
  4. filter 过滤

map:

let arr = [0, 1, 2, 3, 4, 5];
let _arr = arr.map(function (value, index, array) {
  console.log(value, index, array);
  return value>3;
})
console.log(_arr); //[false,false,false,false,true,true]

reduce:

let arr = [0, 1, 2, 3, 4, 5];
let result = arr.reduce(function (pre, cur, curIndex, arr) {
  console.log(pre, cur, curIndex, arr);
  if (curIndex === arr.length-1) {
    return (pre + cur) / arr.length;
  }
  return pre + cur;
})
console.log(result); //2.5

filter:

let arr = [0, 1, 2, 3, 4, 5];
let _arr = arr.filter(function (value, index, array) {
  console.log(value, index, array);
  return index % 2 === 0;
})
console.log(_arr); //[0, 2, 4]

forEach:

let arr = [0, 1, 2, 3, 4, 5];
let _arr = arr.forEach(function (value, index, array) {
  console.log(value, index, array);
  array[index] = value * 2;
})
console.log(arr); //[0, 2, 4, 6, 8, 10]
console.log(_arr); //undefined

字符串

多了两个新方法:

  1. startsWith
  2. endsWith

字符串模板:

  1. 使用反单引号
  2. 通过 ${变量} 取值,格式化到字符串中
  3. 可以折行

面向对象

新增class:

// function User(username, password) {
//   this.username = username;
//   this.password = password;
// }

// User.prototype.getUsername = function () {
//   alert(this.username);
// }

// User.prototype.getPassword = function () {
//   alert(this.password);
// }

class User {
  constructor(username, password) {
    this.username = username;
    this.password = password;
  }
  getUsername() {
    alert(this.username);
  }
  getPassword() {
    alert(this.password);
  }
}

let user = new User('admin', '123456');
user.getUsername();
user.getPassword();

继承:

class User {
  constructor(username, password) {
    this.username = username;
    this.password = password;
  }
  getUsername() {
    alert(this.username);
  }
  getPassword() {
    alert(this.password);
  }
}

class VIPUser extends User {
  constructor(username, password, level) {
    super(username, password);
    this.level = level;
  }
  getLevel() {
    alert(this.level);
  }
}
let user = new VIPUser('admin', '123456', 100);
user.getUsername();
user.getPassword();
user.getLevel();

JSON

两个常用方法

  1. JSON.stringify()
  2. JSON.parse() //只能用双引号,且key值必须用双引号包裹

简写:

let a = 1,
    b = 2;
let json = {
  // 键值相同可以简写
  // a: a,
  // b: b,
  a,
  b,
  // showA: function () {
  //   alert(this.a);
  // },
  // showB: function () {
  //   alert(this.b);
  // }
  showA() {
    alert(this.a);
  },
  showB() {
    alert(this.b);
  }
}
json.showA();
json.showB();

Promise

使用同步的方式组织异步的代码

let p = new Promise(function (resolve, reject) {
  $.ajax({
    url: 'arr.txt',
    dataType: 'json',
    success(resp) {
      resolve(resp)
    },
    error(err) {
      reject(err);
    }
  })
});

p.then(function (resp) {
  console.log(resp);
}, function (err) {
  console.log(err);
})

Promise.all:

Promise.all(
  [
    $.ajax({
      url: 'arr.txt',
      dataType: 'json',
    }),
    $.ajax({
      url: 'json.txt',
      dataType: 'json',
    })
  ]
).then(function (resp) {
  let [res1, res2] = resp;
  console.log(res1, res2);
  console.log("All success");
}, function (err) {
  console.log("At least one failed");
})

Promise.race 竞速:

Promise.race(
  [
    $.ajax({
      url: 'arr.txt',
      dataType: 'json',
    }),
    $.ajax({
      url: 'json.txt',
      dataType: 'json',
    })
  ]
).then(function (resp) {
  console.log(resp);
}, function (err) {
  console.log(err);
})

得到最先成功的promise执行then,失败的会被忽略。

generator

普通函数 一路到底
生成器函数 中间能停

关键字 yield

function* show(i) {
  console.log(i);
  let [t, p] = yield i;
  console.log(t, p);
  return 4;
}

let a = show(1);
console.log(a);
//第一个next无法传递参数,可以在创建生成器对象时传参
console.log(a.next()); //{value: 1, done: false}
console.log(a.next([2, 3])); //{value: 4, done: true}

每次执行到yield会放弃控制权,让外部函数执行,直到调用.next()方法。

promise 一次执行多个
generator 带逻辑的执行

ES7 预览

includes 数组是否包含某个值

let arr = [1,2,3];
alert(arr.includes(3)); //true
  • for ... in ... 对象 数组-索引 对象-键值
  • for ... of ... 迭代器 数组-值 对象-X

for/of

let arr = [1,2,3];
for(let i of arr){
  console.log(i);
}

keys/values/entries

  • keys:拿出所有的key值 []
  • values:拿出所有的value值 []
  • entries:拿出所有的key-value值 [{}, {}, {}]

求幂

console.log(2**3);

padStart/padEnd

let t = 'abc'.padStart(6);
console.log(`(${t})`); //(   abc)

let t = 'abc'.padEnd(6);
console.log(`(${t})`); //(abc   )

async

let readData=async ()=>{
  let data1=await $.ajax({url: 'data/1.txt', dataType: 'json'});
  let data2=await $.ajax({url: 'data/2.txt', dataType: 'json'});
  let data3=await $.ajax({url: 'data/3.txt', dataType: 'json'});

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

推荐阅读更多精彩内容

  • [TOC] 参考阮一峰的ECMAScript 6 入门参考深入浅出ES6 let和const let和const都...
    郭子web阅读 1,781评论 0 1
  • 第一章:块级作用域绑定 块级声明 1.var声明及变量提升机制:在函数作用域或者全局作用域中通过关键字var声明的...
    BeADre_wang阅读 841评论 0 0
  • let ES6新增的用于变量声明的关键字 通过let声明的变量,不允许重复声明 不支持变量声明预解析,let变量,...
    年过古稀的Coder阅读 296评论 0 1
  • 1、新的声明方式 以前我们在声明时只有一种方法,就是使用var来进行声明,ES6对声明的进行了扩展,现在可以有三种...
    令武阅读 1,009评论 0 7
  • 一、ES6简介 ​ 历时将近6年的时间来制定的新 ECMAScript 标准 ECMAScript 6(亦称 ...
    一岁一枯荣_阅读 6,082评论 8 25