ES6主要基础知识总结

一、变量和常量

var的缺点:(1)var可以多次声明同一个变量;   (2)var会造成变量提升 

  1. (function rr() {  
  2.   if(true) {  
  3.     var a = 666;  
  4.   }  
  5.   console.log(a); //输出666  
  6. })()  

let以及const都是块级作用域。我们常常使用let来声明一个值会被改变的变量,而使用const来声明一个值不会被改变的变量,也可以称之为常量。

常见面试题:

  1. for(var a = 0; a < 3; a++) {  
  2.   setTimeout(function() {  
  3.     console.log(a);  
  4.   }, 1000)  
  5. }  
  6. //输出结果都为3  

    如何将结果输出为0, 1, 2

    es5处理方法 -- 用函数制造块级作用域

  1. for(var a = 0; a 3; a++) {  
  2.   (function (a) {  
  3.     setTimeout(function() {  
  4.       console.log(a);  
  5.     }, 1000)  
  6.   })(a)  
  7. }  
  8. //输出结果0,1,2  

    es6处理方法 -- 更加简单明了

  1. for(let a = 0; a < 3; a++) {  
  2.   setTimeout(function() {  
  3.     console.log(a);  
  4.   }, 1000)  
  5. }  
  6. //输出结果为:0,1,2  

二、解构赋值(Destructuring)

1、对象的解构赋值

// 首先有这么一个对象
const props = {
    className: 'tiger-button',
    loading: false, clicked: true, disabled: 'disabled' }

当我们想要取得其中的2个值:loading与clicked时:

 

// es5
var loading = props.loading;
var clicked = props.clicked;

// es6
const { loading, clicked } = props; // 给一个默认值,当props对象中找不到loading时,loading就等于该默认值 const { loading = false, clicked } = props;
2、数组的解构赋值
// es6
const arr = [1, 2, 3]; const [a, b, c] = arr; // es5 var arr = [1, 2, 3]; var a = arr[0]; var b = arr[1]; var c = arr[2];

数组以序列号一一对应,这是一个有序的对应关系。
而对象根据属性名一一对应,这是一个无序的对应关系,属性名一致即可。根据这个特性,使用解析结构从对象中获取属性值更加具有可用性。

三、函数

1、箭头函数(array function)
// es5
var fn = function(a, b) {
return a + b; }
// es6 箭头函数写法,当函数直接被return时,可以省略函数体的括号
const fn = (a, b) => a + b;
// es5 var foo = function() {
  var a = 20;
  var b = 30;
  return a + b; }
// es6 const foo = () => {
  const a = 20;
  const b = 30;
  return a + b; }
箭头函数可以替换函数表达式,但是不能替换函数声明
箭头函数中,没有自己的this。如果你在箭头函数中使用了this,那么该this一定就是外层的this,是定义时所在的对象,而不是使用时所在的对象。也正是因为箭头函数中没有this,因此我们也就无从谈起用call/apply/bind来改变this指向。这个特性解决了函数中this指向的问题。
除此之外,箭头函数中无法访问 arguments对象
2、形参默认值(default)
ES5的默认值写法
  function sum(x,y){
         x=x||10;
         y=y||20;
  return x+y;
 }

ES6的默认值写法:

function sum(x = 10, y = 20) { return x + y; } console.log(add());

四、新增的数据类型

1、Set  (类似数组)

主要用来去除重复的数据,Set 本身是一个构造函数,用来生成 Set 数据结构。

let set = new Set(["name1","zhang","wang","name1","zhang"]);
console.log(set);  //"name1","zhang","wang"

console.log(set);  //3

四个方法:add(),delete(),has(),clear()

2、Map(映射,类似对象)

1.也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
const map1 = new Map()
const objkey = {p1: 'v1'}

map1.set(objkey, 'hello')
console.log(map1.get(objkey))

结果:

hello

2.Map可以接受数组作为参数,数组成员还是一个数组,其中有两个元素,一个表示键一个表示值。

const map2 = new Map([
  ['name', 'Aissen'],
  ['age', 12]
])
console.log(map2.get('name'))
console.log(map2.get('age'))

结果:

Aissen
12

如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,包括0和-0,布尔值true和字符串true则是两个不同的键。另外,undefined和null也是两个不同的键。虽然NaN不严格相等于自身,但 Map 将其视为同一个键。

3、symbol

五、内置对象扩展

1、class, extends, super

      这三个特性涉及了ES5中最令人头疼的的几个部分:原型、构造函数,继承

复制代码
class Animal {
    constructor(){
        this.type = 'animal'
    }
    says(say){
        console.log(this.type + ' says ' + say)
    }
}

let animal = new Animal()
animal.says('hello') //animal says hello

class Cat extends Animal {
    constructor(){
        super()
        this.type = 'cat'
    }
}

let cat = new Cat()
cat.says('hello') //cat says hello
复制代码

  上面代码首先用class定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象

  简单地说,constructor内定义的方法和属性是实例对象自己的,而constructor外定义的方法和属性则是所有实例对象可以共享的

  Class之间可以通过extends关键字实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。上面定义了一个Cat类,该类通过extends关键字,继承了Animal类的所有属性和方法。

  super关键字,它指代父类的实例(即父类的this对象)。子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。

  ES6的继承机制,实质是先创造父类的实例对象this(所以必须先调用super方法),然后再用子类的构造函数修改this。

  P.S 如果你写react的话,就会发现以上三个东西在最新版React中出现得很多。创建的每个component都是一个继承React.Component的类。

2、canvas

3、模板字符串(template string)

大家可以先看下面一段代码:

$("#result").append(
  "There are <b>" + basket.count + "</b> " +
  "items in your basket, " +
  "<em>" + basket.onSale +
  "</em> are on sale!"
);

  我们要用一堆的'+'号来连接文本与变量,而使用ES6的新特性模板字符串``后,我们可以直接这么来写:

$("#result").append(`
  There are <b>${basket.count}</b> items
   in your basket, <em>${basket.onSale}</em>
  are on sale!
`);

  用反引号(\来标识起始,用 ${}  来引用变量,而且所有的空格和缩进都会被保留在输出之中

4、数组扩展

链接:https://www.jianshu.com/p/cfb0893c34f1

猜你喜欢

转载自www.cnblogs.com/phoebeyue/p/9206625.html