es6,es7的一些語法(筆記)

GoodLiang發表於2018-03-15

const

const a=3; //定義常量
// 如果要用es 5的方式怎麼寫呢??
Object.defineProperty(window, "a", {
  value: 37,
  writable: false,
});
console.log(window.a)
複製程式碼

作用域

es6的作用域

for (let i = 0; i < 10; i++) {
  // ...
}

console.log(i);
// ReferenceError: i is not defined
複製程式碼

在es5中,並沒有塊級作用域,先用es5寫一個作用域看看

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10
a[5](); // 10
a[4](); // 10
a[3](); // 10
a[2](); // 10
a[1](); // 10
複製程式碼

上面程式碼中,變數i是var命令宣告的,在全域性範圍內都有效,所以全域性只有一個變數i。每一次迴圈,變數i的值都會發生改變,而迴圈內被賦給陣列a的函式內部的console.log(i),裡面的i指向的就是全域性的i。也就是說,所有陣列a的成員裡面的i,指向的都是同一個i,導致執行時輸出的是最後一輪的i的值,也就是 10。

ES6 定義屬性

es5怎麼寫呢

var x = 1, y = 2;
var object = {
&emsp;&emsp;x: x,
&emsp;&emsp;y: y
};
console.log(object.x); //output "1"
複製程式碼

在es6中

//給一個屬性賦一個變數值,如果變數名和屬性名相同,ES6 提供了一個簡潔的語法,可以省略變數名

let x = 1, y = 2;
let object = { 
&emsp;&emsp;x, 
&emsp;&emsp;y 
};
console.log(object.x); //output "1"
複製程式碼

箭頭函式

// es5中的this
var A = function () {
    this.a = 'a';
    this.b = 'b';
    this.c = {
        a: 'a++',
        b: function () {
            console.log(this.a);
        }
    }
}

console.log(new A().c.b()) // a++ 因為es5中的this即誰呼叫它,this就指向誰
//es6
var A = function () {
    this.a = 'a';
    this.b = 'b';
    this.c = {
        a: 'a++',
        b:  ()=>{
            console.log(this.a);
        }
    }
}

console.log(new A().c.b()) // a,箭頭函式this的指向是定義時this的指向,b函式在定義的時候this就指向函式體裡面的this
複製程式碼
//帶有預設引數的箭頭函式
let hello =(name='world')=>{
  console.log(`hello ${name}`) //注意這邊不是單引號
}
hello() //hello world
hello('skl')//hello skl
複製程式碼
//多個引數
let cal1 =(num1,num2)=>num1*num2
let arr=[6,7]
console.log(cal1(...arr))//展開
複製程式碼
function hello(name1,name2){
  console.log(name1,name2)
}
let arr =['skl1','skl2'];
//es5
//hello.apply(null,arr)
//es6
hello(...arr)

複製程式碼

預設引數

// es5
function a(x,y ) {
    x=x||1;
    y=y||2;
}
// es6
function b(x=1,y=2){
    return x+y;
}
複製程式碼

可變引數

{   //es5
    function f() {
        var a = Array.prototype.slice.call(arguments);
        var sum = 0;
        a.forEach(function (item) {
            sum += item;
        })
        return sum;
    }
    console.log(f(1, 2, 3, 4)) 
}
{
    //es5
    function f(...a) {
        var sum = 0;
        a.forEach(function (item) {
            sum += item;
        })
        return sum;
    }
    console.log(f(1, 2, 3, 4)) 
}
// 擴充套件運算子的使用
// 合併陣列 es5
{
    var a=[1,2,4];
    var b=[11,111,111];
    var c=b.concat(a);
    console.log(c)
}
// 合併陣列 es6運用擴充套件運算子
{
    var a=[1,2,4];
    var b=[11,111,111];
    var c=[...a,...b];
    console.log(c)
}
複製程式碼

物件擴充套件

var obj={
  name:'skl',
  age:18,
}
console.log(Object.keys(obj))//["name","age"]
console.log(Object.values(obj))//["skl",18]
console.log(Object.entries(obj))// key 和value變成一個陣列
複製程式碼
const name = 'skl'
const age='nian';
const height='shengao'
const obj = {
  [age]:18,
  height
}
obj[name] = 'hello skl';
console.log(obj)//{nian: 18, height: "shengao", skl: "hello skl"}
複製程式碼
const obj1={name:'skl',age:18}
const obj2={type:'ha',aa:90}
console.log({...obj1,...obj2})//{name: "skl", age: 18, type: "ha", aa: 90}

複製程式碼
//結構賦值
const arr =['skl','sk2'];
let [arg1,arg2]=arr;
console.log(arg1,arg2)//skl sk2

const obj={nian: 18, height: "shengao", skl: "hello skl"}
const {nian,height}=obj;
console.log(nian,height)//18 shengao
複製程式碼

代理做資料保護

es5中的資料保護

{
  // 資料保護(相當於私有變數)es5的寫法,定義一個建構函式
  var Person = function () {
    var data = {
      name: 'es5',
      sex: 'male',
      age: 20
    }
    // getter 和setter
    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'),
    aeg: person.get('ageqe3w')
  })
  // 修改
  person.set('name', '啦啦啦');// 這時候console的結果就會變了
  person.set('sex', 'male')// console出來發現沒有用因為資料被保護了
}
{
  // 另一種寫法
  var Person = {
    name: 'skl',
    age: 10,
  }
  // sex只可讀不可寫
  Object.defineProperties(Person, 'sex', {
    writeable: false,
    value: 'male',
  })
  console.table({
    name: Person.name,
    age: Person.age,
    sex: Person.sex,
  })
  // 若強行給只讀屬性複製會報錯
}
複製程式碼

es6中通過代理的方式做資料保護

{
  // es的代理 
  let Person = {
    name: '11',
    age: 11,
    sex: 'male'
  }
  //person是暴露給使用者的,吧上面的Person保護起來
  let person = new Proxy(Person, {
    get(target, key) {
      return target[key]
    },
    set(target, key, value) {
      if (key !== 'sex') {
        target[key] = value;
      }
    }
  })
}
複製程式碼

字串拼接

在es5中,憑藉字串要不斷的+,尤其是在html模板的時候,變得特別不方便

const a=3;
console.log(`skl${a}`)//skl3
`Hello ${'World'}`
// "Hello World"
複製程式碼

for... of...

var arr = ["a", "b", "c"];
var iterator = arr.entries();
console.log(iterator) //Array Iterator {}

for (let e of iterator) {  //返回有下標的陣列
    console.log(e) 
    //[0, "a"]
    //[1, "b"]
    //[2, "c"]
}
複製程式碼
var arr = ["a", "b", "c"];
var iterator = arr;

for (let e of iterator) {
    console.log(e);
    //a b c
}
複製程式碼
var arr = ["a", "b", "c"];
var iterator = arr.entries();

for (let [index,e] of iterator) {
    console.log(index,e);
    // 0 "a"
    // 1 "b"
    // 2 "c"
}
複製程式碼
var arr = ["a", "b", "c"];
var iterator = arr.entries();

for (let [index,e] of iterator) {
    console.log(e);
}
// a 
// b
// c
複製程式碼

promise

let state = 1;
function step1(resolve, reject) {
  console.log('1.開始-做飯');
  if (state == 1) {
    resolve('做飯--完成');
  } else {
    reject('做飯--出錯');
  }
}

function step2(resolve, reject) {
  console.log('2.開始-吃飯');
  if (state == 1) {
    resolve('吃飯--完成');
  } else {
    reject('吃飯--出錯');
  }
}

function step3(resolve, reject) {
  console.log('3.開始-收拾');
  if (state == 1) {
    resolve('收拾--完成');
  } else {
    reject('收拾--出錯');
  }
}

new Promise(step1)
  .then(function (val) {
    console.log(val)
    return new Promise(step2)
  })
  .then(function (val) {
    console.log(val)
    return new Promise(step3)
  }).then(function (val) {
    console.log(val)
  })
複製程式碼

async

async function testAsync(){
  return 'hello async'
}
const result =testAsync();
console.log(result); // 返回的是一個promise
複製程式碼

function getSomething(){
  return 'something'
}
async function testAsync(){
  return 'hello async'
}

async function test(){
  const v1 = await getSomething();
  const v2 = await testAsync();
  console.log(v1,v2)

}
test()

複製程式碼

模擬非同步請求

function takeLongTime(){
  return new Promise(resolve=>{
    setTimeout(()=>{
      resolve("long_time_value")
    },1000)
  })
}

async function test(){
  const v = await takeLongTime()
  console.log(v)
}
test()
複製程式碼

相關文章