javascript基礎(chǔ)二

ES6

ES5中有兩種變量聲明方法:var、function
ES6中六種變量聲明方法:

  • var:
  • function:
  • let:
  • const:
  • import:
  • class:

let與const命令

let命令

定義變量:

ES5:ver,function

ES6:let,const

  • 基本語(yǔ)法:

    let 變量名 = 值;

  • 特性:
    1.let使用let聲明的變量只在代碼塊中有效

    {
      let a = 4;
      var a = 5;
    }
    console.log(a);//
    console.log(b);//
    

    2.let沒有變量提升:先聲明,再使用

    let a = 5;
    console.log(a)//正常輸出
    
    console.log(b);//報(bào)錯(cuò)
    let b = 5;
    

    3.let不能重復(fù)定義:let不允許在相同的作用域內(nèi)重復(fù)聲明一個(gè)變量

    let a = 5;
    let a = 5;
    console.log(a);//報(bào)錯(cuò)
    

    4.暫時(shí)性死區(qū)
    5.let定義的變量不會(huì)作為window的屬性

塊級(jí)作用域
  • 全局作用域
  • 局部作用域
  • 塊級(jí)作用域:
    {
    let a = 4;
    //console.log(a);// 4
    }
    console.log(a);//報(bào)錯(cuò),塊級(jí)作用域   
    
let與var的比較:
var a = [];
    for (var i = 0; i < 10; i++) {
      a[i] = function () {
      console.log(i);
      };
    }
    a[6](); // 輸出10
    // 變量i是var命令聲明的,在全局范圍內(nèi)都有效,所以全局只有一個(gè)變量i
    var c = [];
      for (let n = 0; n < 10; n++) {
        c[n] = function () {
        console.log(n);
        };
      }
    c[6](); // 6
    // 變量i是let聲明的,當(dāng)前的i只在本輪循環(huán)有效,所以每一次循環(huán)的i其實(shí)都是一個(gè)新的變量,所以最后輸出的是6


    // for循環(huán)還有一個(gè)特別之處,就是設(shè)置循環(huán)變量的那部分是一個(gè)父作用域,而循環(huán)體內(nèi)部是一個(gè)單獨(dú)的子作用域。
    for (let i = 0; i < 3; i++) {
    let i = 'abc';
    console.log(i);
    }//輸出三次abc
    //abc
    //abc
    //abc
const命令
  • 基本語(yǔ)法:
    const 變量名 = 值;
    -特性:
    1.只能聲明一個(gè)只讀的變量:是一個(gè)常量,一旦聲明就不能修改,常量一般首字母大寫
    // const聲明一個(gè)只讀的常量。一旦聲明,常量的值就不能改變。
        // const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以后賦值。
        // 對(duì)于const來(lái)說(shuō),只聲明不賦值,就會(huì)報(bào)錯(cuò)
        const a;//報(bào)錯(cuò)
        const PI = 3.1415;
        PI // 3.1415
        PI = 3;
        // 上面代碼表明改變常量的值會(huì)報(bào)錯(cuò)。
    
    1. 對(duì)于const來(lái)說(shuō),只聲明不賦值,就會(huì)報(bào)錯(cuò)
    const a;//報(bào)錯(cuò)
    
    3.const一旦聲明變量,就必須立即初始化,不能留到以后賦值。
    PI // 3.1415
        PI = 3;
        // 上面代碼表明改變常量的值會(huì)報(bào)錯(cuò)。
    
    4.其他與let一樣
    注意:const實(shí)際上保證的,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址所保存的數(shù)據(jù)不得改動(dòng)
    const foo = {};
      // 為 foo 添加一個(gè)屬性,可以成功
      foo.prop = 123;
      foo.prop // 123
      // 將 foo 指向另一個(gè)對(duì)象,就會(huì)報(bào)錯(cuò)
      foo = {}; // TypeError: "foo" is read-only
      // 上面代碼中,常量foo儲(chǔ)存的是一個(gè)地址,這個(gè)地址指向一個(gè)對(duì)象。
      // 不可變的只是這個(gè)地址,即不能把foo指向另一個(gè)地址,但對(duì)象本身是可變的,所以依然可以為其添加新屬性
    
      const a = [];
      a.push('Hello'); // 可執(zhí)行
      a.length = 0;    // 可執(zhí)行
      a = ['Dave'];    // 報(bào)錯(cuò)
      // 上面代碼中,常量a是一個(gè)數(shù)組,這個(gè)數(shù)組本身是可寫的,但是如果將另一個(gè)數(shù)組賦值給a,就會(huì)報(bào)錯(cuò)。
    

注意:使用let、const、class聲明的全局變量,不屬于頂層對(duì)象的屬性
頂層對(duì)象:瀏覽器中是window對(duì)象,在node中是global對(duì)象

結(jié)構(gòu)賦值

  • 這被稱為解構(gòu)(Destructuring)。
    ES6 允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱為解構(gòu)(Destructuring)。
數(shù)組的結(jié)構(gòu)
// 以前,為變量賦值,只能直接指定值。
  // let a = 1;
  // let b = 2;
  // let c = 3;
  
  // ES6 允許寫成下面這樣。
  let [a,b,c] = [1,2,3];
  console.log(a,b,c);
  • 本質(zhì)上,這種寫法屬于“模式匹配”,只要等號(hào)兩邊的模式相同,左邊的變量就會(huì)被賦予對(duì)應(yīng)的值。
    如果解構(gòu)不成功變量的值就等于undefined
let [foo, [[bar], baz]] = [1, [[2], 3]];
    foo // 1
    bar // 2
    baz // 3

    let [ , , third] = ["foo", "bar", "baz"];
    third // "baz"

    let [x, , y] = [1, 2, 3];
    x // 1
    y // 3

    let [head, ...tail] = [1, 2, 3, 4];
    head // 1
    tail // [2, 3, 4]

    let [x, y, ...z] = ['a'];
    x // "a"
    y // undefined
    z // []
  • 完全結(jié)構(gòu)
 let [a,b,c] = [1,2,3];
   console.log(a,b,c);
  • 不完全結(jié)構(gòu)
 let [a,b] = [1,2,3];
 console.log(a,b,c);//c=undefined
對(duì)象的結(jié)構(gòu)
  • 對(duì)象解構(gòu)的要求:變量名與對(duì)象的屬性名保持一致

    var obj={
      name:'dhx',
      age:21,
      addr:'井岡山'
    }
    let {a,b,c}=obj;
    console.log(a,b,c);//undefined
    
    //對(duì)象解構(gòu)的要求:變量名與對(duì)象的屬性名保持一致
    
    let {name,age,addr}=obj;//順序不需要一致,對(duì)象屬性沒有次序的
    console.log(name,age,addr);
    
    
    不完全解構(gòu)
    let data={
      id:12,
      imgSrc:'http://dfdsfsf.jps',
      title:'海賊王',
      URL:'http://dfdsfsf.html',
      time:'2019-9-20'
    };
    let {imgSrc,title}=data;
    consile.log(imgSrc,title);
    
字符串解構(gòu)
  • 模式:

    let str = 'hello';
    let [a,b,c,d,e]=str;//完全解構(gòu)
    console.log(a,b,c,d,e);
    //不完全解構(gòu)
    //h
    //e
    //l
    //l
    //o
    
  • 應(yīng)用:

    let a = 10;
    let b = 5;
    //不定義第三個(gè)變量,交換a,b的值
    //普通方法
    a=a+b;
    b=a-b;//10
    a=a-b;
    console.log(a,b);
    
    //使用解構(gòu)
    [b,a]=[a,b];
    console.log(a,b);
    
    function show(){
      //let arr=[100,200,300];
      //return arr;
    
      //return [100,200,300];
    
      return {
        name:'dhx',
        age:21,
        grade:'大四'
      };
    }
    
    //let a=show();
    
    //let [a,b,c]=show();
    //console.log(a,b,c);
    
    let {name,age}=show();
    console.log(name,age);
    
參數(shù)的解構(gòu)

箭頭函數(shù)

ES6 允許使用“箭頭”(=>)定義函數(shù)。

基本語(yǔ)法:
  var f = v => v;

  // 等同于
  var f = function (v) {
    return v;
  };
  • 無(wú)參數(shù)函數(shù)
      var f = () => {
        console.log('dinghuixiang');
      };
    
      // 等同于
      var f = function () {
        console.log('dinghuixiang');
      };
      f();
    
  • 有一個(gè)參數(shù)函數(shù)
      var f = v => {
        console.log('dinghuixiang');
      };
    
      // 等同于
      var f = function (v) {
        console.log('dinghuixiang');
      };
      f();
    
  • 有多個(gè)參數(shù)函數(shù)
      var f = (a,b) => {
        console.log('dinghuixiang');
      };
    
      // 等同于
      var f = function (a,b) {
        console.log('dinghuixiang');
      };
      f();
    
  • 函數(shù)內(nèi)只有一個(gè)返回語(yǔ)句
      var f = () => v;
    
      // 等同于
      var f = function () {
        return v;
      };
      f();
    
  • 函數(shù)內(nèi)只有多個(gè)語(yǔ)句
      var f = () =>{
        console.log('dinghuixiang');
        return v;
      } ;
    
      // 等同于
      var f = function () {
        console.log('dinghuixiang');
        return v;
      };
      f();
    
  • 函數(shù)內(nèi)只有一個(gè)語(yǔ)句,但不是返回語(yǔ)句,也可以(使用void關(guān)鍵字)
      var f = () =>void console.log('dinghuixiang');
    
      // 等同于
      var f = function () {
        console.log('dinghuixiang');
      };
      f();
    
  • 特殊情況:如果箭頭函數(shù)的代碼塊部分多于一條語(yǔ)句,就要使用大括號(hào)將它們括起來(lái),并且使用return語(yǔ)句返回。由于大括號(hào)被解釋為代碼塊, 所以如果箭頭函數(shù)直接返回一個(gè)對(duì)象,必須在對(duì)象外面加上括號(hào),否則會(huì)報(bào)錯(cuò)
    // 報(bào)錯(cuò)
    let getTempItem = id => { id: id, name: "Temp" };
    
    // 不報(bào)錯(cuò)
    let getTempItem = id => ({ id: id, name: "Temp" });
    
    • 下面是一種特殊情況,雖然可以運(yùn)行,但會(huì)得到錯(cuò)誤的結(jié)果。
    let foo = () => { a: 1 };
    foo() // undefined
    
    上面代碼中,原始意圖是返回一個(gè)對(duì)象{ a: 1 },但是由于引擎認(rèn)為大括號(hào)是代碼塊,所以執(zhí)行了一行語(yǔ)句a: 1。這時(shí),a可以被解釋為語(yǔ)句的標(biāo)簽,因此實(shí)際執(zhí)行的語(yǔ)句是1;,然后函數(shù)就結(jié)束了,沒有返回值
箭頭函數(shù):省略function,總結(jié)
  • 參數(shù)個(gè)數(shù):

    • 一個(gè)參數(shù):可以省略()
    • 多個(gè)參數(shù):不能省略()
  • 函數(shù)體語(yǔ)句:

    • 一條語(yǔ)句:

      • return語(yǔ)句:省略大括號(hào){}與return
      • 普通語(yǔ)句:可以只用void指令省略
    • 多條語(yǔ)句:不能省略

注意事項(xiàng)

箭頭函數(shù)有幾個(gè)使用注意點(diǎn)。

(1)函數(shù)體內(nèi)的this對(duì)象,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象。

(2)不可以當(dāng)作構(gòu)造函數(shù),也就是說(shuō),不可以使用new命令,否則會(huì)拋出一個(gè)錯(cuò)誤。

(3)不可以使用arguments對(duì)象,該對(duì)象在函數(shù)體內(nèi)不存在。如果要用,可以用 rest 參數(shù)代替。

(4)不可以使用yield命令,因此箭頭函數(shù)不能用作 Generator 函數(shù)。

上面四點(diǎn)中,第一點(diǎn)尤其值得注意。this對(duì)象的指向是可變的,但是在箭頭函數(shù)中,它是固定的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容