有關Es6知識的小結

耀九天發表於2018-08-11

一 Let與const命令

Let是用來宣告變數的,類似於var,但是所宣告的變數,只有在let命令所在的程式碼塊內有效

{
  let a = 10;
  var b = 1;
  }
  console.log(a)
  console.log(b)

a is not defined;後面的程式碼不在執行了
複製程式碼

在上面的程式碼中,使用了var與let宣告變數 得到的結果是let宣告的變數報錯了,var宣告的變數是正確的,這表明,let宣告的變數只在特所在的程式碼塊有效,

Let不存在變數的提升

// var 的情況
console.log(a);
var a=2
console.log(a); // 輸出undefined  2
// let 的情況
console.log(b);
let b =5 // 報錯b is not defined;

let b =5;
console.log(b)//5
複製程式碼

使用var宣告的變數,會發生變數的提升,得到 var a;因此得到了undefined,但是let宣告的b沒有進行變數提升,因此在輸出是是不存在的,要使用會報錯 b is not defined。

Let不允許重複宣告

在同一個塊級作用域,let不會重複宣告同一個變數

 {
  let a = 10;
  var a = 1;}  //報錯 Identifier 'a' has already been declared
 {
  let a = 10;
  let a = 1;}  //報錯 Identifier 'a' has already been declared
複製程式碼

Const:const盛名一個只讀的常量,一旦宣告後,就不能夠更改了。

const PI = 3.1415;
PI // 3.1415
PI = 3; //Assignment to constant variable.不能改變常量的值
複製程式碼

這行程式碼表明改變常量得值就會報錯。Const宣告的變數不會改變,const一旦宣告變數,就必須初始化,不能以後進行賦值。

Const message;

const宣告的變數,與let一樣不可重複宣告。

const message = "Goodbye!";
const message = 30;
//報錯Identifier 'message' has already been declared
複製程式碼

二 陣列

陣列的結構賦值

從陣列和物件中提取值,對變數進行賦值,這稱為解構,

ES6之前為變數賦值;

let a = 1;
let b = 2;
let c = 3;
複製程式碼

在es6中,可以寫成這樣

let [a, b, c] = [1, 2, 3];
複製程式碼

可以從陣列中提取值,按照對應位置,為變數賦值

let [a,[[b], c]] = [1, [[2], 3]];
//a  1   //b 2//   c// 3
let [ , , third] = ["a", "b", "c"];
//third  "c"
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 []
複製程式碼

如果不成功,變數的值就是undefined

擴充套件運算子

擴充套件運算子,擴充套件運算子是三個點(。。。),將一個陣列轉為用逗號分割的引數序列

console.log(...[1, 2, 3])
// 1 2 3
console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]
複製程式碼

擴充套件運算子的應用

1.複製陣列

陣列是符合的資料型別,直接複製的話,只是複製了在堆區中陣列的記憶體地址,而不是克隆了一個新的陣列

const a1 = [1, 2];
const a2 = a1;

a2[0] = 2;
a1 // [2, 2]
複製程式碼

a2並不是a1的克隆,而是指向同一份資料的另一個指標。修改a2,會直接導致a1的變化。

在es6中這樣複製陣列

const a1 = [1, 2];
const a2 = [...a1];
複製程式碼

2.合併陣列

擴充套件運算子提供了陣列合並的新寫法

const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];
 ES5 的合併陣列arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]
ES6 的合併陣列[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
複製程式碼

不過,這兩種方法都是淺拷貝,使用時需注意。

3.字串

擴充套件運算子可以將字串轉為真正地陣列

[...'hello']
// [ "h", "e", "l", "l", "o" ]
複製程式碼

三 陣列的補充

1.Array.from()

Array.from方法用於將兩類物件轉為真正的陣列,一類是為陣列,即類似陣列的物件和可以遍歷的物件

let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3};
 ES5的寫法var arr1 = [].slice.call(arrayLike); 
 // ['a', 'b', 'c']
 ES6的寫法let arr2 = Array.from(arrayLike); 
 // ['a', 'b', 'c']
複製程式碼

如果引數是一個真正的陣列,Array.from會返回一個一模一樣的新陣列

Array.from([1, 2, 3])
// [1, 2, 3]
Array.of()
Array.of方法用於將一組數,轉換為陣列
Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
複製程式碼

2.Array.of()

基本上可以用來替代Array()或new Array(),並且不存在由於引數不同而導致的過載。它的行為非常統一。

Array.of() // []
Array.of(undefined) // [undefined]
Array.of(1) // [1]
Array.of(1, 2) // [1, 2]
複製程式碼

Array.of總是返回引數值組成的陣列。如果沒有引數,就返回一個空陣列。

3.陣列例項的find()和findIndex()

陣列例項的find方法,用於找出第一個符合條件的陣列成員。

它的引數是一個回撥函式,所有陣列成員依次執行該回撥函式,直到找出第一個返回值為true的成員,然後返回該成員。如果沒有符合條件的成員,則返回undefined。

[1, 4, -5, 10].find((n) => n < 0)
// -5
複製程式碼

找出第一個小於0的成員

[1, 5, 10, 15].find(function(value, index, arr) {
  return value > 9;}) // 10
複製程式碼

上面程式碼中,find方法的回撥函式可以接受三個引數,依次為當前的值、當前的位置和原陣列。 陣列例項的findIndex方法的用法與find方法非常類似,返回第一個符合條件的陣列成員的位置,如果所有成員都不符合條件,則返回-1。

[1, 5, 10, 15].findIndex(function(value, index, arr) {
  return value > 9;}) // 2
複製程式碼

4.陣列例項的fill()

fill方法使用給定值,填充一個陣列

['a', 'b', 'c'].fill(7)
// [7, 7, 7]
new Array(3).fill(7)
// [7, 7, 7]
複製程式碼

上面程式碼表明,fill方法用於空陣列的初始化非常方便。陣列中已有的元素,會被全部抹去。 fill方法還可以接受第二個和第三個引數,用於指定填充的起始位置和結束位置

['a', 'b', 'c'].fill(7, 1, 2)
// ['a', 7, 'c']
複製程式碼

上面程式碼表示,fill方法從 1 號位開始,向原陣列填充 7,到 2 號位之前結束。

5.陣列例項的entries(),keys()和values()

ES6 提供三個新的方法——entries(),keys()和values()——用於遍歷陣列。它們都返回一個遍歷器物件可以用for...of迴圈進行遍歷,唯一的區別是keys()是對鍵名的遍歷、values()是對鍵值的遍歷,entries()是對鍵值對的遍歷。

for (let index of ['a', 'b'].keys()) {
  console.log(index);}
// 0// 1
for (let elem of ['a', 'b'].values()) {
  console.log(elem);}
// 'a'// 'b'
for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);}
// 0 "a"// 1 "b"
複製程式碼

6.陣列例項的includes()

Array.prototype.includes方法返回一個布林值,表示某個陣列是否包含給定的值,與字串的includes方法類似

[1, 2, 3].includes(2)     // true
[1, 2, 3].includes(4)     // false
[1, 2, NaN].includes(NaN) // true
複製程式碼

該方法的第二個參數列示搜尋的起始位置,預設為0。如果第二個引數為負數,則表示倒數的位置,如果這時它大於陣列長度(比如第二個引數為-4,但陣列長度為3),則會重置為從0開始。

[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true

複製程式碼

四 字串的結構賦值與函式;

字串也可以結構賦值,字串會被轉換成一個類似陣列的物件,

const [a, b, c, d, e] = 'hello';
//a  "h"   // b  "e"  // c "l" //d  "l"  //e  "o"
複製程式碼

箭頭函式:在es6中可以使用“箭頭”(=>)來定義函式

var f = v => v;
// 等同於var f = function (v) {
  return v;};
複製程式碼

如果箭頭函式只有一條語句,return 和{}可以省略不寫,如果不需要引數,就是用一個()代表引數部分

var f = () => 5;
// 等同於var f = function () { return 5 };
var sum = (num1, num2) => num1 + num2;
// 等同於var sum = function(num1, num2) {
  return num1 + num2;};
複製程式碼

由於大括號被解釋為程式碼塊,所以如果箭頭函式直接返回一個物件,必須在物件外面加上括號,否則會報錯

let getTempItem = id => { id: id, name: "Temp" };
// 報錯
let getTempItem = id => ({ id: id, name: "Temp" });
// 不報錯
複製程式碼

箭頭函式的使用注意點

1.函式體內的this物件,就是定義時所在的物件,而不是現在使用時的物件。This物件中的指向是可變的,但是在箭頭函式中,它是固定的

2.不可以當做建構函式,不可以使用new命令,否則會丟擲錯誤。

3.不可以使用arguments物件,該物件在函式體內不存在,如果要用,可以使用rest引數代替

五 屬性相關的方法

(1)Obect.getOwnProertyDescriptor(); 獲取一個物件中某個屬性的詳細資訊。

var a=1;
console.log(Object.getOwnProertyDescriptor(window,"a"));
複製程式碼

(2)Object.defineProperties() 精細化設定的物件

var obj ={};
Object.defineProperties(obj,{
    "name":{
        confingurable:false,//是否可以刪除
        writable:false,//是否可以修改
        enumerable:false,//是否可以列舉
        value:"wangcai"
    }
})
console.log(obj.name)
結果如下:
wangcai
複製程式碼

(3)getOwnPropertyNames() 獲取自己的屬性名,以陣列的格式返回的。

var obj ={
    name:"wangcai",
    age:66,
};
console.log(Object.getOwnPropertyNames(obj))
結果如下
[ 'name', 'age' ]
複製程式碼

(4)Object.keys() 得到屬性名,放在陣列中

var obj ={
    name:"wangcai",
    age :66
};console.log(Object.keys(obj))
結果如下
[ 'name', 'age' ]
複製程式碼

使用Object.getOwnPropertyNames()和Object.keys()都可以得到一個物件的屬性名,屬性名是放在一個陣列中的。

(5)對於物件的遍歷目前有三種方式:

for in

Object.keys()

Object.getOwnPropertyNames()

for in  :  會輸出自身以及原型鏈上可列舉的屬性。
Object.keys()  :  用來獲取物件自身可列舉的屬性鍵
Object.getOwnPropertyNames() : 用來獲取物件自身的全部屬性名
複製程式碼

(6)Object.values(); 獲取物件的值,放到陣列中。

var obj={
    name:"wangcai",
    age:66
};
console.log(Object.values(obj))
結果如下
[ 'wangcai', 66 ]
複製程式碼

(7)Object.assign就去用於物件的合併,將源物件的所有的可列舉屬性,複製到目標物件。 程式碼如下:

var obj1 ={}
var obj2 ={
    name:"wangcai",
    age:20
}
var obj3={
    name:"hello"
}
Object.assign(obj1,obj2,obj3)
obj1的結果如下
{ name: 'hello', age: 20 }

複製程式碼

注意細節: 第一個引數是目標物件,assign這個方法把其它的引數中的屬性全部加在第一個引數身上。

第一個引數在屬性複製過程中,可以會被修改,後面的會覆蓋前面的屬性

assign這個方法的返回值就是第一個引數的引用,也就是返回了第一個引數。

assign這個方法會把原型上面的發展也拷貝了。

assign不能拷貝繼承過來的屬性

assign也不拷貝不可列舉的屬性

assign是淺拷貝,這一點要注意

(8)set set和資料差不多,也是一種集合,區別在於:它裡面的值都是唯一的,沒有重複的。

陣列如下:

var arr =[1,2,3,1,true,"hello",true]
console.log(arr);
結果如下
[ 1, 2, 3, 1, true, 'hello', true ]
使用set後
var arr =new Set[1,2,3,1,true,"hello",true]
console.log(arr);
就直接報錯了
複製程式碼

set也是一種集合, 放一個陣列,如下:

var s1=new Set([1,2,3,"true"]);
console.log(s1)
結果如下
Set { 1, 2, 3, 'true' }
複製程式碼

放一個物件,使用add()來新增,如下:

var s1 =new Set();
s1.add(1)
s1.add(2)
s1.add(3)
console.log(s1)
console.log(typeof s1)
結果如下
Set { 1, 2, 3 }
object
複製程式碼

(9)map 它類似於物件,裡面存放也是鍵值對,區別在於:物件中的鍵名只能是字串,如果使用map,它裡面的鍵可以是任意值。

建立Map,如下:

var m = new Map()
複製程式碼

可以這樣放資料,使用set進行新增如下:

var m = new Map([
    ["a","hello"],
    [1,"123"]
]);
var s1 =m.set(false,"abc")

console.log(s1)
結果如下
Map { 'a' => 'hello', 1 => '123', false => 'abc' }
複製程式碼

相關文章