JS優(yōu)化技巧

null狂秦、undefined 和空值檢查并分配默認(rèn)值

但是要反例如果在數(shù)據(jù)為0(或者空字符串的時(shí)候也要返回?cái)?shù)據(jù)),此時(shí)用||運(yùn)算符就會(huì)搞錯(cuò)了赫模,返回的是默認(rèn)值了:

// Longhand
if (test1 !== null || test1 !== undefined || test1 !== '') {
    let test2 = test1;
}
// Shorthand
let test2 = test1 || '';

//返例
let test3 = 0;
let test4 = test3 || 'no data';//'no data

注意:該方式主要用于 null 或 undefined 的檢查麻顶,特別需要注意tmp=0或者tmp=‘0’都是false。

// Longhand
if (test1 === true) or if (test1 !== "") or if (test1 !== null)
// Shorthand //it will check empty string,null and undefined too
if (test1)

//Longhand 
if (test1) {
 callMethod(); 
} 
//Shorthand 
test1 && callMethod();

綜上:
&&為取假運(yùn)算压鉴,從左到右依次判斷,如果遇到一個(gè)假值锻拘,就返回假值油吭,以后不再執(zhí)行击蹲,否則返回最后一個(gè)真值
||為取真運(yùn)算,從左到右依次判斷婉宰,如果遇到一個(gè)真值歌豺,就返回真值,以后不再執(zhí)行心包,否則返回最后一個(gè)假值

擴(kuò)展:可選鏈接運(yùn)算符
//Longhand 
if (data && data.children && data.children[0] && data.children[0].title) {
    // I have a title!
} 
//Shorthand 
//對(duì)于靜態(tài)屬性用法是object?.property世曾。對(duì)于動(dòng)態(tài)屬性object?.[expression] 
 let data;
console.log(data?.children?.[0]?.title) // undefined

data  = {children: [{title:'codercao'}]}
console.log(data?.children?.[0]?.title) // codercao
用于多個(gè)條件判斷的 && 操作符

結(jié)果僅在變量為 true 的情況下才調(diào)用函數(shù),則可以使用 && 運(yùn)算符谴咸。

比較后返回
// Longhand
let test;
function checkReturn() {
    if (!(test === undefined)) {
        return test;
    } else {
        return callMe('test');
    }
}
var data = checkReturn();
console.log(data); //output test
function callMe(val) {
    console.log(val);
}
// Shorthand
function checkReturn() {
    return test || callMe('test');
}
switch 簡(jiǎn)化
// Longhand
switch (data) {
  case 1:
    test1();
  break;
  case 2:
    test2();
  break;
  case 3:
    test();
  break;
  // And so on...
}
// Shorthand
var data = {
  1: test1,
  2: test2,
  3: test
};
data[something] && data[something]();
對(duì)象屬性賦值
let test1 = 'a'; 
let test2 = 'b';
//Longhand 
let obj = {test1: test1, test2: test2}; 
//Shorthand 
let obj = {test1, test2};
將字符串轉(zhuǎn)成數(shù)字

可以用*1(乘以1)來(lái)轉(zhuǎn)化為數(shù)字(實(shí)際上是調(diào)用.valueOf方法) 然后使用Number.isNaN來(lái)判斷是否為NaN,或者使用 a !== a 來(lái)判斷是否為NaN骗露,因?yàn)?NaN !== NaN岭佳。也可以使用+來(lái)轉(zhuǎn)化字符串為數(shù)字

//Longhand 
let test1 = parseInt('123'); 
let test2 = parseFloat('12.3'); 
//Shorthand 
//*1
'32' * 1            // 32
'ds' * 1            // NaN
null * 1            // 0
undefined * 1    // NaN
1  * { valueOf: ()=>'3' }        // 3
//使用+
+ ''                    // 0
+ 'ds'                    // NaN
+ null              // 0
+ undefined    // NaN
+ { valueOf: ()=>'3' }    // 3

解構(gòu)賦值
//longhand
const test1 = this.data.test1;
const test2 = this.data.test2;
const test2 = this.data.test3;
//shorthand
const { test1, test2, test3 } = this.data;
for…in,for…of

for…of遍歷數(shù)組和字符串
for…in遍歷對(duì)象。For…in遍歷對(duì)象包括所有繼承的屬性,所以如果只是想使用對(duì)象本身的屬性需要做一個(gè)判斷

比較大小

比較大小使用 a - b > 0的方式更好萧锉,用a > b有時(shí)候會(huì)出現(xiàn)錯(cuò)誤

錯(cuò)誤用法
'20' > '100'  // true

預(yù)期結(jié)果
'20' - '100' > 0   // false

//數(shù)組排序算法
arr.sort((a, b ) =>{
  return a-b 
})
取整與判斷奇偶數(shù)
1.3 | 0         // 1
-1.9 | 0        // -1

const num=3;
!!(num & 1)                    // true
!!(num % 2)                    // true
精確到指定位數(shù)的小數(shù)

將數(shù)字四舍五入到指定的小數(shù)位數(shù)珊随。使用 Math.round() 和模板字面量將數(shù)字四舍五入為指定的小數(shù)位數(shù)。省略第二個(gè)參數(shù) decimals 柿隙,數(shù)字將被四舍五入到一個(gè)整數(shù)叶洞。

const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`)
round(1.345, 2)                 // 1.35   Number(1.345e2e-2)
round(1.345, 1)                 // 1.3

// 此處e2表示乘以10的2次方 
1.23e1   //12.3
1.23e2   // 123
123.45e-2  // 1.2345
數(shù)組的對(duì)象解構(gòu)
const csvFileLine = '1997,John Doe,US,john@doe.com,New York';
const { 2: country, 4: state } = csvFileLine.split(',');
 
country            // US
state            // New Yourk
對(duì)象數(shù)組按照某個(gè)屬性查詢最大值
var array=[
        {
            "index_id": 119,
            "area_id": "18335623",
            "name": "滿意度",
            "value": "100"
        },
        {
            "index_id": 119,
            "area_id": "18335624",
            "name": "滿意度",
            "value": "20"
        },
        {
            "index_id": 119,
            "area_id": "18335625",
            "name": "滿意度",
            "value": "80"
        }];

Math.max.apply(Math, array.map(function(o) {return o.value}))
使用解構(gòu)刪除對(duì)象某個(gè)屬性
let {_internal, tooBig, ...cleanObject} = {el1: '1', _internal:"secret", tooBig:{}, el2: '2', el3: '3'};
 
console.log(cleanObject);    // {el1: '1', el2: '2', el3: '3'}
使用Object.assign設(shè)置默認(rèn)對(duì)象
const someObject = {
    title: null,
    subTitle: "Subtitle",
    buttonColor: null,
    disabled: true
 };
 function creteOption(someObject) {
    const newObject = Object.assign({
      title: "Default Title",
      subTitle: "Default Subtitle",
      buttonColor: "blue",
      disabled: true
    },someObject)
    return newObject
 }
 console.log(creteOption(someObject));//{title: 'Default Title', subTitle: 'Subtitle', buttonColor: 'blue', disabled: true}
對(duì)象計(jì)算屬性

在微信小程序還是React中,我們需要根據(jù)某個(gè)條件去修改某個(gè)數(shù)據(jù)

if (type === 'boy') {
  this.setData({
    boyName: name
  })
} else if (type === 'girl') {
  this.setData({
    girlName: name
  })
}

this.setData({
  [`${type}Name`]: name
})
深拷貝

leader:深拷貝有這5個(gè)段位禀崖,你只是青銅段位衩辟?還想漲薪?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末波附,一起剝皮案震驚了整個(gè)濱河市艺晴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掸屡,老刑警劉巖封寞,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異仅财,居然都是意外死亡狈究,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門盏求,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抖锥,“玉大人,你說(shuō)我怎么就攤上這事风喇∧模” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵魂莫,是天一觀的道長(zhǎng)还蹲。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么谜喊? 我笑而不...
    開(kāi)封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任潭兽,我火速辦了婚禮,結(jié)果婚禮上斗遏,老公的妹妹穿的比我還像新娘山卦。我一直安慰自己,他們只是感情好诵次,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布账蓉。 她就那樣靜靜地躺著,像睡著了一般逾一。 火紅的嫁衣襯著肌膚如雪铸本。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天遵堵,我揣著相機(jī)與錄音箱玷,去河邊找鬼。 笑死陌宿,一個(gè)胖子當(dāng)著我的面吹牛锡足,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壳坪,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼舶得,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了爽蝴?” 一聲冷哼從身側(cè)響起扩灯,我...
    開(kāi)封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霜瘪,沒(méi)想到半個(gè)月后珠插,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颖对,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年捻撑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缤底。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顾患,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出个唧,到底是詐尸還是另有隱情江解,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布徙歼,位于F島的核電站犁河,受9級(jí)特大地震影響鳖枕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桨螺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一宾符、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灭翔,春花似錦魏烫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至煌张,卻和暖如春读处,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唱矛。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留井辜,地道東北人绎谦。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像粥脚,于是被迫代替她去往敵國(guó)和親窃肠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容