相對於ES5,ES6的對象字面量得到了很大程度的增強。這些改進我們可以輸入更少的代碼同時語法更易於理解。那就一起來看看對象增強的功能。對象字面量簡寫(Object Literal Shorthand)、對象方法簡寫(Object Method Shorthand)、計算對象鍵(Object key)、對象解構(Object Destructuring)。
ES6對象字面量簡寫
javascript中的對象使用對象字面量很容易創建,現在來使用ES5來創建一個對象,在music中兩個對象屬性 type和heat,他們的分別也是來之於type和heat。代碼如下:
ES5對象字面量
var type = 'rock';
var heat = '50%';
var music = {
type: type,
heat: heat
};
console.log(music); // Object {type: "rock", heat: "50%"}
ES6對象字面量
然而我們現在可以使用ES6的對象重新寫這個例子。在ES6中如何你的對象屬性名和當然作用域中的變量名相同,那么現在必須要在把這個type或heat書寫兩次。ES6的對象會自動的幫你完成鍵到值的賦值。這樣看起來代碼更優雅也能節省一半的字符輸入量。代碼如下:
var type = 'rock';
var heat = '50%';
var music = {
type,
heat
};
console.log(music); // Object {type: "rock", heat: "50%"}
ES5返回一個對象
假如我們創建一個函數他做了一些運算然后要返回這個函數中某些完成運算的變量為一個對象(函數返回多個值),比如:type或heat。在ES5中我們是這樣寫的。
function getMusic() {
var type = 'rock';
var heat = '50%';
// 一些運算
return { type: type, heat: heat };
}
console.log(getMusic().type); // rock
console.log(getMusic().heat); // 50%
ES6返回一個對象
現在使用ES6簡潔優雅的重寫這個函數返回一個對象,這里還是使用上面的函數,只是在返回對象的時候使用ES6的語法
function getMusic() {
var type = 'rock';
var heat = '50%';
// 一些運算
return { type, heat };
}
console.log(getMusic().type); // rock
console.log(getMusic().heat); // 50%
ES6對象方法簡寫
對象不僅僅是用來保存數據,他還可以用來保存函數。在ES5中我們也是通過給定一個鍵然后再給定一個匿名函數或命名函數。代碼如下:
ES5對象方法
var type = 'rock';
var heat = '50%';
var music = {
type: type,
heat: heat,
description: function() {
return '當前音樂風格為' + this.type + ',' + this.heat + '都喜歡';
}
}
console.log(music.description()); // 當前音樂風格為rock,50%都喜歡
ES6對象方法
使用ES6語法重寫上面的music對象,必須要在寫上對象鍵然后還要寫上function關鍵字。只需要方法名和圓括號再跟上花括號即可。代碼如下:
var type = 'rock';
var heat = '50%';
var music = {
type,
heat,
description() {
return '當前音樂風格為' + this.type + ',' + this.heat + '都喜歡';
}
}
console.log(music.description()); // 當前音樂風格為rock,50%都喜歡
ES6對象方法簡寫和字符串模板
還是使用上面的對象music,我們有一個方法description他返回的是一個字符串,但是字符串的拼接過程可以說是相當吃力的,如果稍微不注意很容易出錯。使用ES6的字符串模將完美解決這個問題。字符串模板使用``將字符串包裹起來里面的變量使用${}包裹起來。代碼如下:
var type = 'rock';
var heat = '50%';
var music = {
type,
heat,
description() {
return `當前音樂風格為${this.type},${this.heat}都喜歡'`;
}
}
console.log(music.description()); // 當前音樂風格為rock,50%都喜歡'
ES6計算對象鍵(Keys)
在ES5中對象可以理解為一個關聯數組或一個hashmaps。在ES5中創建對象的鍵就三種object.xx、object['xx']、Object.defineProperty可以用來構建對象的鍵。在ES6中可以使用更多的方法來創建。
ES6計算對象鍵
在這次的music對象中,我們要使用一個變量field作為我們對象的鍵,heat作為這個鍵的值。代碼如下:
var heat = '50%';
var field = 'rock';
var music = {
[field]: heat
}
console.log(music); // Object {rock: "50%"}
在ES5中也可以使用如下代碼定義,但是~~額。
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true});
} else {
obj[key] = value;
}
return obj;
}
var heat = '50%';
var field = 'rock';
var music = _defineProperty({}, field, heat);
console.log(music)
ES6對象鍵計算表達式
可以在對象鍵的變量上調用方法 wow!
var heat = '50%';
var field = 'Rock and Roll';
var music = {
[field.toLowerCase()]: heat
}
console.log(music); // Object {rock and roll: "50%"}
ES5同樣也是可以實現,只是~~
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true});
} else {
obj[key] = value;
}
return obj;
}
var heat = '50%';
var field = 'Rock and Roll';
var music = _defineProperty({}, field.toLowerCase(), heat);
console.log(music); // Object {rock and roll: "50%"}
還可以使用不同的數組方法為我們的對象鍵賦值,使用[]將會計算對象的鍵值。代碼如下:
let people = [20, 25, 30];
let music = {
people,
[people]: 'They all love rock and roll',
[people.length]: 'object key is 3',
[{}]: 'empty object'
}
console.log(music);
console.log(music.people);
console.log(music['people']);
console.log(music[people]);
console.log(music[people.length]);
console.log(music['[object Object]']);
console.log(music[music]);
/*
Object {3: "object key is 3", people: Array[3], 20,25,30: "They all love rock and roll", [object Object]: "empty object"}
[20, 25, 30]
[20, 25, 30]
They all love rock and roll
object key is 3
empty object
empty object
*/
ES6對象解構
把對象或者數組中的數據取出使用是我們經常要使用的功能,ES6有新的功能讓我們快捷拆分對象和數組中的值。在=號右邊是要解構的對象或數組,=號左邊是要接收創建的變量。代碼如下:
對象解構1
=號左邊的類型要和右邊對應,比如右邊是一個對象類型則左邊也需要使用對象字面量包裹。右邊是數組則左邊也需要使用數組包裹。
let music = {
type: 'rock',
heat: '50%'
};
let { type, heat } = music;
console.log(type, heat); // rock 50%
數組解構
let people = [20, 25, 30]
let [young, oldYoung] = people;
console.log(young, oldYoung) // 20 25
ES6對象解構重命名
有時候我們不想使用解構對象中的鍵來新創建變量,需要解構后重命名為新的變量名。這是可以使用重命名解構語法
let music = {
type: 'rock',
heat: '50%'
}
let { type: newType, heat: newHeat } = music;
console.log(newType, newHeat); // rock 50%
ES6對象解構其他類型
如果在一個對象中的值包含其他的數據類型同樣是可以解構出來的。代碼如下:
let music = {
type: ['rock', 'pop', 'jazz'],
heat: '50%',
}
let { type, heat } = music;
console.log(type, heat); // ["rock", "pop", "jazz"] "50%"
ES6解構函數參數
這是一個非常實用的功能,可以將傳遞進來的函數對象參數直接解構為變量,在函數中可以方便調用。這只需要簡單的對象解構函數即可完成。代碼如下:
function getMusic({ type, heat }) {
console.log(type, heat);
}
getMusic({ type: 'rock', heat: '80%'}); // rock 80%
ES6對象字面量增強總結:
在ES6中新增了很多功能(方便書寫理解和避免代碼問題)。這里學習了對象字面量簡寫,不用再書寫兩次代碼。還有對象方法簡寫也是同樣道理。接着是字符串模板,一種更優雅的字符串拼接方式。還有對象鍵運算,他使用了[]可以為對象鍵賦值時進行一些運算。最后是ES6的解構語法。利用這些新特性我們的代碼將會寫的更優雅和易於理解。
參考連接