博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS ES6
阅读量:6643 次
发布时间:2019-06-25

本文共 6470 字,大约阅读时间需要 21 分钟。

1. Let和Const

let和const定义的变量都是块级作用域,var定义的变量是函数级作用域

{  var a = 10}console.log(a) // 10{  let a = 10}console.log(a) // ReferenceError: a is not defined复制代码

3. 模板字符串

#不使用模板字符串var name = 'Your name is' + first + '' + last + '.'#使用模板字符串var name = `Your name is ${first} ${last}.`复制代码

4. 类

#构造函数class Animal {  // 构造函数,实例化的时候将会被调用,如果不指定,那么会有一个不带参数的默认构造函数  constructor(name, color) {    this.name = name    this.color = color  }  // toString 是原型对象上的属性  toString() {    console.log('name:' + this.name + ',color' + this.color)  }}var animal = new Animal('dog', 'white') // 实例化Animalanimal.toString()console.log(animal.hasOwnProperty('name')) // trueconsole.log(animal.hasOwnProperty('toString')) // falseconsole.log(animal.__proto__.hasOwnProperty('toString')) // true#继承class Cat extends Animal {  constructor(action) {    // 子类必须要在constructor 中指定super 函数,否则在新建实例的时候会报错    // 如果没有置顶constructor,默认带super函数的constructor将会被添加    super('cat','white')    this.action = action  }  toString() {    // 调用Animal 的toString() 方法    super.toString()  }}var cat = new Cat('catch')cat.toString()// 实例cat 是Cat 和Animal 的实例console.log(cat instanceof Cat) // trueconsole.log(cat instanceof Animal) // true复制代码

5. 模块化

#导出export var name = 'robot' // 导出一个变量export const sqrt = Math.sqrt // 导出常量var name = 'robot'var age = '24'export {name, age} // 导出多个变量export function myModule(someArg) {  return someArg} // 导出函数#导入import {myModule} from 'myModule.js'import {name, age} from 'test.js'复制代码

6. 函数参数默认值

function foo (height = 50, color = 'red') {  ...}复制代码

7. 解构赋值

# 获取数组中的值var foo = ['one', 'two', 'three', 'four']var [one, two, three] = foo // 从数组获取值并赋值到变量中,变量的顺序与数组中对象顺序对应console.log(two) // twoconsole.log(three) // threevar [first, , , last] = foo // 忽略某些值console.log(first) // oneconsole.log(last) // fourvar a, b[a, b] = [1, 2] // 先声明变量console.log(a) // 1console.log(b) // 2var a, b[a=5, b=7] = [1] // 如果没有从数组中获取到值,可以为变量设置一个默认值console.log(a) // 1console.log(b) // 7# 交换两个变量的值var a = 1var b = 3;[a, b] = [b, a]console.log(a) // 3console.log(b) // 1# 获取对象中的值const student = {    name: 'ming',    age: '18',    city: 'shanghai'}const {name, age, city} = studentconsole.log(name)console.log(age)console.log(city)复制代码

8. 延展操作符...

# 在函数调用时使用延展操作符function sum(x,y,z) {    return x+y+z}var numbers = [1,2,3]console.log(sum.apply(null,numbers)) //6 // 不使用延展操作符console.log(sum(...numbers)) //6 // 使用延展操作符# 构造数组const stuendts = ['Jine','Tom']const persons = ['Tony',... stuendts,'Aaron','Anna'] // 构造新数组conslog.log(persions)// ["Tony", "Jine", "Tom", "Aaron", "Anna"]var arr = [1, 2, 3];var arr2 = [...arr]; // 等同于 arr.slice() // 数组拷贝arr2.push(4); console.log(arr2)//[1, 2, 3, 4]var arr1 = [0, 1, 2];var arr2 = [3, 4, 5];var arr3 = [...arr1, ...arr2];// 将 arr2 中所有元素附加到 arr1 后面并返回 // 连接多个数组//等同于var arr4 = arr1.concat(arr2);# 构造对象时,进行克隆或者属性拷贝和合并(es8)var animal = {    name: 'dog',    color: 'white'}let dog = {...animal,age:'18'} // 克隆console.log(dog) // {name: "dog", color: "white"}var obj = {...animal, ...dog} // 合并复制代码

9. 对象属性简写

const name='Ming',age='18',city='Shanghai';const student = { // 不是es6    name:name,    age:age,    city:city}const student = {    name,    age,    city}console.log(student);//{name: "Ming", age: "18", city: "Shanghai"}复制代码

10. Promise

11. 迭代对象

可迭代对象有:

Array、string、Map、Set、arguments、NodeList

如何判断一个数据具有可迭代能力?

  • 只有当数据具有Symbol.iterator 属性的时候才可以使用for...of 进行迭代

  • typeof 判断数据类型,如果不可迭代的返回undefined

    Array.prototype.hasOwnProperty(Symbol.iterator) // true Set.prototype.hasOwnProperty(Symbol.iterator) // true

    typeof [][Symbol.iterator] // function typeof {}[Symbol.iterator] // undefined typeof new Set()[Symbol.iterator] // function typeof ''[Symbol.iterator] // function

认识迭代对象

Array.prototype[Symbol.iterator] // values() { [native code] } 函数Array.prototype[Symbol.iterator]() // Array Iterator {} 迭代器Array.prototype[Symbol.iterator]().next() // {value: undefined, done: true} 对象复制代码

手动模拟迭代器

const createIterator = items => {  const keys = Object.keys(items);  const len = keys.length;  let pointer = 0; // 当前的指针位置  return {    next() {      const done = pointer >= len;      const value = !done ? items[keys[pointer++]] : undefined; // 如果当前指针位置小于总长度      return {        value,        done      }    }  }}const iterator =  creatIterator([1,2,3,5])iterator.next() // {value: 1, done: false}iterator.next() // {value: 2, done: false}iterator.next() // {value: 3, done: false}复制代码

将不可迭代的数据转换可迭代数据

var obj = {name: '哈哈', gender: '男'}for(item on obj){} // Uncaught TypeError: obj1 is not iterable# 直接修改对象原型Object.prototype[Symbol.iterator] = function() {  const self = this  const keys = Object.keys(self)  const len = keys.length  let pointer = 0  return {    next() {      const done = pointer >= len      const value = !done ? self[keys[pointer++]] : undefined      return {        value, done      }    }  }}for (let item of obj) {    console.log(item) //哈哈 // 男}obj[Symbol.iterator]().next() // {done: false, value: "哈哈"}复制代码

12. generator(生成器)

12.1. 定义

# 创建function* fib(max) {    var        t,        a = 0,        b = 1,        n = 0;    while (n < max) {        yield a;        [a, b] = [b, a + b];        n++    }    return }# 第一种调用,遇到yield a 返回一个对象{value: a, done: true/false},然后暂停,done 表示这个generator 是否已经执行结束了,如果done 为true,则value 就是return 的返回值var f = fib(5)f.next() // {value: 0, done: false}f.next() // {value: 1, done: false}f.next() // {value: 1, done: false}f.next() // {value: 2, done: false}f.next() // {value: 3, done: false}f.next() // {value: undefined, done: true}# 第二种调用for (let item of fib(5)) {  console.log(item) // 0 1 1 2 3}复制代码

ES7

  1. includes()

Array.prototype.includes()

let arr = ['react', 'angular', 'vue']if (arr.includes('vue')) {  return true}复制代码
  1. 指数操作符**

    console.log(23) // 8 console.log(24) // 16


ES8

  1. async/await
  • async/await 是基于Promise 实现的,它不能用于普通的回调函数
  • async/await 与Promise 一样,是非阻塞的
  • async/await 使得异步代码看起来像同步代码
  1. Object.values()

    const obj = {a:1 , b:2, c:3}

    console.log(Object.values(obj)) // [1, 2, 3]

    #不用Object.values() console.log(Object.keys(obj).map(key=>obj[key]))

  2. Object.entries()

    #不用Object.entries() const obj = {a: 1, b: 2, c: 3} Object.keys(obj).forEach(key=>{ console.log('key:'+key+'value:'+obj[key]) //key:a value:1 //key:b value:2 //key:c value:3 })

    const obj = {a: 1, b: 2, c: 3} for (var [key,value] of Object.entries(obj)) { console.log(key:${key}--value:${value}) // key:a--value:1 // key:b--value:2 // key:c--value:3 }

  3. String padding

  4. 函数参数列表结尾允许逗号

    var f = function(a,c,){}

附上结构图

转载于:https://juejin.im/post/5ce3482ef265da1b7e100a4b

你可能感兴趣的文章
Centos挂载NTFS格式的移动硬盘
查看>>
sybase集群总结
查看>>
获取语句执行时间
查看>>
mysql字段类型、范围详解
查看>>
MySQL 高可用MMM
查看>>
在ubuntu16.4系统里默认网卡名称enp0s3,如何修改成eth0
查看>>
我的友情链接
查看>>
服务器系统安全防范之浅谈
查看>>
Cisco与Linux的NAT-Linux实现Cisco风格的NAT
查看>>
数组、LIst<> 、 ArrayList的性能对比
查看>>
数据库的超基本操作
查看>>
Spring注解标示
查看>>
软件工程网络15团队作业1——团队组队&展示
查看>>
echo xxx.xxx.rmvb |sed 's/.*\(\..*$\)/\1/' 可以获得文件的后缀
查看>>
Oracle中merge into的使用
查看>>
DNS相关概念和原理
查看>>
windows使用asmcmd报'perl.exe' 不是内部或外部命令
查看>>
符合规范的url
查看>>
工作组结构的网络
查看>>
Spring Cloud及微服务简介
查看>>