善于利用JS中的小知識的利用,可以很簡潔的編寫代碼
1. 使用!!模擬Boolean()函數(shù)
原理:邏輯非操作一個數(shù)據(jù)對象時袁滥,會先將數(shù)據(jù)對象轉換為布爾值菱父,然后取反,兩個!!重復取反除师,就實現(xiàn)了轉換為布爾值的效果。
2. 使用一元加(+)模擬Number()函數(shù)
原理:對非數(shù)值類型的數(shù)據(jù)使用一元加(+)扔枫,會起到與Number()函數(shù)相同的效果汛聚。
- null轉換為0
- undefined轉換為NaN
- false轉換為0,true轉換為1
- 對于字符串:
- 空字串轉換為0
- 含有數(shù)字或者浮點數(shù)或者十六進制格式的數(shù)據(jù)(11, 0.3, 0xfe等)短荐,轉換為相應的數(shù)值
- 含有其他格式字符倚舀,無法轉換為數(shù)值的字符串,轉換為NaN
- 對于對象忍宋,先調(diào)用
valueOf()
方法痕貌,在轉換,若結果為NaN糠排,那么再調(diào)用toString()
方法舵稠,之后再轉換
3. 使用邏輯與(&&)進行短路操作
if(connected){
login();
}
以上代碼可以簡化為
connected && login()
也可以用這種方法來檢查對象中是否存在某個屬性
user && user.login
原理:邏輯與(&&)會首先對第一個操作數(shù)進行求值,只有求值結果為true時才會對第二個操作數(shù)求值入宦。connected && login()
中哺徊,若判斷connected不為true,則不再進行下一步操作。
所謂的短路操作即第一個操作數(shù)可以決定結果乾闰,則不再對第二個操作數(shù)進行求值落追。
4. 使用邏輯或(||)設置默認值
邏輯或(||)也屬于短路操作,即當?shù)谝粋€操作數(shù)可以決定結果時汹忠,不再對第二個操作數(shù)進行求值淋硝。
利用這個特點,我們可以給賦值語句設置默認值宽菜。只有當?shù)谝粋€操作數(shù)為null或者undefined時,才會把第二個操作數(shù)賦值給目標竿报。
function User(name, age){
this.name = name || "Liming";
}
上述代碼中铅乡,如果函數(shù)中沒有傳入name參數(shù),name的值為undefined烈菌,那么就會給this.name
賦值為"Liming"阵幸。
ES6中可以為函數(shù)設置默認值花履,所以這個無需在函數(shù)中使用,但是其他地方還是很有用的挚赊。
5. 獲取數(shù)組最后n個元素
可以使用以下代碼獲取數(shù)組中最后n個元素
var array = [1, 2, 3, 4, 5, 6];
console.log(array.slice(-1)); //[6]
console.log(array.slice(-2)); //[5, 6]
原理:Array.prototype.slice(begin,end)
可以用來裁剪數(shù)組诡壁,第二個參數(shù)的默認值是數(shù)組的長度值。若值傳入一個參數(shù)荠割,則會返回從指定索引開始到數(shù)組結尾的所有值妹卿。
而slice()方法還可以接收負值,當傳入負值時蔑鹦,會自動加上數(shù)組的長度值使其轉換為正值夺克,于是便得到了最后的n個值。
6. 合并大數(shù)組
常用的合并數(shù)組的方式是使用Array.concat()
函數(shù)嚎朽。該函數(shù)會創(chuàng)建一個新數(shù)組铺纽,將兩個數(shù)組連接起來存儲到新數(shù)組中,這會大量消耗內(nèi)存哟忍〗泼牛可以使用Array.push.apply(arr1, arr2),它不會創(chuàng)建新數(shù)組锅很,而是將第二個數(shù)組合并到第一個數(shù)組中其馏,以減少內(nèi)存的消耗。
var a = [1,2];
var b = [3,4];
console.log(a.push.apply(a, b)); // [1,2,3,4]
//或者
console.log(Array.prototype.push.apply(a, b)); // [1,2,3,4]
原理: Array.push()是在數(shù)組的末尾增加元素粗蔚,但是如果使用a.push(b)
會把整個數(shù)組b當作一個元素添加到數(shù)組a中尝偎。
而apply()方法,則允許將某個方法的參數(shù)以數(shù)組的形式傳入鹏控,所以起到了將數(shù)組b中的元素追加到數(shù)組a中的效果致扯。
7. NodeList轉換為數(shù)組
使用document.querySelectorAll('div')
返回的是NodeList對象,雖然它很像數(shù)組当辐,但是并不能使用諸如sort()抖僵,filter()等方法。你可以將其轉換為真正的數(shù)組缘揪。
var eles = document.querySelectorAll('p'); //NodeList
var arrayElements = [].slice.call(eles); //轉化為數(shù)組
// 或者
var arrayElements = Array.prototype.slice.call(eles);
// 或者
var arrayElements = Array.from(eles);
原理:
- [].slice.call(eles):
首先創(chuàng)建了一個空數(shù)組[]耍群,然后調(diào)用他的slice()
方法,但是在slice()方法的執(zhí)行中找筝,把this
對象指向了eles,所以會對eles進行裁減蹈垢,由于對slice()方法沒有傳入?yún)?shù),所以相當于slice(0,eles.length),會按照元長度返回一個數(shù)組袖裕。 - Array.prototype.slice.call(eles):
原理與上面相似曹抬,只不過這次沒有創(chuàng)建空數(shù)組,而是直接使用了原型中的方法 - Array.from()
Array.from()接受一個類數(shù)組對象或者可迭代對象急鳄,基于該對象創(chuàng)建一個新的Array實例谤民。