JavaScript奇淫技巧(一)
阿新 • • 發佈:2019-01-09
if-else簡化寫法
- 程式碼中若出現多層if-else巢狀,程式碼就會顯得臃腫不堪,這時可採用替代方案來濃縮程式碼。
- 常規寫法:(臃腫不堪)
if(){
if(){
//……
}
else{
//……
}
}
else{
//……
}
- 簡化寫法:(一行搞定)
(a) && (b) || (c);
上述表示式含義:若條件a為true則執行表示式b,否則執行表示式c。
原本多行的if-else語句一行就可以搞定。
此外,該句式支援多層巢狀,從而可以實現複雜的條件判斷。
- 缺點:這種方式將原本多行的if-else濃縮成一行,可讀性大大降低,因此在實際開發中要慎用。雖然逼格很高,很像是大神寫的程式碼,但過一陣子也許你自己都很難讀懂。因此,面對高逼格和可讀性時你要慎重選擇。
清空陣列的快速做法
- 常規方法:
var array = [1,2,3,4,5];
array = [];
通常我們採用上述辦法,但這種方法有嚴重缺陷!它實際上並沒有清空原本的陣列物件!
它建立了一個新的、空的陣列物件[],然後將它賦給原本的**陣列變數**array,因此原本非空的陣列物件並沒有清空,而是等待垃圾回收機制處理。
此外,這種方式用在函式中會有風險,示例:
var array = [1,2,3,4,5];
//清空函式方法1
function clearArray1(array){
array = [];
return array ;
}
//清空函式方法2
function clearArray2(array){
array = [];
}
array = clearArray1(array);//array為[]
clearArray2(array);//array仍為[1,2,3,4,5]
上述示例定義了兩種清空陣列的方法,他們都採用給陣列賦上[]的方式,clearArray1成功清空陣列,而clearArray2卻不行。
- 冷門方法:
為了避免上述方法的種種弊端,可以使用以下方式來清空陣列:
array.splice(0,array.length);
本方法藉助JS提供的splice函式,刪除本陣列的所有元素。由於splice函式是對陣列物件本身進行操作,從而不會出現上述問題。
- 快速方法:
清空陣列最簡單明瞭的方式如下:
array.length;
一句話搞定!
由於陣列的length屬性是一個可讀寫的值,JS就是通過它來判斷當前陣列的長度,因此我們完全可以使用它決定當前陣列的長度。
一句話描述“閉包”
閉包:當一個函式作為引數傳給另一個函式,或作為外層函式的返回值,只要內層函式沒有結束,外層函式就不會被銷燬,內層函式可以獲取外層函式的任意屬性。
i++和++i作為函式引數的區別?
function func(i){
alert(i);
}
var i=1;
func(i++);//1
func(++i);//3
這個問題很常規。
i++會先執行後續操作,再進行+1操作,因此函式內部得到的是1;
++i會先+1,再執行後續操作,因此函式得到的是+1後的結果。
JQuery物件與JS DOM物件相互轉化
- JQuery——>DOM物件
//現有一個JQuery物件:
$("#id");
//轉化成DOM物件
$("#id")[0]
PS:$(“xxx”)返回結果一定是一個數組,即使是根據ID來取。
- DOM物件——>JQuery物件
//現有一個DOM物件:
var dom = document.getElementById("id");
//轉化成JQuery物件
$(dom)
判斷陣列中是否存在某物件
- JS原生indexOf
var array = [obj1, obj2];
array.indexOf(obj1);//若存在返回下標,不存在返回-1
這種方法用的最常用,但某些IE不相容。
- JQuery inArray
$.inArray(value, array)//若存在返回下標,不存在返回-1
- 自己寫一個
if (!Array.indexOf) {
Array.prototype.indexOf = function (obj) {
for (var i = 0; i < this.length; i++) {
if (this[i] == obj) {
return i;
}
}
return -1;
}
}
初始化二維陣列
二維陣列本質上是一個元素為一維陣列的一維陣列,因此你首先需要初始化一個一維陣列:
var array = [];
再給這一維陣列新增一維陣列作為元素:
for(var i=0; i<10; i++){
array.push([]);
}
JS除法會有小數部分
JS除法和Java不同,兩個整數相除會有小數部分,如果只需整數,則需呼叫相關函式取整。
//向下取整
parseInt(5/2)
Math.floor(5/2)
//向上取整,有小數就整數部分加1
Math.ceil(5/2)
//四捨五入.
Math.round(5/2)