JavaScript 是目前最流行的編程語言之一慌盯,正如大多數(shù)人所說:“如果你想學(xué)一門編程語言浆劲,請學(xué)JavaScript拇舀。”
FreeCodeCamp的創(chuàng)始人 Quincy Larson 在最近的一次采訪中被問到哪種語言開發(fā)人員應(yīng)該首先學(xué)習(xí)础拨。他回答:“ JavaScript∩茉兀”
“軟件正在吞噬世界诡宗,JavaScript正在吞噬軟件。JavaScript每年都在變得越來越占主導(dǎo)地位击儡,而且沒人知道最終會取代它的是什么塔沃。"
如果您沒有充分的理由學(xué)習(xí)一種新語言(例如您的工作要求您維護(hù)非JavaScript代碼庫),那么我的建議是著重于提高JavaScript的水平曙痘》急”
聽我說這么多,你是不是很激動呢边坤。這里有127個常用的JS代碼片段名扛,方便你學(xué)習(xí)和使用。
1茧痒、all
如果數(shù)組所有元素滿足函數(shù)條件肮韧,則返回true。調(diào)用時,如果省略第二個參數(shù)弄企,則默認(rèn)傳遞布爾值超燃。
constall=(arr,fn=Boolean)=>arr.every(fn);
all([4,2,3],x=>x>1);// true
all([1,2,3]);// true
2、allEqual
判斷數(shù)組中的元素是否都相等
constallEqual=arr=>arr.every(val=>val===arr[0]);
allEqual([1,2,3,4,5,6]);// false
allEqual([1,1,1,1]);// true
3拘领、approximatelyEqual
此代碼示例檢查兩個數(shù)字是否近似相等意乓,差異值可以通過傳參的形式進(jìn)行設(shè)置
constapproximatelyEqual=(v1,v2,epsilon=0.001)=>Math.abs(v1-v2)<epsilon;
approximatelyEqual(Math.PI/2.0,1.5708);// true
4、arrayToCSV
此段代碼將沒有逗號或雙引號的元素轉(zhuǎn)換成帶有逗號分隔符的字符串即CSV格式識別的形式约素。
constarrayToCSV=(arr,delimiter=',')=>
arr.map(v=>v.map(x=>`"${x}"`).join(delimiter)).join('\n');
arrayToCSV([['a','b'],['c','d']]);// '"a","b"\n"c","d"'
arrayToCSV([['a','b'],['c','d']],';');// '"a";"b"\n"c";"d"'
5届良、arrayToHtmlList
此段代碼將數(shù)組元素轉(zhuǎn)換成<li>標(biāo)記,并將此元素添加至給定的ID元素標(biāo)記內(nèi)圣猎。
constarrayToHtmlList=(arr,listID)=>(el=>(
????(el=document.querySelector('#'+listID)),
????(el.innerHTML+=arr.map(item=>`<li>${item}</li>`).join(''))
))();
arrayToHtmlList(['item 1','item 2'],'myListID');
6士葫、attempt
此段代碼執(zhí)行一個函數(shù),將剩余的參數(shù)傳回函數(shù)當(dāng)參數(shù)送悔,返回相應(yīng)的結(jié)果慢显,并能捕獲異常。
constattempt=(fn,...args)=>{
????try{
????????returnfn(...args);
????}catch(e){
????????returneinstanceofError?e:newError(e);
????}
};
varelements=attempt(function(selector){
returndocument.querySelectorAll(selector);
},'>_>');
if(elementsinstanceofError)elements=[];// elements = []
7欠啤、average
此段代碼返回兩個或多個數(shù)的平均數(shù)荚藻。
constaverage=(...nums)=>nums.reduce((acc,val)=>acc+val,0)/nums.length;
average(...[1,2,3]);// 2
average(1,2,3);// 2
8、averageBy
一個 map()函數(shù)和 reduce()函數(shù)結(jié)合的例子跪妥,此函數(shù)先通過 map() 函數(shù)將對象轉(zhuǎn)換成數(shù)組鞋喇,然后在調(diào)用reduce()函數(shù)進(jìn)行累加,然后根據(jù)數(shù)組長度返回平均值眉撵。
constaverageBy=(arr,fn)=>
arr.map(typeoffn==='function'?fn:val=>val[fn]).reduce((acc,val)=>acc+val,0)/
arr.length;
averageBy([{n:4},{n:2},{n:8},{n:6}],o=>o.n);// 5
averageBy([{n:4},{n:2},{n:8},{n:6}],'n');// 5
9侦香、bifurcate
此函數(shù)包含兩個參數(shù),類型都為數(shù)組纽疟,依據(jù)第二個參數(shù)的真假條件罐韩,將一個參數(shù)的數(shù)組進(jìn)行分組,條件為真的放入第一個數(shù)組污朽,其它的放入第二個數(shù)組散吵。這里運(yùn)用了Array.prototype.reduce() 和 Array.prototype.push() 相結(jié)合的形式。
constbifurcate=(arr,filter)=>
arr.reduce((acc,val,i)=>(acc[filter[i]?0:1].push(val),acc),[[],[]]);
bifurcate(['beep','boop','foo','bar'],[true,true,false,true]);
// [ ['beep', 'boop', 'bar'], ['foo'] ]
10蟆肆、bifurcateBy
此段代碼將數(shù)組按照指定的函數(shù)邏輯進(jìn)行分組矾睦,滿足函數(shù)條件的邏輯為真,放入第一個數(shù)組中炎功,其它不滿足的放入第二個數(shù)組 枚冗。這里運(yùn)用了Array.prototype.reduce() 和 Array.prototype.push() 相結(jié)合的形式,基于函數(shù)過濾邏輯蛇损,通過 Array.prototype.push() 函數(shù)將其添加到數(shù)組中赁温。
constbifurcateBy=(arr,fn)=>
arr.reduce((acc,val,i)=>(acc[fn(val,i)?0:1].push(val),acc),[[],[]]);
bifurcateBy(['beep','boop','foo','bar'],x=>x[0]==='b');
// [ ['beep', 'boop', 'bar'], ['foo'] ]
11坛怪、bottomVisible
用于檢測頁面是否滾動到頁面底部。
constbottomVisible=()=>
document.documentElement.clientHeight+window.scrollY>=
(document.documentElement.scrollHeight||document.documentElement.clientHeight);
bottomVisible();// true
12股囊、byteSize
此代碼返回字符串的字節(jié)長度袜匿。這里用到了Blob對象,Blob(Binary Large Object)對象代表了一段二進(jìn)制數(shù)據(jù)稚疹,提供了一系列操作接口居灯。其他操作二進(jìn)制數(shù)據(jù)的API(比如File對象),都是建立在Blob對象基礎(chǔ)上的内狗,繼承了它的屬性和方法穆壕。生成Blob對象有兩種方法:一種是使用Blob構(gòu)造函數(shù),另一種是對現(xiàn)有的Blob對象使用slice方法切出一部分其屏。
constbyteSize=str=>newBlob([str]).size;
byteSize('??');// 4
byteSize('Hello World');// 11
13、capitalize
將字符串的首字母轉(zhuǎn)成大寫,這里主要運(yùn)用到了ES6的展開語法在數(shù)組中的運(yùn)用缨该。
constcapitalize=([first,...rest])=>
first.toUpperCase()+rest.join('');
capitalize('fooBar');// 'FooBar'
capitalize('fooBar',true);// 'FooBar'
14偎行、capitalizeEveryWord
將一個句子中每個單詞首字母轉(zhuǎn)換成大寫字母,這里中要運(yùn)用了正則表達(dá)式進(jìn)行替換贰拿。
constcapitalizeEveryWord=str=>str.replace(/\b[a-z]/g,char=>char.toUpperCase());
capitalizeEveryWord('hello world!');// 'Hello World!'
15蛤袒、castArray
此段代碼將非數(shù)值的值轉(zhuǎn)換成數(shù)組對象。
constcastArray=val=>(Array.isArray(val)?val:[val]);
castArray('foo');// ['foo']
castArray([1]);// [1]
16膨更、compact
將數(shù)組中移除值為 false 的內(nèi)容妙真。
constcompact=arr=>arr.filter(Boolean);
compact([0,1,false,2,'',3,'a','e'*23,NaN,'s',34]);
// [ 1, 2, 3, 'a', 's', 34 ]
17、countOccurrences
統(tǒng)計數(shù)組中某個值出現(xiàn)的次數(shù)
constcountOccurrences=(arr,val)=>arr.reduce((a,v)=>(v===val?a+1:a),0);
countOccurrences([1,1,2,1,2,3],1);// 3
18荚守、Create Directory
此代碼段使用 existSync() 檢查目錄是否存在珍德,然后使用 mkdirSync() 創(chuàng)建目錄(如果不存在)。
constfs=require('fs');
constcreateDirIfNotExists=dir=>(!fs.existsSync(dir)?fs.mkdirSync(dir):undefined);
createDirIfNotExists('test');
// creates the directory 'test', if it doesn't exist
19矗漾、currentURL
返回當(dāng)前訪問的 URL 地址锈候。
constcurrentURL=()=>window.location.href;
currentURL();// 'https://medium.com/@fatosmorina'
20、dayOfYear
返回當(dāng)前是今年的第幾天
constdayOfYear=date=>
Math.floor((date-newDate(date.getFullYear(),0,0))/1000/60/60/24);
dayOfYear(newDate());// 272
21敞贡、decapitalize
將字符串的首字母轉(zhuǎn)換成小寫字母
constdecapitalize=([first,...rest])=>
first.toLowerCase()+rest.join('')
decapitalize('FooBar');// 'fooBar'
22泵琳、deepFlatten
通過遞歸的形式,將多維數(shù)組展平成一維數(shù)組誊役。
constdeepFlatten=arr=>[].concat(...arr.map(v=>(Array.isArray(v)?deepFlatten(v):v)));
deepFlatten([1,[2],[[3],4],5]);// [1,2,3,4,5]
23获列、default
去重對象的屬性,如果對象中含有重復(fù)的屬性蛔垢,以前面的為準(zhǔn)击孩。
constdefaults=(obj,...defs)=>Object.assign({},obj,...defs.reverse(),obj);
defaults({a:1},{b:2},{b:6},{a:3});// { a: 1, b: 2 }
24、defer
延遲函數(shù)的調(diào)用啦桌,即異步調(diào)用函數(shù)溯壶。
constdefer=(fn,...args)=>setTimeout(fn,1,...args);
defer(console.log,'a'),console.log('b');// logs 'b' then 'a'
25及皂、degreesToRads
此段代碼將標(biāo)準(zhǔn)的度數(shù),轉(zhuǎn)換成弧度且改。
constdegreesToRads=deg=>(deg*Math.PI)/180.0;
degreesToRads(90.0);// ~1.5708
26验烧、difference
此段代碼查找兩個給定數(shù)組的差異,查找出前者數(shù)組在后者數(shù)組中不存在元素又跛。
constdifference=(a,b)=>{
consts=newSet(b);
returna.filter(x=>!s.has(x));
};
difference([1,2,3],[1,2,4]);// [3]
27碍拆、differenceBy
通過給定的函數(shù)來處理需要對比差異的數(shù)組,查找出前者數(shù)組在后者數(shù)組中不存在元素慨蓝。
constdifferenceBy=(a,b,fn)=>{
consts=newSet(b.map(fn));
returna.filter(x=>!s.has(fn(x)));
};
differenceBy([2.1,1.2],[2.3,3.4],Math.floor);// [1.2]
differenceBy([{x:2},{x:1}],[{x:1}],v=>v.x);// [ { x: 2 } ]
28感混、differenceWith
此段代碼按照給定函數(shù)邏輯篩選需要對比差異的數(shù)組,查找出前者數(shù)組在后者數(shù)組中不存在元素礼烈。
constdifferenceWith=(arr,val,comp)=>arr.filter(a=>val.findIndex(b=>comp(a,b))===-1);
differenceWith([1,1.2,1.5,3,0],[1.9,3,0],(a,b)=>Math.round(a)===Math.round(b));
// [1, 1.2]
29弧满、digitize
將輸入的數(shù)字拆分成單個數(shù)字組成的數(shù)組。
constdigitize=n=>[...`${n}`].map(i=>parseInt(i));
digitize(431);// [4, 3, 1]
30此熬、distance
計算兩點(diǎn)之間的距離
constdistance=(x0,y0,x1,y1)=>Math.hypot(x1-x0,y1-y0);
distance(1,1,2,3);// 2.23606797749979
31庭呜、drop
此段代碼將給定的數(shù)組從左邊開始刪除 n 個元素
constdrop=(arr,n=1)=>arr.slice(n);
drop([1,2,3]);// [2,3]
drop([1,2,3],2);// [3]
drop([1,2,3],42);// []
32、dropRight
此段代碼將給定的數(shù)組從右邊開始刪除 n 個元素
constdropRight=(arr,n=1)=>arr.slice(0,-n);
dropRight([1,2,3]);// [1,2]
dropRight([1,2,3],2);// [1]
dropRight([1,2,3],42);// []
33犀忱、dropRightWhile
此段代碼將給定的數(shù)組按照給定的函數(shù)條件從右開始刪除募谎,直到當(dāng)前元素滿足函數(shù)條件為True時,停止刪除阴汇,并返回數(shù)組剩余元素数冬。
constdropRightWhile=(arr,func)=>{
while(arr.length>0&&!func(arr[arr.length-1]))arr=arr.slice(0,-1);
returnarr;
};
dropRightWhile([1,2,3,4],n=>n<3);// [1, 2]
34、dropWhile
按照給定的函數(shù)條件篩選數(shù)組搀庶,不滿足函數(shù)條件的將從數(shù)組中移除拐纱。
constdropWhile=(arr,func)=>{
while(arr.length>0&&!func(arr[0]))arr=arr.slice(1);
returnarr;
};
dropWhile([1,2,3,4],n=>n>=3);// [3,4]
35、elementContains
接收兩個DOM元素對象參數(shù)地来,判斷后者是否是前者的子元素戳玫。
constelementContains=(parent,child)=>parent!==child&&parent.contains(child);
elementContains(document.querySelector('head'),document.querySelector('title'));// true
elementContains(document.querySelector('body'),document.querySelector('body'));// false
36、filterNonUnique
移除數(shù)組中重復(fù)的元素
constfilterNonUnique=arr=>[…newSet(arr)];
filterNonUnique([1,2,2,3,4,4,5]);// [1, 2, 3, 4, 5]
37未斑、findKey
按照給定的函數(shù)條件咕宿,查找第一個滿足條件對象的鍵值。
constfindKey=(obj,fn)=>Object.keys(obj).find(key=>fn(obj[key],key,obj));
findKey(
{
barney:{age:36,active:true},
fred:{age:40,active:false},
pebbles:{age:1,active:true}
},
o=>o['active']
);// 'barney'
38蜡秽、findLast
按照給定的函數(shù)條件篩選數(shù)組府阀,將最后一個滿足條件的元素進(jìn)行刪除。
constfindLast=(arr,fn)=>arr.filter(fn).pop();
findLast([1,2,3,4],n=>n%2===1);// 3
39芽突、flatten
按照指定數(shù)組的深度试浙,將嵌套數(shù)組進(jìn)行展平。
constflatten=(arr,depth=1)=>
arr.reduce((a,v)=>a.concat(depth>1&&Array.isArray(v)?flatten(v,depth-1):v),[]);
flatten([1,[2],3,4]);// [1, 2, 3, 4]
flatten([1,[2,[3,[4,5],6],7],8],2);// [1, 2, 3, [4, 5], 6, 7, 8]
40寞蚌、forEachRight
按照給定的函數(shù)條件田巴,從數(shù)組的右邊往左依次進(jìn)行執(zhí)行钠糊。
constforEachRight=(arr,callback)=>
arr
.slice(0)
.reverse()
.forEach(callback);
forEachRight([1,2,3,4],val=>console.log(val));// '4', '3', '2', '1'
41、forOwn
此段代碼按照給定的函數(shù)條件壹哺,進(jìn)行迭代對象抄伍。
constforOwn=(obj,fn)=>Object.keys(obj).forEach(key=>fn(obj[key],key,obj));
forOwn({foo:'bar',a:1},v=>console.log(v));// 'bar', 1
42、functionName
此段代碼輸出函數(shù)的名稱管宵。
constfunctionName=fn=>(console.debug(fn.name),fn);
functionName(Math.max);// max (logged in debug channel of console)
43截珍、getColonTimeFromDate
此段代碼從Date對象里獲取當(dāng)前時間。
constgetColonTimeFromDate=date=>date.toTimeString().slice(0,8);
getColonTimeFromDate(newDate());// "08:38:00"
44箩朴、getDaysDiffBetweenDates
此段代碼返回兩個日期之間相差多少天
constgetDaysDiffBetweenDates=(dateInitial,dateFinal)=>
(dateFinal-dateInitial)/(1000*3600*24);
getDaysDiffBetweenDates(newDate('2019-01-13'),newDate('2019-01-15'));// 2
45岗喉、getStyle
此代碼返回DOM元素節(jié)點(diǎn)對應(yīng)的屬性值。
constgetStyle=(el,ruleName)=>getComputedStyle(el)[ruleName];
getStyle(document.querySelector('p'),'font-size');// '16px'
46炸庞、getType
此段代碼的主要功能就是返回數(shù)據(jù)的類型钱床。
constgetType=v=>
v===undefined?'undefined':v===null?'null':v.constructor.name.toLowerCase();
getType(newSet([1,2,3]));// 'set'
47、hasClass
此段代碼返回DOM元素是否包含指定的Class樣式埠居。
consthasClass=(el,className)=>el.classList.contains(className);
hasClass(document.querySelector('p.special'),'special');// true
48诞丽、head
此段代碼輸出數(shù)組的第一個元素。
consthead=arr=>arr[0];
head([1,2,3]);// 1
49拐格、hide
此段代碼隱藏指定的DOM元素。
consthide=(...el)=>[...el].forEach(e=>(e.style.display='none'));
hide(document.querySelectorAll('img'));// Hides all <img> elements on the page
50刑赶、httpsRedirect
此段代碼的功能就是將http網(wǎng)址重定向https網(wǎng)址捏浊。
consthttpsRedirect=()=>{
if(location.protocol!=='https:')location.replace('https://'+location.href.split('//')[1]);
};
httpsRedirect();// If you are on http://mydomain.com, you are redirected to https://mydomain.com
51、indexOfAll
此代碼可以返回數(shù)組中某個值對應(yīng)的所有索引值撞叨,如果不包含該值金踪,則返回一個空數(shù)組。
constindexOfAll=(arr,val)=>arr.reduce((acc,el,i)=>(el===val?[...acc,i]:acc),[]);
indexOfAll([1,2,3,1,2,3],1);// [0,3]
indexOfAll([1,2,3],4);// []
52牵敷、initial
此段代碼返回數(shù)組中除最后一個元素的所有元素
constinitial=arr=>arr.slice(0,-1);
initial([1,2,3]);// [1,2]const initial = arr => arr.slice(0, -1);
initial([1,2,3]);// [1,2]
53胡岔、insertAfter
此段代碼的功能主要是在給定的DOM節(jié)點(diǎn)后插入新的節(jié)點(diǎn)內(nèi)容
constinsertAfter=(el,htmlString)=>el.insertAdjacentHTML('afterend',htmlString);
insertAfter(document.getElementById('myId'),'<p>after</p>');// <div id="myId">...</div> <p>after</p>
54、insertBefore
此段代碼的功能主要是在給定的DOM節(jié)點(diǎn)前插入新的節(jié)點(diǎn)內(nèi)容
constinsertBefore=(el,htmlString)=>el.insertAdjacentHTML('beforebegin',htmlString);
insertBefore(document.getElementById('myId'),'<p>before</p>');// <p>before</p> <div id="myId">...</div>
55枷餐、intersection
此段代碼返回兩個數(shù)組元素之間的交集靶瘸。
constintersection=(a,b)=>{
consts=newSet(b);
returna.filter(x=>s.has(x));
};
intersection([1,2,3],[4,3,2]);// [2, 3]
56、intersectionBy
按照給定的函數(shù)處理需要對比的數(shù)組元素毛肋,然后根據(jù)處理后的數(shù)組怨咪,找出交集,最后從第一個數(shù)組中將對應(yīng)的元素輸出润匙。
constintersectionBy=(a,b,fn)=>{
consts=newSet(b.map(fn));
returna.filter(x=>s.has(fn(x)));
};
intersectionBy([2.1,1.2],[2.3,3.4],Math.floor);// [2.1]
57诗眨、intersectionBy
按照給定的函數(shù)對比兩個數(shù)組的差異,然后找出交集孕讳,最后從第一個數(shù)組中將對應(yīng)的元素輸出匠楚。
constintersectionWith=(a,b,comp)=>a.filter(x=>b.findIndex(y=>comp(x,y))!==-1);
intersectionWith([1,1.2,1.5,3,0],[1.9,3,0,3.9],(a,b)=>Math.round(a)===Math.round(b));// [1.5, 3, 0]
58巍膘、is
此段代碼用于判斷數(shù)據(jù)是否為指定的數(shù)據(jù)類型,如果是則返回true芋簿。
constis=(type,val)=>![,null].includes(val)&&val.constructor===type;
is(Array,[1]);// true
is(ArrayBuffer,newArrayBuffer());// true
is(Map,newMap());// true
is(RegExp,/./g);// true
is(Set,newSet());// true
is(WeakMap,newWeakMap());// true
is(WeakSet,newWeakSet());// true
is(String,'');// true
is(String,newString(''));// true
is(Number,1);// true
is(Number,newNumber(1));// true
is(Boolean,true);// true
is(Boolean,newBoolean(true));// true
59峡懈、isAfterDate
接收兩個日期類型的參數(shù),判斷前者的日期是否晚于后者的日期益咬。
constisAfterDate=(dateA,dateB)=>dateA>dateB;
isAfterDate(newDate(2010,10,21),newDate(2010,10,20));// true
60逮诲、isAnagram
用于檢測兩個單詞是否相似。
constisAnagram=(str1,str2)=>{
constnormalize=str=>
str
.toLowerCase()
.replace(/[^a-z0-9]/gi,'')
.split('')
.sort()
.join('');
returnnormalize(str1)===normalize(str2);
};
isAnagram('iceman','cinema');// true
61幽告、isArrayLike
此段代碼用于檢測對象是否為類數(shù)組對象,是否可迭代梅鹦。
constisArrayLike=obj=>obj!=null&&typeofobj[Symbol.iterator]==='function';
isArrayLike(document.querySelectorAll('.className'));// true
isArrayLike('abc');// true
isArrayLike(null);// false
62、isBeforeDate
接收兩個日期類型的參數(shù)冗锁,判斷前者的日期是否早于后者的日期齐唆。
constisBeforeDate=(dateA,dateB)=>dateA<dateB;
isBeforeDate(newDate(2010,10,20),newDate(2010,10,21));// true
63、isBoolean
此段代碼用于檢查參數(shù)是否為布爾類型冻河。
constisBoolean=val=>typeofval==='boolean';
isBoolean(null);// false
isBoolean(false);// true
64箍邮、getColonTimeFromDate
用于判斷程序運(yùn)行環(huán)境是否在瀏覽器,這有助于避免在node環(huán)境運(yùn)行前端模塊時出錯叨叙。
constisBrowser=()=>![typeofwindow,typeofdocument].includes('undefined');
isBrowser();// true (browser)
isBrowser();// false (Node)
65锭弊、isBrowserTabFocused
用于判斷當(dāng)前頁面是否處于活動狀態(tài)(顯示狀態(tài))。
constisBrowserTabFocused=()=>!document.hidden;
isBrowserTabFocused();// true
66擂错、isLowerCase
用于判斷當(dāng)前字符串是否都為小寫味滞。
constisLowerCase=str=>str===str.toLowerCase();
isLowerCase('abc');// true
isLowerCase('a3@$');// true
isLowerCase('Ab4');// false
67、isNil
用于判斷當(dāng)前變量的值是否為 null 或 undefined 類型钮呀。
constisNil=val=>val===undefined||val===null;
isNil(null);// true
isNil(undefined);// true
68剑鞍、isNull
用于判斷當(dāng)前變量的值是否為 null 類型。
constisNull=val=>val===null;
isNull(null);// true
69爽醋、isNumber
用于檢查當(dāng)前的值是否為數(shù)字類型蚁署。
functionisNumber(n){
return!isNaN(parseFloat(n))&&isFinite(n);
}
isNumber('1');// false
isNumber(1);// true
70、isObject
用于判斷參數(shù)的值是否是對象蚂四,這里運(yùn)用了Object 構(gòu)造函數(shù)創(chuàng)建一個對象包裝器光戈,如果是對象類型,將會原值返回遂赠。
constisObject=obj=>obj===Object(obj);
isObject([1,2,3,4]);// true
isObject([]);// true
isObject(['Hello!']);// true
isObject({a:1});// true
isObject({});// true
isObject(true);// false
71田度、isObjectLike
用于檢查參數(shù)的值是否為null以及類型是否為對象。
constisObjectLike=val=>val!==null&&typeofval==='object';
isObjectLike({});// true
isObjectLike([1,2,3]);// true
isObjectLike(x=>x);// false
isObjectLike(null);// false
72解愤、isPlainObject
此代碼段檢查參數(shù)的值是否是由Object構(gòu)造函數(shù)創(chuàng)建的對象镇饺。
constisPlainObject=val=>!!val&&typeofval==='object'&&val.constructor===Object;
isPlainObject({a:1});// true
isPlainObject(newMap());// false
73、isPromiseLike
用于檢查當(dāng)前的對象是否類似Promise函數(shù)送讲。
constisPromiseLike=obj=>
obj!==null&&
(typeofobj==='object'||typeofobj==='function')&&
typeofobj.then==='function';
isPromiseLike({
then:function(){
return'';
}
});// true
isPromiseLike(null);// false
isPromiseLike({});// false
74奸笤、isSameDate
用于判斷給定的兩個日期是否是同一天惋啃。
constisSameDate=(dateA,dateB)=>dateA.toISOString()===dateB.toISOString();
isSameDate(newDate(2010,10,20),newDate(2010,10,20));// true
75、isString
用于檢查當(dāng)前的值是否為字符串類型监右。
constisString=val=>typeofval==='string';
isString('10');// true
76边灭、isSymbol
用于判斷參數(shù)的值是否是 Symbol 類型。
constisSymbol=val=>typeofval==='symbol';
isSymbol(Symbol('x'));// true
77健盒、isUndefined
用于判斷參數(shù)的類型是否是 Undefined 類型绒瘦。
constisUndefined=val=>val===undefined;
isUndefined(undefined);// true
78、isUpperCase
用于判斷當(dāng)前字符串的字母是否都為大寫扣癣。
constisUpperCase=str=>str===str.toUpperCase();
isUpperCase('ABC');// true
isLowerCase('A3@$');// true
isLowerCase('aB4');// false
79惰帽、isValidJSON
用于判斷給定的字符串是否是 JSON 字符串。
constisValidJSON=str=>{
try{
JSON.parse(str);
returntrue;
}catch(e){
returnfalse;
}
};
isValidJSON('{"name":"Adam","age":20}');// true
isValidJSON('{"name":"Adam",age:"20"}');// false
isValidJSON(null);// true
80父虑、last
此函數(shù)功能返回數(shù)組的最后一個元素该酗。
constlast=arr=>arr[arr.length-1];
last([1,2,3]);// 3
81、matches
此函數(shù)功能用于比較兩個對象,以確定第一個對象是否包含與第二個對象相同的屬性與值。
onstmatches=(obj,source)=>
Object.keys(source).every(key=>obj.hasOwnProperty(key)&&obj[key]===source[key]);
matches({age:25,hair:'long',beard:true},{hair:'long',beard:true});// true
matches({hair:'long',beard:true},{age:25,hair:'long',beard:true});// false
82灌旧、maxDate
此代碼段查找日期數(shù)組中最大的日期進(jìn)行輸出。
constmaxDate=(...dates)=>newDate(Math.max.apply(null,...dates));
constarray=[
newDate(2017,4,13),
newDate(2018,2,12),
newDate(2016,0,10),
newDate(2016,0,9)
];
maxDate(array);// 2018-03-11T22:00:00.000Z
83爵嗅、maxN
此段代碼輸出數(shù)組中前 n 位最大的數(shù)。
constmaxN=(arr,n=1)=>[...arr].sort((a,b)=>b-a).slice(0,n);
maxN([1,2,3]);// [3]
maxN([1,2,3],2);// [3,2]
84笨蚁、minDate
此代碼段查找日期數(shù)組中最早的日期進(jìn)行輸出操骡。
constminDate=(...dates)=>newDate(Math.min.apply(null,...dates));
constarray=[
newDate(2017,4,13),
newDate(2018,2,12),
newDate(2016,0,10),
newDate(2016,0,9)
];
minDate(array);// 2016-01-08T22:00:00.000Z