今天在寫代碼時用到了一個if else的一個判斷,突然想到了原來遇見的一個面試題目:
- 現(xiàn)有一數(shù)組 a,長度未知,數(shù)組每一項的數(shù)據(jù)類型約定為 Number,請用 JavaScript 實現(xiàn)以下邏輯:
如果 a 的長度為零,則為其添加一個新項,值為 1。
如果 a 的長度不為零,則按照 先進(jìn)先出 的原則,移除一項。
評分標(biāo)準(zhǔn):代碼越精簡越好,<=30 字符 10 分,<=35 字符 6 分, >35 字符 3 分(空格不算)
a[a.length?'shift':'push'](1);
一開始看到這道題目的時候完全無法理解這個寫法是什么,后來翻看文檔了解了為啥能這么寫。
首先我們要先理解一個東西:數(shù)組,大家在學(xué)習(xí)數(shù)組的時候,很可能忽視這么樣一種寫法
Paste_Image.png
是的,數(shù)組是一個對象,
obj.['name'] == obj.name
,這兩種寫法其實是一個意思,同時里面使用了?這個三元運算符表達(dá)式 :(expr1) ? (expr2) : (expr3)
在 expr1 求值為 TRUE 時的值為 expr2,在 expr1 求值為 FALSE 時的值為 expr3。
我們再來看面試題:
如果a存在不為空:a['shift'](1)
即a.shift(1)
如果a不存在:a['push'](1)
即a.push(1)
理解了這個面試題,那么今天我寫的代碼就能進(jìn)行優(yōu)化啦,我寫了個類似于百度地圖懸浮工具欄的模塊,其中封裝了一個鼠標(biāo)事件的構(gòu)造函數(shù):
Paste_Image.png
當(dāng)鼠標(biāo)點擊選擇菜單區(qū)域時,下端div自動切換,是不是很簡單?我之前是這么寫的,其中的if else語句用來判斷div是否隱藏,隱藏了就點擊顯示,沒隱藏就點擊隱藏,同時進(jìn)行切換。
var listDisplay=function(p){
this.p=p;
this.start();
};
listDisplay.prototype={
start:function(){
var _this = this;
$(this.p).on('click', 'li', function(e){
var $target = $(e.target);
$div = $(_this.p).children('div').eq($target.index());
//注意這里的邏輯
if($div.hasClass('active')) {
_this.classDel($div);
}
else{
_this.classAdd($div);
}
});
},
classAdd:function(node){
$(this.p).children('div').removeClass('active');
node.addClass('active');
},
classDel:function(node){
node.removeClass('active');
}
};
new listDisplay($('.wrap_list')[0]);
那有沒有寫的簡約點,也就是B格高點的寫法呢,把if else換成三元運算符?的寫法試試,成功!
$div.hasClass('active')?_this.classDel($div):_this.classAdd($div);
裝B就要徹底點,還有沒有更簡單的寫法?下面這個就是融合了數(shù)組和?的方式組合成的,是不是要比if else高大上多了,哈哈哈!
_this[$div.hasClass('active')?'classDel':'classAdd']($div);