ES6新增語法和內置對象(let,const, Array/String/Set 擴展方法(解構賦值,箭頭函數,剩余參數))


1、let

 ES6中新增的用於聲明變量的關鍵字。

 let 聲明的變量只在所處於的塊級有效。

 注意:使用 let 關鍵字聲明的變量才具有塊級作用域,var 關鍵字是不具備這個特點的。

 1. 防止循環變量變成全局變量。

 2. 不存在變量提升

 3. 暫時性死區

    if(true){
        let  a=10;
    }
    console.log(a);   //  a is not defined
  //防止循環變量變成全局變量
  for(var i=0;i<2;i++){
  }
  console.log(i); // i=2(只有i=2時,不滿足for循環條件,即執行下面語句),如果 for循環中使用 let 那么輸入i就會報錯: i is not defined
  //let不存在變量提升
  console.log(a); //a is not defined
  let a = 10;
  //暫時性死區
  var num = 10;
  if(true){
    console.log(num);
    let num = 20; //只要在塊級區域聲明了變量let,那么這個塊級區域就被let所綁定,所以在塊級里面使用的 num 跟外面定義的全局變量 num 沒有關系
  }

2、const

 作用:聲明常量,常量就是值(內存地址)不能變化的量

 1.const關鍵字

  1.具有塊級作用域

  2. 聲明常量必須賦初始值

  3. 變量賦值后,值不能修改(兩種情況)

   1. 基本數據類型:一旦賦值,值就不能修改(比如:數值,字符串)

   2. 復雜數據類型:不能賦值,但是可以修改 數據結構內部的值(比如:數組,對象)

   const PI = 3.14;
  // PI = 100;會報錯(聲明常量時丟失了初始值)
  const arr =[100,200];
  arr[0]=123; //可以修改數組內元素的值,如果重新賦值是不允許的
  arr=[1,2]; //會報錯 因為 arr 重新賦值,改變了內存地址

3、let、const、var的區別

 1. 使用 var 聲明的變量,其作用域為該語句所在的函數內,且存在變量提升現象。

 2. 使用 let 聲明的變量,其作用域為該語句所在的代碼塊內,不存在變量提升。

 3. 使用 const 聲明的常量,在后面出現的代碼中不能再修改該常量的值。

 如果聲明的值不需要變化,就用const,這樣JavaScript 解析引擎不用時時監控值的變化,所以效率比 let 高。

  

 4、解構賦值(方便從數組和對象中提取值)

 解構:分解數據結構;賦值:指的是為變量賦值。

 ES6中允許從數組中提取值,按照對應位置,對變量賦值。對象也可以實現解構。

 如果變量沒有對應的值,那么變量的值則是 undefined

 1. 數組解構:

  數組解構允許我們按照一一對應的關系從數組中提取值,然后將值賦值給變量。

  let[a,b,c]=[1,2,3];
  console.log(a); // 1
  console.log(b); // 2
  console.log(c); // 3

 2. 對象解構:

  實際上是屬性匹配,對象解構允許我們使用變量的名字匹配對象的屬性,匹配成功將對象屬性的值賦值給變量。

  寫法一:(變量和對象中的屬性名一致)

  let {name,age,sex} = {name:"andy",age:18,sex:"女"};
  console.log(name);  // 'andy'
  console.log(age);  //18

  寫法二:(變量名字和對象中屬性名字不一致)

  let{name:myName,age:myAge}={name:"andy",age:18};  //myName,myAge 屬於別名
  console.log(myName); // 'andy'
  console.log(myAge);  //18

5、箭頭函數

 ES6中新定義函數的方式

 1. 語法:

  () => { }

   ():放置形參

   { }:函數體

  const fn = () => { }   // 通常把函數賦值給一個變量(常量),使用時,直接調用變量(常量)名

 2. 箭頭函數中,如果函數體中只有一句代碼,並且代碼的執行結果就是函數的返回值,函數體大括號可以省略,return也可以省略。

  const sum = (n1,n2) => n1+n2; 
  console.log(sum(1,2));  // 3

 3. 形參只有一個,可以省略小括號

  function  fn( num ){
    return num;
  }
  const  fn = num => num;

 4. 箭頭函數不綁定 this ,箭頭函數沒有自己的 this 關鍵字,

  如果在箭頭函數中使用 this,this關鍵字將指向箭頭函數定義作用域中的 this。

  function fn(){
    console.log(this); //this指的是obj
    return () =>{
      console.log(this); // 因為箭頭函數不綁定this,箭頭函數中的this指向函數定義位置中的this,所以this指向obj
    }
  }
  const obj ={name:'andy'};
  const resFn = fn.call(obj); // 使用call方法,把fn的this指向obj對象
  resFn(); //調用的是fn中的匿名函數

箭頭函數面試題

var age = 100;
var obj = {
 age:20,
 say:() => {
   alert(this.age); //100;
 }
}
obj.say();
關鍵點:obj是對象,沒有作用域,say方法實際被定義在全局作用域下,say方法中的this指向是window,所以彈出就是window下面的age

6、剩余參數

  1. 剩余參數語法允許我們將一個不定數量的參數表示為一個數組

  function sum(first,...args){
    console.log(first);  // 10
    console.log(args);  // [20,30]
  }
  sum(10,20,30);

 2. 剩余參數和解構函數配合使用

  let  [s1,...s2] = ['lisi','wangwu','zhangsan'];
  console.log(s1);  //' lisi '
  console.log(s2);  //['wangwu','zhangsan']

7、ES6的內置對象擴展

 7.1. Array 的擴展方法

  擴展運算符(展開語法) :可以將數組或者對象轉為用逗號分隔的參數序列。(和剩余參數用法相反)

   let  ary = [1,2,3];
  ...ary  // 1,2,3
  console.log(...ary);  //1  2  3      打印時,會把 1,2,3 以 逗號(,)作為分隔符輸出,所以輸出時是沒有逗號的。

  2. 擴展運算符可以應用於合並數組

  方法一

  let  ary1 = [1,2,3];
  let   ary2 = [4,5,6];
  let   ary3 = [...ary1,...ary2];

  方法二

  ary1.push(...ary2);

 3. 將類(偽)數組或可遍歷對象轉換為真正的數組(方便調用數組中的方法)。

  方式一

  let  oDivs = document.getElementsByTagName('div');  // 獲取 div 元素集合
  oDivs = [...oDivs];  // 轉換為數組序列,在數組序列外用 [ ] 包裹起來,就轉換為真正的數組了

  方式二

  構造函數方法:Array.from( )

  將類(偽)數組或可遍歷對象轉換為真正的數組

  let  arrayLike = {
   '0':'a',
   '1':'b',
   '2':'c'
  };
  let  arr2 = Array.form(arrayLike);  //['a','b','c']

  2. 方法還可以接受第二個參數,作用類似於數組的map方法,用來對每個元素進行處理,將處理后的值放入返回的數組。

  let  arrayLike = {
    '0':1,
    '1':2
  }
  let  newAry = Array.from(arrLike,function(item){
    return   item * 2;
  });
  console.log(newAry); // 2,4

 4. 實例方法:find()

  用來找出第一個符合條件的數組成員,如果沒有找到返回 undefined

var arr=[{
  id:1,
  name:'張三'
},{
  id:2,
  name:'李四'
}];
let target = arr.find(item => item.id==2);
console.log(target);

 5. 實例方法:findIndex()

 用於找出第一個符合條件的數組成員的位置,如果沒有找到返回 -1

let arg = [1,5,3,10,4,7];
let index = arg.findIndex(value => value>6);
console.log(index); // 3

 6. 實例方法:includes()

 表示某個數組是否包含給定的值,返回布爾值。

var arr = [1,2,3];
arr.includes(2);//true
arr.includes(0);//false

 7.2. String 的擴展方法

 模板字符串(`)(tab鍵上面的按鍵)

 ES6新增的創建字符串的方式,使用反引號定義。

 語法:

let  name = `zhangsan`;

 2. 可以解析變量

let name ="zhangsan";
let sayHello =`hello,my name is ${name}`; //hello,my name is zhangsan

 3. 可以換行

let result ={
  name:'張三',
  age:18,
  sex:'男'
}
let html=`
<div>
  <span>${result.name}</span>
  <span>${result.age}</span>
  <span>${result.sex}</sapn>
</div>
`;

 4. 可以調用函數

const fn =function(){
  return '函數';
}
let greet = `模板 ${fn()}`; //在調用函數的位置會顯示函數的返回值
console.log(greet); //模板 函數

 5. 實例方法: startsWith() 和 endsWith()

  startsWith():表示參數字符串是否在原字符串的頭部,返回布爾值

  endsWith():表示參數字符串是否在原字符串的尾部,返回布爾值

let str = 'Hello world';
str.startsWith('hello'); //false
str.endsWith('world'); //true

 6. 實例方法:repeat()

 repeat 方法表示將原字符串重復 n 次,返回一個新字符串

'x'.repeat(3);  // xxx
'hello'.repeat(2); //hellohello

 7.3 Set 數據結構

 ES6 提供了新的數據結構 set,類似於數組,但是成員的值都是唯一的,沒有重復的值。

 Set 本身就是一個構造函數,用來生成Set數據結構。

 語法:

const  set = new Set();

 2. Set 函數可以接受一個數組作為參數,用來初始化。

 size:實例對象中的屬性,表示在當前數據結構中有多少值

const  set = new Set([1,2,3,4,5]);
console.log(set.size); //5

 3.利用 Set 數據結構做數組去重

const s1 = new Set([1,2,3,2,4,3,1,4]);  //set 會把數據重復的自動去除
console.log(s1.size); //4
// ...s1 1,2,3,4
const newS1=[...s1]; //[1,2,3,4]

 4. 實例方法

  add(value):添加某個值,返回 Set 結構本身

  delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功

  has(value):返回一個布爾值,表示改制是否為Set的成員

  clear():清除所有成員,沒有返回值

const  s =new Set();
s.add(1).add(2).add(3); //向 set 結構中添加值
s.delete(2); // 刪除 set 結構中的 2 值
s.has(1); // 表示 set 結構中是否有 1 這個值,返回布爾值
s.clear(); //清除 set 結構中的所有值

 5. 遍歷

 Set 結構的實例與數組一樣,也擁有forEach方法,用於對每個成員執行某種操作,沒有返回值。

 語法:

s.forEach(val=>console.log(val));

 遍歷set數據結構,從中取值

const s1 = new Set(['1','a','e','3']);
s1.forEach(val=>console.log(val)); //1 a e 3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM