1、 !(!!)和~符號的使用
//傳統(tǒng)方式
let str = 'javascript'
if(str.indexOf('java')>-1){
//執(zhí)行代碼
}
//簡寫方式
if(!!~str.indexOf('java')){
//執(zhí)行代碼 (注意此方式在數(shù)據(jù)量大的情況下有性能問題)
}
說明:!!一般用來將后面的表達式強制轉換為布爾類型的數(shù)據(jù)(boolean)耘眨,也就是只能是true或者false写烤;
js中在變量名前加"~" 是位運算NOT,按位取反母剥。
2丰包、||禁熏、&& 短路運算符
//舉例1:
let flag = true
function test(){
//執(zhí)行代碼
}
if(flag){
test()
}
//簡寫
flag && test()
//舉例2
let a=100,b;
if(a>50){
b=100
}else{
b=5
}
等價于: b = a > 50 && 100 || 5
//可以把 && 看做是找假運算。找到假邑彪,直接停止瞧毙,將假返回;找到真寄症,則會繼續(xù)找宙彪,直到找到假才停止,并將假返回有巧。如果都為真释漆,則返回最后一個真。
//可以把 || 看做是找真運算篮迎。找到真男图,直接停止,將真返回甜橱;找到假逊笆,則會繼續(xù)找,直到找到真才停止岂傲,并將真返回难裆。如果都為假,則返回最后一個假镊掖。
3乃戈、map,object代替if else
const status= 0
const statusText = 0
// 0 已下單 ,未支付 , 1已支付, 2已發(fā)貨, 3已完成
if (statusCode === 0) {
statusText = '已下單,未支付'
} else if (statusCode === 1) {
statusText = '已支付'
} else if (statusCode === 2) {
statusText = '已發(fā)貨'
}else if (statusCode === 3) {
statusText = '已完成'
}
//更好的寫法
const statusMap = new Map([
[0, '已下單,未支付'],
[1, '已支付'],
[2, '已發(fā)貨'],
[3, '已完成'],
])
statusText = statusMap.get(status)
4亩进、高階函數(shù)
高階函數(shù)就是一個將函數(shù)作為參數(shù)或者返回值的函數(shù)症虑。js內置的函數(shù)reduce,map,filter就是高階函數(shù)
const arr = [{
userName: '張三',
sex: '男',
code: 100
},
{
userName: '張三',
sex: '女',
code: 80
},
{
userName: '張三',
sex: '女',
code: 92
},
{
userName: '李四',
sex: '男',
code: 95
}//還有其他數(shù)據(jù)...
]
// 要求找到數(shù)據(jù)中姓名張三
const findPeople = name => o => o.userName === name
arr.filter(findPeople('張三'))
使用高階函數(shù)可以讓代碼復用性更好,也便于維護归薛。配合es6的語法谍憔,可以讓函數(shù)變得更簡潔(當然寫不好的化也變得難于閱讀)驶冒。
5、合并數(shù)據(jù)
let arr1 = [1,2,3],arr2=[4,5,6]
如何得到[1,2,3,4,5,6]數(shù)組韵卤?
//方法1:arr1.concat(arr2)
//方法2:[...arr1,...arr2]
//方法3:arr1.push(...arr2), 此方式修改了arr1的長度,等價于:arr1.push.apply(arr1,arr2)
6崇猫、可選鏈操作符
可選鏈操作符( ?. )允許讀取位于連接對象鏈深處的屬性的值沈条,而不必明確驗證鏈中的每個引用是否有效。?. 操作符的功能類似于 . 鏈式操作符诅炉,不同之處在于蜡歹,在引用為空(nullish ) (null 或者 undefined) 的情況下不會引起錯誤,該表達式短路返回值是 undefined涕烧。與函數(shù)調用一起使用時月而,如果給定的函數(shù)不存在,則返回 undefined议纯。
let obj = {
data: {
name: "張三",
},
};
// 如果我們想取obj里data里的name字段父款,要對obj和data等字段做判空處理,不然代碼就會報錯
原始方法:const name = obj && obj.data && obj.data.name
改進:const name = obj?.data?.name;
7瞻凤、空值合并操作符
空值合并操作符(??)是一個邏輯操作符憨攒,當左側的操作數(shù)為 null 或者 undefined 時,返回其右側操作數(shù)阀参,否則返回左側操作數(shù)肝集。
//在處理輸入框相關業(yè)務時,往往會判斷輸入框未輸入值的場景蛛壳。
if(value !== null && value !== undefined && value !== ''){
//...
}
//使用空值合并操作符杏瞻,如下
if((value??'') !== ''){
//...
}
注意與 || 的區(qū)別。由于 || 是一個布爾邏輯運算符衙荐,左側的操作數(shù)會被強制轉換成布爾值用于求值捞挥。任何假值(0, ''赫模, NaN树肃, null, undefined)都不會被返回瀑罗。這導致如果你使用0胸嘴,''或NaN作為有效值,就會出現(xiàn)不可預料的后果斩祭。