JavaScript ES6 字符串、數組、Map、Set


 

字符串

對Unicode的支持

ES5可以使用\uxxxx形式表示⼀個字符,xxxx是字符的Unicode碼,但只能表示\u0000~\uFFFF之間的字符,超出這個範圍就不能正確識別。

ES6增加了對超出\u0000~\uFFFF範圍的Unicode字符的⽀持

let str="\u20bb7";
console.log(str);  //識別不了

str="\u{20bb7}";  //超出範圍的字符碼放在{ }中即能正確識別
console.log(str);

 

字符串新增的方法

let str="hello js";

str.includes("js")  //是否包含指定字符串,返回布爾值

str.startsWith("hello")  //是否以指定的字符串開頭,返回布爾值
str.endsWith("js")  

str.repeat(4);  //字符串重複,返會*4後的字符串,以新串形式返回,原串不變

 

模板字符串

經常要拼接字符串,以前只能用+或者concat(),ES6提供了模板字符串來實現字符串的拼接

let name="chy";
let age=20;

let info=`我是${name},我今年${age}歲`;  //模板字符串
console.log(info);

模板字符串放在反引號中,裏面的內容(包括換行、空格)會保持原樣。
${ }中可以訪問變量、數組、對象,可以寫js表達式,進行數學運算。

 

數組

擴展運算符…

let arr1=[1,2,3,4];

// 數組複製
let arr2=[...arr1];  //深拷貝,返回arr1的副本
let arr3=[0,...arr1,5];  //...arr1是arr1的元素副本,還可以添加其他元素


// 數組提取
let [,...arr4]=arr1;  //不要arr1的第一個元素,把剩下的元素拷貝到arr4中。...要是左邊數組的最後一個元素


// 函數傳參、展開數組
function sum(x,y){
    console.log(x+y);
}
sum(...[1,2]);  //會把數組展開,一個元素作爲一個參數傳入
sum(...arr1);  //如果數組元素個數大於所需參數個數,只取前n個

 

新增的方法

	
let arr=[1,2,3,4];

// 元素替換,數組改變
arr.fill(10);  //元素全部替換爲10
arr.fill(10,1,3);  //只替換[1,3)上的元素

let arr1=[...arr].fill(10);  //如果不想改變原數組,可以使用copy的


// 返回數組中第一次出現該元素的下標,沒有出現則返回-1
arr.indexOf(10)

// 判斷數組中是否包含指定元素,返回布爾值
arr.includes(10)



// map()可以在已有數組的基礎上,創建一個新的數組
// 比如後臺返回json數組,gender用0、1表示,需要我們先轉換爲男、女
let jsonArr=[{"name":"范蠡","gender":0},{"name":"西施","age":1}];

// 以新數組的形式返回,原數組不變
let data=jsonArr.map(function(item){  //item表示數組中的一個元素
    return {
        "username":item.name, //可以修改key的名稱
        "gender":item.gender==0?'男':'女',
    }
});


// 將僞數組切割爲數組。僞數組指的是:不是數組,但具有length屬性、可迭代
let str="hello";
let arr=Array.from(str);  // 將字符串切割爲字符數組

 

對象

擴展運算符…

對象中也可以使用擴展運行符

let user={"name":"chy","age":20};

// 拷貝對象,返回對象副本。如果對象嵌套對象(value是對象),則value拷貝的是隻是嵌套對象的引用
let user1={...user};   


// 修改|增加鍵值對,key已存在則爲修改,不存在則爲添加
let user2={...user,"name":"chy111","gender":"男"};  


// 合併對象(的鍵值對),如果有相同的key,只保留第二個參數的 
let user3={...user1,...user2};  

對象的擴展運算符是ES8的語法,使用ES6(ES2015)的轉譯規則識別不了,需要安裝babel的插件transform-object-rest-spread

npm install babel-plugin-transform-object-rest-spread

然後在.babelrc中配置插件

{
    "presets": ["es2015"],
    "plugins": ["transform-object-rest-spread"]  //配置插件
}

重新轉譯已經可以了

 

新的定義方式

let name="chy";
let age=20;


// ES5的對象定義
let user1={
    name:name, //key都是字符串,值會取變量的值,=> "name":"chy"
    age:age,
    info:function(){
        console.log(`姓名:${name},年齡:${age}`);
    }
}

user1.info();


// ES6的對象定義
let user2={
    name, //key、value相同時可簡寫,key認爲是字符串,value認爲是變量
    age,
    info(){  //函數也可簡寫
        console.log(`姓名:${name},年齡:${age}`);
    }
}

user1.info();

 

新增的方法

let user1={"name":"chy","age":20};

let user2={};
// 對象的拷貝,參數:目標對象、源對象。目標對象必須先聲明爲對象
// 如果源對象嵌套對象(key-value的value是對象),則拷貝的value只是引用
Object.assign(user2,user1);



// 獲取對象中所有的key、value、key-value,返回數組
let keys=Object.keys(user1);
let values=Object.values(user1);
let items=Object.entries(user1);

// 可以使用for of循環迭代
for(let key of keys){
    console.log(key);
}

 

Map、WeakMap

Map

對象的key必須是string,map和對象差不多,但map的key可以是任意類型


let map1=new Map();
map1.set([1,2,3],"number");  //key是數組,value是字符串


let map2=new Map([["name","chy"],["age",20]]);  //參數是數組,[[key1,value1],[key2,value2],...],一個小數組表示一個key-value


map2.size  //獲取map的鍵值對個數


map2.set("name","zhangsan");  //添加|更新鍵值對。key不存在是添加,已存在是更新
map2.get("name")  //獲取對應的value。如果沒有這個鍵值對,返回undefined


map2.has("name");  //檢測map中是否有指定的鍵值對


map2.delete("name")  //刪除鍵值對
map2.clear();  //清空map,刪除所有鍵值對


// 獲取所有的key、value、key-value,返回數組
let keys=map2.keys();
let values=map2.values();
let items=map2.entries();


// 可以使用for of 循環遍歷
for(let key of keys){

}

// 可以直接寫map名稱,直接寫map名時默認取entries()
for(let item of map2){

}
	

 

WeakMap

WeakMap和Map差不多,但WeakMap的key只能是對象

let map1=new Map();

// key只能是對象
map1.set({"name":"chy","age":20},"user");  


// 參數是數組,[[key1,value1],[key2,value2],...],一個小數組表示一個key-value,key只能是對象
let map2=new Map([[{"name":"chy","age":20},"user1"],[{"name":"chy111","age":21},"user2"]]);  

對象就算沒有被引用,也不會觸發垃圾回收機制,不會被gc回收,需要手動把對象賦值爲null纔會被gc回收,很麻煩。

使用WeakMap中有個好處:如果WeakMap中的key(對象)在WeakMap外沒被引用,會自動觸發gc回收該對象(刪除WeakMap中對應的鍵值對)。

但這也造成了WeakMap中的鍵值對數量不確定,不能使用size、clear(),不能進行遍歷操作。

 

Set

set無序、元素不可重複,好處:可以去重

let set=new Set();

// 添加元素,元素類型可以不同,可以是任何類型
set.add("c");
set.add(1);

//檢測是否含有指定元素
set.has("c") 

// 遍歷
set.forEach(function(item){
    console.log(item);
})

// 刪除元素
set.delete("c")  

// 從數組創建set
let arr=[1,2,3,4];
set=new Set(arr); 

// 從set創建數組
arr=Array.from(set);  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章