ES6 中可以提升幸福度的小功能
一、變量解構賦值的用途
1)交換變量的值
let x = 1; let y = 2; [x, y] = [y, x]
2)從函數(shù)返回多個值
// 返回一個數(shù)組
function example(){
return [1, 2, 4];
}
let [a, b, c] = example()
// 返回一個對象
function example(){
return {
foo:1,
bar: 2
}
}
let {foo, bar} = example(); 或者 ( {foo, bar} = example() )
3)提取JSON數(shù)據(jù)
let jsonData = {
id:42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number} = jsonData;
4)輸入模塊的指定方法
加載模塊時,往往需要指定輸入的方法,解構賦值使得輸入語句非常清晰
const { SourceMapConsumer, SourceNode } = require("source-map")
5) 數(shù)組復制的功能
在es5中,開發(fā)者經(jīng)常使用 concat() 方法克隆數(shù)組:
// 在 es5 中克隆數(shù)組 var colors = [ 'red', 'green', 'blue' ]; var clonedColors = colors.concat(); console.log(clonedColors); // "[red, green, blue]"
concat() 方法的設計初衷是連接兩個數(shù)組,如果調(diào)用時不傳遞參數(shù)就會返回當前數(shù)組的副本。在es6中可以通過不定元素的語法來實現(xiàn)相同的目標:
let colors = [ 'red', 'green', 'blue' ] let [ ...clonedColors ] = colors; console.log(clonedColors); // "[red, green, blue]"
6) 結(jié)合Set集合,創(chuàng)建一個無重復元素的數(shù)組
function eliminateDuplicates(items) {
return [...new Set(items)]
}
let numbers = [1, 2, 3, 3, 3, 4, 5];
let noDuplicates = eliminateDuplicates(numbers );
console.log(noDuplicates ); // [1,2,3,4,5]
7) 使用apply 把兩個數(shù)據(jù)合并成一個
var arra1 = [{
name: '小智',
age: 26
}]
var arra2 = [{
name: '大智',
age: 27
}]
arra1.push.apply(arra1, arra2)
console.log(arra1)
二、函數(shù)的用處(常見就不多說了)
1)創(chuàng)建立即執(zhí)行函數(shù)表達式
// es5
let person = function(name) {
return {
getName: function() {
return name;
}
}
}('小智');
console.log(person.getName()); // 小智
在這段代碼中,立即執(zhí)行函數(shù)表達式創(chuàng)建了一個包含getName() 方法的新對象,將參數(shù) name 作為該對象的一個私有成員返回給函數(shù)的調(diào)用者。
只要箭頭函數(shù)包裹在小括號里,就可以用它實現(xiàn)相同的功能
// es6
let person = ((name) => {
return {
getName: function() {
return name;
}
}
})('小智2');
console.log(person.getName()); //小智
2.利用參數(shù)默認值可以指定某一個參數(shù)不得省略,如果省略就拋出一個錯誤。
function throwEmptyError() {
throw new Error('參數(shù)不能為空');
}
function foo(mustBeParams = throwEmptyError() ){
return mustBeParams();
}
foo() // 參數(shù)不能為空
三、擴展對象的功能性讓代碼更加簡潔
1) 可計算屬性名
在es6中,使用方括號可以計算屬性名稱,如
let lastName ='last name';
let person = {
"first name": 'Nicholas',
[lastName]: 'Zakas'
}
console.log(person['first name']); // "Nicholas"
console.log(person[lastName]); // Zakas
2) 利用 Object.assign()合并兩個對象
function request(options) {
let defaultOptions = {
port: 8000,
type: 'get'
}
Object.assign(options,defaultOptions);
console.log(options)
}
request({url: 'http://www.baidu.com'})
四、結(jié)合es6簡潔函數(shù)寫法,高階函數(shù)的應用
1) tab 函數(shù)
// 此處tap函數(shù)接受一個 vaule 并返回一個包含value 閉包函數(shù),該函數(shù)被執(zhí)行 const tap = (value) => (fn) => ( typeof(fn) === 'function' && fn(value), console.log(value) )
tab函數(shù)用處:假設你在遍歷一個來自服務器的數(shù)組,并發(fā)現(xiàn)數(shù)據(jù)錯了,因此你想調(diào)試一下,看看數(shù)組包含了什么,就可以用 tab函數(shù)
[1, 2 ,3, 4].forEach((a) => {
tap(a)((a)=> {
console.log(a)
})
});
#### 2) once 函數(shù)
在很多情況下,我們只需要運行一次給定的函數(shù),發(fā)起一次銀行支付請求等,這時就可以用到 once 函數(shù)。
const once = (fn) => {
let done = false;
return function () {
return done?undefined:((done=true),fn.apply(this,arguments))
}
}
const doPayment = once(()=>{
console.log('payment is done')
})
doPayment(); // payment is done
console.log(doPayment()); //undefined
#### 3) 函數(shù)柯里化的應用
開發(fā)者編寫代碼的時候應用的不同階級編寫很多日志,我們可以編寫一個如下的日志函數(shù):
const loggerHelper = (mode, initialMessage, errorMessage, lineNo) => {
if (mode === 'DEBUG') {
console.debug(initialMessage,errorMessage + 'at line:' + lineNo)
}
else if (mode === 'ERROR') {
console.error(initialMessage,errorMessage + 'at line:' + lineNo)
}
else if (mode === 'WARN') {
console.warn(initialMessage,errorMessage + 'at line:' + lineNo)
}
else
throw "Wrong mode"
}
當開發(fā)者需要向控制臺打印Stats.js文件中的錯誤時,可以用如下方式:
loggerHelper("ERROR", "ERROR At Stats.js", "Invalid argument passed", 23);
這樣對于 我們追求完美可讀的程序員來說,可能是不太能接受的,現(xiàn)在用柯里來優(yōu)化以上代碼,
先簡要說明什么是函數(shù)柯里化:
柯里化是把一個多參數(shù)函數(shù)轉(zhuǎn)換成一個嵌套的一元函數(shù)過程。
封裝一個把把多參數(shù)函數(shù)轉(zhuǎn)制為一元函數(shù)的curry函數(shù)
let curry = (fn) => {
if (typeof fn !== 'function') {
throw Error('No function provided');
}
return function curriedFn(...args) {
// 傳入?yún)?shù)是否小于函數(shù)參數(shù)列表長度,
if (args.length < fn.length) {
return function() {
return curriedFn.apply(null, args.concat([].slice.call(arguments)));
}
}
return fn.apply(null, args)
}
}
let errorLogger = curry(loggerHelper)("ERROR")("ERROR At Stats.js");
let debugLogger = curry(loggerHelper)("DEBUG")("ERROR")("Debug At Stats.js");
let warnLogger = curry(loggerHelper)("WARN")("Warn")("At Stats.js");
// 用于錯誤
errorLogger("Error message", 21)
// 用于調(diào)試
debugLogger('Debug message', 233)
// 用于警告
warnLogger("Warn message", 34);
現(xiàn)在我們能夠輕松引用上面的柯里化并在各自的上下文中使用它們了。
總結(jié)
以上所述是小編給大家介紹的ES6 中可以提升幸福度的小功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
關于字符串和對象互轉(zhuǎn)以及JSON.parse()的坑
這篇文章主要介紹了關于字符串和對象互轉(zhuǎn)以及JSON.parse()的坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
js模仿html5 placeholder適應于不支持的瀏覽器
html5原生支持placeholder,對于不支持的瀏覽器(ie)可用js模擬實現(xiàn),不要走開,接下來為您詳細介紹實現(xiàn)方法2013-01-01

