ES6 快速开始

 Refs 

现代框架 Vue React 都使用到了 ES6 (包括D3js)

【常量】

// ES5 中常量的写法

Object.defineProperty(window, "PI2", {
    value: 3.1415926,
    writable: false,
})

// ES6 的常量写法

const PI = 3.1415926

【作用域】

// ES5 中作用域
const callbacks = []
for (var i = 0; i <= 2; i++) {
// 闭包总是获取最后一次的值 callbacks[i]
= function() { return i * 2 } } console.table([ callbacks[0](), callbacks[1](), callbacks[2](), ]) // ES6 let 命令 const callbacks2 = [] for (let j = 0; j <= 2; j++) { callbacks2[j] = function() { return j * 2 } } console.table([ callbacks2[0](), callbacks2[1](), callbacks2[2](), ])
// ES5 指甲汤 ;((function() {
const foo = function() { return 1 } console.log("foo()===1", foo() === 1) ;((function() { const foo = function() { return 2 } console.log("foo()===2", foo() === 2) })()) })()) { function foo() { return 1 } console.log("foo()===1", foo() === 1) { function foo() { return 2 } console.log("foo()===2", foo() === 2) } console.log("foo()===1", foo() === 1) }

【箭头函数 和 function】区别于 context ,(function 类似于 method 所以 this 到运行时指定的。)(箭头函数是定义时(类似编译期)指定的 真的是函数)

{
  // ES3,ES5
  var evens = [1, 2, 3, 4, 5];
  var odds = evens.map(function(v) {
    return v + 1
  });
  console.log(evens, odds);
};

{
  // ES6
  let evens = [1, 2, 3, 4, 5];
  let odds = evens.map(v => v + 1);
  console.log(evens, odds);
} 

{
  // ES3,ES5
  var factory = function() {
    this.a = 'a';
    this.b = 'b';
    this.c = {
      a: 'a+',
      b: function() {
        return this.a
      }
    }
  }
  console.log(new factory().c.b());
};

{
    
  var factory = function() {
    this.a = 'a';
    this.b = 'b';
    this.c = {
      a: 'a+',
      b: () => {
        return this.a
      }
    }
  }
  console.log(new factory().c.b());
}

【默认参数】妙用在 必选参数 的实现

{
// ES5 ES3 默认参数的写法
  function f(x, y, z) {
    if (y === undefined) {
      y = 7;
    }
    if (z === undefined) {
      z = 42
    }
    return x + y + z
  }
  console.log(f(1, 3));
} 

{
  // ES6 默认参数
  function f(x, y = 7, z = 42) {
    return x + y + z
  }
  console.log(f(1, 3));
} 

// 默认参数 实现 required 参数
{
  function checkParameter() {
    throw new Error('can\'t be empty')
  }
  function f(x = checkParameter(), y = 7, z = 42) {
    return x + y + z
  }
  console.log(f(1));
  try {
    f()
  } catch (e) {
    console.log(e);
  } finally {}
} 

 

 【可变参数】ES6 扩展了运算符 ...args ,不仅用在 形参 还可用在拼接数组。

{
  // ES3,ES5 可变参数
  function f() {
    var a = Array.prototype.slice.call(arguments);
    var sum = 0;
    a.forEach(function(item) {
      sum += item * 1;
    })
    return sum
  }
  console.log(f(1, 2, 3, 6));
} 

{
  // ES6 可变参数
  function f(...a) {
    var sum = 0;
    a.forEach(item => {
      sum += item * 1
    });
    return sum
  }
  console.log(f(1, 2, 3, 6));
} 

{
  // ES5 合并数组
  var params = ['hello', true, 7];
  var other = [1, 2].concat(params);
  console.log(other);
}

{
  // ES6 利用扩展运算符合并数组
  var params = ['hello', true, 7];
  var other = [
    1, 2, ...params
  ];
  console.log(other);
}

 

………………………………………………………………………………………………………………………………

【对象代理】ES6 提供一个代理层 实现对数据的保护

 

/* eslint-disable */
{
  // ES3,ES5 数据保护
  var Person = function() {
    var data = {
      name: 'es3',
      sex: 'male',
      age: 15
    }
    this.get = function(key) {
      return data[key]
    }
    this.set = function(key, value) {
      if (key !== 'sex') {
        data[key] = value
      }
    }
  }

  // 声明一个实例
  var person = new Person();
  // 读取
  console.table({name: person.get('name'), sex: person.get('sex'), age: person.get('age')});
  // 修改
  person.set('name', 'es3-cname');
  console.table({name: person.get('name'), sex: person.get('sex'), age: person.get('age')});
  person.set('sex', 'female');
  console.table({name: person.get('name'), sex: person.get('sex'), age: person.get('age')});
}

{
  // ES5
  var Person = {
    name: 'es5',
    age: 15
  };

  Object.defineProperty(Person, 'sex', {
    writable: false,
    value: 'male'
  });

  console.table({name: Person.name, age: Person.age, sex: Person.sex});
  Person.name = 'es5-cname';
  console.table({name: Person.name, age: Person.age, sex: Person.sex});
  try {
    Person.sex = 'female';
    console.table({name: Person.name, age: Person.age, sex: Person.sex});
  } catch (e) {
    console.log(e);
  }
}


 {
  // ES6
  let Person = {
    name: 'es6',
    sex: 'male',
    age: 15
  };

  let person = new Proxy(Person, {
    get(target, key) {
      return target[key]
    },
    set(target,key,value){
      if(key!=='sex'){
        target[key]=value;
      }
    }
  });

  console.table({
    name:person.name,
    sex:person.sex,
    age:person.age
  });

  try {
    person.sex='female';
  } catch (e) {
    console.log(e);
  } finally {

  }

}

 

 

 

…………………………………………………………………………………………………………………………

posted @ 2018-05-15 11:46  chenhui7373  阅读(152)  评论(0编辑  收藏  举报