評(píng)價(jià)一段代碼的好壞,往往是看代碼的幾個(gè)點(diǎn):1、簡潔易讀怀跛,優(yōu)雅的代碼距贷,讀起來賞心悅目,更易于讓人理解吻谋。2忠蝗、執(zhí)行效率,高效的執(zhí)行速度漓拾,讓代碼的性能更省時(shí)間什湘,省內(nèi)存。3晦攒、注釋闽撤,每個(gè)人的思維模式都不同,如果適當(dāng)加一些注釋脯颜,可以使你的代碼及編程思維哟旗,更容易讓人接受。
通過一些工作積累栋操,我在項(xiàng)目開發(fā)中闸餐,也意識(shí)到寫代碼,不是做完就了事矾芙,還要重新閱讀自己寫的代碼舍沙,并且考慮是否可以進(jìn)行優(yōu)化,這樣剔宪,才是健壯的代碼拂铡。如果普通的一些用法及語法,這里不再多說葱绒,現(xiàn)只把一些工作中逼格比較高的實(shí)用經(jīng)驗(yàn)分享出來感帅,感興趣的同學(xué),可以一觀地淀。讓我們來見識(shí)到JS強(qiáng)大的表現(xiàn)力吧失球!
操作符的妙用
利用按位與“&”判斷奇偶數(shù)
按位與運(yùn)算的邏輯是這樣: 0001 & 0011 = 0001,也就是兩個(gè)位都是1帮毁,才是1实苞,其它位都是0。
我們經(jīng)常要做一個(gè)條件烈疚,判斷一個(gè)數(shù)的奇偶性黔牵,會(huì)這樣寫:
function fn(n) {
if(n % 2 === 1) {
//奇數(shù)
} else {
//偶數(shù)
}
}
利用按位與運(yùn)算,則可以簡寫為這樣:
function fn(n) {
if(n & 1) {
//奇數(shù)
} else {
//偶數(shù)
}
}
利用按位或“|”取整
按位或運(yùn)算的邏輯是這樣: 0001 | 0011 = 0011胞得,也就是兩個(gè)位都是0荧止,才是0屹电,其它位都1。
0 | 0 //0
0 | 1 //1
1 | 0 //1
1 | 1 //1
3 | 5 //7 即 0000 0011 | 0000 0101 = 0000 0111 因此跃巡,3|5的值得7
按位或|
有一個(gè)作用危号,通過搭配0進(jìn)行運(yùn)算可以用來實(shí)現(xiàn)數(shù)字取整。
1.1 | 0 //1
-2.0 | 0 //-2
//非數(shù)字素邪,則根據(jù)值強(qiáng)轉(zhuǎn)為 0 或者 1 再取整外莲,不過這種沒啥意義
null | 0 //0
true | 0 //1
Tips: 其實(shí)浮點(diǎn)數(shù)是不支持位運(yùn)算的,所以會(huì)先把1.1轉(zhuǎn)成整數(shù)1再進(jìn)行位運(yùn)算兔朦,就好像是對(duì)浮點(diǎn)數(shù)向下求整偷线。所以 1 | 0 的結(jié)果就是1。
還有一個(gè)就是在設(shè)計(jì)vue組件的時(shí)候沽甥,也常用到的地方如下:(具體為啥這么用声邦,我也說不清楚,沒研究過原理摆舟,知道的同學(xué)可以告訴我)亥曹。
export default {
//... 其它參數(shù)
props {
params: Object | Array //只要其中任意一個(gè)滿足條件即可
}
}
利用按位非“~”簡化表達(dá)式
普及一下~
運(yùn)算符,這個(gè)符號(hào)學(xué)名叫“按位非”恨诱,它是一個(gè)一元運(yùn)算符媳瞪。按位非操作符由一個(gè)波浪線(~)表示,按位非就是求二進(jìn)制的反碼照宝。不管什么值使用了這個(gè)運(yùn)算符蛇受,結(jié)果總是一個(gè)數(shù)字。按位非運(yùn)算符厕鹃,簡單的理解就是改變運(yùn)算數(shù)的符號(hào)并減去1兢仰。
~5 //-6
~0 //-1
~-2 //1
~true //-2 這里true被強(qiáng)轉(zhuǎn)為1
~null //-1 這里null被強(qiáng)轉(zhuǎn)為0
~undefined //-1 這里undefined被強(qiáng)轉(zhuǎn)為0
利用這個(gè)原理,我們可以在實(shí)際工作中這樣應(yīng)用:
var str = 'hello world!'
if(str.indexOf('w') != -1) { /*...*/ }
//或者
if(str.indexOf('w') > -1) { /*...*/ }
//根據(jù)str.indexOf('w')的值熊响,無外乎兩種情況: -1, 0及正整數(shù)旨别,
//則,從-1到正整數(shù)中汗茄,經(jīng)過按位運(yùn)算~之后,則為:0或者任意負(fù)數(shù)铭若,
//實(shí)際表示為:false與true
//上面的條件語句洪碳,可以改為:
if(~str.indexOf('w')) { /*...*/ }
Tips: 按位運(yùn)算,簡單的地方叼屠,可以使用瞳腌。但一些比較復(fù)雜的、難理解的镜雨,我覺得應(yīng)該盡量少用嫂侍,因?yàn)闀?huì)給閱讀者帶來困難,也會(huì)給自己帶來麻煩。
左移<<求2的n次方
//二進(jìn)制運(yùn)算:
01 << 2 //0100挑宠,十進(jìn)制為4
//實(shí)際運(yùn)用可以這樣:
1 << 2 //4 即2的平方
1 << 3 //8 即2的立方
1 << 4 //16 即2的4次方
無符號(hào)右移>>>判斷數(shù)的正負(fù)
正數(shù)的無符號(hào)右移與有符號(hào)右移結(jié)果是一樣的菲盾。負(fù)數(shù)的無符號(hào)右移會(huì)把符號(hào)位也一起移動(dòng),而且無符號(hào)右移會(huì)把負(fù)數(shù)的二進(jìn)制碼當(dāng)成正數(shù)的二進(jìn)制碼各淀。即:
1 >>> 0 //1
2 >>> 0 //2
4 >>> 0 //4
4 >>> 1 //2
4 >>> 2 //1
-4 >>> 0 //4294967292
-4 >>> 1 //2147483646
-2 >>> 0 //4294967294
-1 >>> 0 //4294967295
觀察上面的例子懒鉴,我們得出一個(gè)結(jié)論,正數(shù)右移0位碎浇,值不變临谱,而負(fù)數(shù)右移0位,值已經(jīng)變化了奴璃。即可以通過這種關(guān)系判斷一個(gè)數(shù)的正負(fù):
function isPos(n) {
return n === n >>> 0
}
isPos(-1) //false
isPos(1) //true
利用&&連結(jié)條件與表達(dá)式
通常悉默,我們?yōu)榱私o一個(gè)變量賦值,正常的邏輯是:if
語句判斷苟穆,通過if邏輯控制語句麦牺,則賦值成功。利用&&
符號(hào)鞭缭,則可以直接在前面寫上條件語句剖膳,后面寫上執(zhí)行語句。
var a;
if(true) {
a = 10
}
//也可以寫成
var a;
true && (a = 10);
//或者
var a = true && 10; //這種情況盡量不要使用岭辣,因?yàn)槿绻麠l件不成立吱晒,則會(huì)給a賦上一個(gè)false值。
//常見使用:
function fn(obj) {
obj && (return true);
return false;
}
var a = b = c = true, d;
a && b && c && (d = 10);
console.log(d) //10
Tips: 對(duì)于&&沦童,需要注意以下幾點(diǎn):
- 對(duì)于布爾值仑濒,邏輯與是非常簡單的,只要有一個(gè)false偷遗,就返回false墩瞳;
- 對(duì)于不是布爾值的情況則:
如果第一個(gè)操作數(shù)是對(duì)象,則返回第二個(gè)數(shù)
如果第二個(gè)操作數(shù)是對(duì)象氏豌,則只有在第一個(gè)操作數(shù)的求值結(jié)果為true的情況下才會(huì)返回該對(duì)象喉酌;
如果第兩個(gè)操作數(shù)都是對(duì)象,則返回第二個(gè)數(shù)操作數(shù)
如果有一個(gè)操作數(shù)是null泵喘,則返回null
如果有一個(gè)操作數(shù)是NaN泪电,則返回第NaN
如果第一個(gè)操作數(shù)是undefined,則返回undefined
利用||取值(設(shè)置默認(rèn)值)
通常纪铺,我們聲明一個(gè)變量相速,可能要根據(jù)條件進(jìn)行賦值。正常的邏輯是:if ... else if ... else
或者使用switch
這兩種語句塊鲜锚。
var a, b;
if(b === 0) {
a = 1
} else if(b === 1) {
a = 2
} else {
a = 3
}
//或者
var a, b = 1;
switch(b) {
case 0:
a = 1;
break;
case 1:
a = 2;
break;
default:
a = 3;
break;
}
如果直接使用||
或運(yùn)算符突诬,則按從左到右苫拍,取第一個(gè)非空的一個(gè)值,否則直接使用false作為值使用旺隙。
var b = 4;
var a = (b === 0 && 1) || (b === 1 && 2) || 3; // 3
//常用到的或運(yùn)算取值方式一般是在函數(shù)里面绒极。
function doSomething(obj) {
var o = obj || {} //如果obj不存在,則使用默認(rèn)值
var oo;
o && (oo = obj || {}) //結(jié)合與運(yùn)算催束,作變判斷的前置條件
}
Tips: 關(guān)于||集峦,需要注意以下幾點(diǎn):
- 對(duì)于布爾值,邏輯或是非常簡單的抠刺,只要有一個(gè)true塔淤,就返回true;
- 對(duì)于不是布爾值的情況則:
如果第一個(gè)操作數(shù)是對(duì)象速妖,則返第一個(gè)操作數(shù)
如果第一個(gè)操作數(shù)的求值結(jié)果為false高蜂,則返回第二個(gè)操作數(shù)
如果兩個(gè)操作數(shù)都是對(duì)象,則返回第一個(gè)操作數(shù)
如果兩個(gè)操作數(shù)是null罕容,則返回null
如果兩個(gè)操作數(shù)是NaN备恤,則返回NaN
如果兩個(gè)操作數(shù)是undefined,則返回undefined
利用~~取整
如果要將一個(gè)小數(shù)取整數(shù)部分锦秒,正常的邏輯是:parseInt()
強(qiáng)轉(zhuǎn)為整數(shù)方法露泊,或者Math.floor()
向下取整。其實(shí)旅择,使用~~
操作符可以更快速的取整惭笑。
parseInt(12.55) //12
Math.floor(12.55) //12
~~12.55 //12
其實(shí),除了取整的作用生真,它還可以達(dá)到強(qiáng)轉(zhuǎn)數(shù)字的作用沉噩,比如:
~~true //1
~~false //0
~~[] //0
~~{} //0
~~undefined //0
~~!undefined //1
~~null //0
~~!null //1
Tips: 雖然~~用起來比較騷氣,但是為了可讀性柱蟀,本人還是建議使用Math.floor()更為穩(wěn)妥川蒙,誰知道領(lǐng)導(dǎo)review代碼的時(shí)候,會(huì)不會(huì)說你過于裝逼长已,要被噴死畜眨。
利用+將字符串轉(zhuǎn)為數(shù)字
如果要將一個(gè)表現(xiàn)字符串的數(shù)字轉(zhuǎn)化為真正的數(shù)字,正常邏輯是:Number()
或者parseInt()痰哨、parseFloat()
實(shí)現(xiàn)轉(zhuǎn)化胶果。實(shí)際上,我們還可以更簡捷斤斧,只需要在前面添加一個(gè)+
就可以了。當(dāng)然霎烙,你也可以用-
來實(shí)現(xiàn)撬讽,只不過蕊连,這樣子,則值就成了負(fù)數(shù)游昼。
Number('123') //123
parseInt('123') //123
parseFloat('123') //123
parseFloat('123.0') //123
parseFloat('123.0') //123
parseFloat('123.1') //123.1
//只要使用+甘苍,則可以實(shí)現(xiàn)數(shù)字的轉(zhuǎn)化
+'123' //123
+'12.22' //12
-'12.1' //-12.1
//如果要取整并且轉(zhuǎn)數(shù)字的話,使用~~
~~'123.33' //123
實(shí)際上烘豌,+
也適用于Date對(duì)象载庭。
var date = new Date //Fri Oct 27 2017 14:38:49 GMT+0800 (中國標(biāo)準(zhǔn)時(shí)間)
date.getTime() //1509086332914
//使用+直接輸出時(shí)間綴
+new Date //1509086332914
利用!邏輯非強(qiáng)轉(zhuǎn)布爾值
邏輯非會(huì)將所有值,轉(zhuǎn)為布爾值:
!{} //false 一個(gè)空對(duì)象廊佩,實(shí)際上是一個(gè)引用囚聚,屬于存在的引用地址值
![] //false 存在引用地址值
!'' //true
!0 //true
!'hello' //false
!null //true
!NaN //true
!undefined //true
利用邏輯非運(yùn)算符,可以省去一些多余的判斷标锄。比如經(jīng)常要判斷一個(gè)值非空:
var a, b;
if(a !== undefined && a !== null && a !== '' && a !== {} && a!== 0 && a!== undefined) {
b = true;
}
實(shí)際上顽铸,如果像這面這種判斷,只需要一個(gè)邏輯非料皇。
var a, b;
!a && (b = true);
利用!!實(shí)現(xiàn)變量檢測
如果要將一個(gè)值強(qiáng)轉(zhuǎn)為布爾類型谓松,正常的邏輯是:Boolean()
強(qiáng)轉(zhuǎn)為布爾值。
Boolean(123) //true
Boolean('hello') //true
Boolean('false') //true
Boolean(null) //false
Boolean(undefined) //false
Boolean('undefined') //true
然而践剂,通過!!
兩個(gè)非邏輯符鬼譬,則可以將一個(gè)值強(qiáng)轉(zhuǎn)為布爾值。
!!123 //true
!!'hello' //true
!!'false' //true
!!null //false
!!undefined //false
!!0 //false 注意逊脯,0也會(huì)轉(zhuǎn)為false优质,在數(shù)字中,只有0會(huì)轉(zhuǎn)為false男窟,其它非0值盆赤,都會(huì)轉(zhuǎn)為true
!!'' //false
!!NaN //false
Tips: 任意的javascript的值都可以轉(zhuǎn)換成布爾值。這些值會(huì)被轉(zhuǎn)換成false:undefined,null,0,-0,NaN,""歉眷,而其它都變強(qiáng)轉(zhuǎn)為true牺六。通常,利用
!!
符號(hào)來檢測一個(gè)變量是否存在汗捡。
表達(dá)式的妙用
自執(zhí)行函數(shù)
函數(shù)淑际,只是聲明,并不能直接執(zhí)行扇住,需要調(diào)用才會(huì)執(zhí)行春缕。而如果,變成了表達(dá)式艘蹋,則會(huì)自動(dòng)執(zhí)行锄贼。自執(zhí)行函數(shù),則是利用了表達(dá)式的這種特性女阀。那些匿名函數(shù)附近使用括號(hào)或一些一元運(yùn)算符來引導(dǎo)解析器宅荤,指明運(yùn)算符附近是一個(gè)表達(dá)式屑迂。
按照這個(gè)理解,可以舉出五類冯键,超過十幾種的讓匿名函數(shù)表達(dá)式立即調(diào)用的寫法:
( function() {}() );
( function() {} )();
[ function() {}() ];
~ function() {}();
! function() {}();
+ function() {}();
- function() {}();
delete function() {}();
typeof function() {}();
void function() {}();
new function() {}();
new function() {};
var f = function() {}();
1, function() {}();
1 ^ function() {}();
1 > function() {}();
Tips:另外值得再次注意的是惹盼,括號(hào)的含混使用——它可以用來執(zhí)行一個(gè)函數(shù),還可以做為分組運(yùn)算符來對(duì)表達(dá)式求值惫确。比如使用圓括號(hào)或方括號(hào)的話手报,可以在行首加一個(gè)分號(hào),避免被用做函數(shù)執(zhí)行或下標(biāo)運(yùn)算:
;( function() {}() )
;(function(){})()
isNaN判斷是否為合法數(shù)字
isNaN(x) 函數(shù)用于檢查其參數(shù)是否是非數(shù)字值改化。如果x
是特殊的非數(shù)字值NaN(或者能被轉(zhuǎn)換為這樣的值)掩蛤,返回的值就是 true。如果x
是其他值,則返回 false所袁。
經(jīng)常盏档,我們在頁面功能模塊開發(fā)過程中,拿到的交互數(shù)據(jù)燥爷,有很大可能是字符串形式的“數(shù)字”蜈亩。這時(shí),我們?nèi)绻鲇?jì)算前翎,就得先判斷是否合法的數(shù)字稚配。
isNaN('111') //false
isNaN(111) //false
isNaN(12.2) //false
isNaN('12.2') //false
isNaN('aa11') //true
isNaN(undefined) //true 一切非數(shù)字,返回都是true
Tips: 我們可以這樣總結(jié)港华,只要是表現(xiàn)得像數(shù)字(字符串形式道川,或者真正數(shù)字)的都可以檢測出是屬于“數(shù)字”,否則屬于不合法數(shù)字。
緩存Array.length
寫for循環(huán)的時(shí)候立宜,經(jīng)常是這樣:
var arr = [1,2,3]
for(var i = 0; i < arr.length; i++) {/**/}
在處理一個(gè)很大的數(shù)組循環(huán)時(shí)冒萄,對(duì)性能的影響將是非常大的。為了提升運(yùn)行性能橙数,需要將數(shù)組使用一個(gè)變量緩存起來使用尊流。
for(var i = 0, len = arr.length; i < len; i++){/**/}
判斷屬于是否存在于對(duì)象中
1、使用in運(yùn)算符
var obj = { a: 11 }
'a' in obj //true
'b' in obj //false
2灯帮、使用!!
var obj = { a: 11 }
!!obj.a //true
!!obj.b //false
//或者使用undefined來判斷崖技,但是可能也會(huì)屬于值本身就是undefined,這樣子就判斷不出來了钟哥。
obj.a !== undefined //true
obj.b !== undefined //false
3迎献、hasOwnProperty()方法
var obj = { a: 11 }
obj.hasOwnProperty('a') //true
obj.hasOwnProperty('b') //false
//該方法只能判斷自有屬性是否存在,對(duì)于繼承屬性會(huì)返回false腻贰。
獲取數(shù)組最后一個(gè)元素
獲取數(shù)組最后一個(gè)元素的方式有多種吁恍,常用的有array.pop
或者array[array.length - 1]
方式。實(shí)際上,還可使用Array.slice(-1)
var arr = [1,2,3,4,5]
arr.pop() //5 此方法會(huì)改變數(shù)組的結(jié)構(gòu)践盼,不推薦
arr[arr.length - 1] //5
arr.slice(-1)[0] //5 不需要計(jì)算數(shù)組的長度鸦采,直接拿到最后一個(gè)元素
數(shù)組截?cái)?/h3>
數(shù)組有時(shí)候需要設(shè)置一個(gè)上限宾巍,或者刪除數(shù)組中的一些元素咕幻,使用array.length = [長度值] 這種方式非常有用。
var arr = [1,2,3,4,5]
arr.slice(0,3)
console.log(arr) //[1,2,3]
arr = arr.splice(0,3) //splice方法會(huì)改變數(shù)組結(jié)構(gòu)
console.log(arr) //[1,2,3]
//直接設(shè)置長度值
arr.length = 3
console.log(arr) //[1,2,3]
//還可以實(shí)現(xiàn)數(shù)組的清空操作
arr.length = 0; //arr => []
數(shù)組合并
合并數(shù)組常用的方法是:concat
顶霞。不過現(xiàn)有一種更快速的合并方式:Array.push.apply(arr1,arr2)
var arr1 = [1,2,3], arr2 = [4,5];
arr1 = arr1.concat(arr2) //常規(guī)方式
//或者
arr1 = arr1.push.apply(arr1,arr2); //裝逼方式肄程,但運(yùn)行速度更快!
console.log(arr1) //[1,2,3,4,5] 兩種方式都可以達(dá)到合并的結(jié)果
類數(shù)組利用數(shù)組的方法
類數(shù)組擁有l(wèi)ength屬性选浑,但不具有數(shù)組所具有的方法蓝厌。為了方便操作,常需要將其轉(zhuǎn)化為數(shù)組結(jié)構(gòu)古徒。
var arrLike = { '0': 'a', '1': 'b', length: 2 }; //下標(biāo)為 '0' '1'才符合數(shù)組的數(shù)據(jù)結(jié)構(gòu)
Array.prototype.join.call(arrLike, '-'); //a-b 模擬數(shù)組的join()方法,使用-分隔拓提。
Array.prototype.slice.call(arrLike); //['a','b'] //模擬數(shù)組slice方法,返回一個(gè)新的數(shù)組
function fn() {
var args = Array.prototype.slice.call(arguments); //獲取所有參數(shù)的列表
}
利用arguments.callee實(shí)現(xiàn)遞歸
普通的遞歸方法是這樣寫的:
function fn(n) {
if(n <= 1) {
return 1
} else {
return n * fn(n - 1)
}
}
但是當(dāng)這個(gè)函數(shù)變成了一個(gè)匿名函數(shù)時(shí)隧膘,我們就可以利用callee來遞歸這個(gè)函數(shù)代态。
function fn(n) {
if(n <= 1) {
return 1
} else {
return n * arguments.callee(n - 1)
}
}
Tips: 這個(gè)方法雖然好用,但是有一點(diǎn)值得注意疹吃,ECMAScript4中為了限制js的靈活度蹦疑,讓js變得嚴(yán)格,新增了嚴(yán)格模式萨驶,在嚴(yán)格模式中我們被禁止不使用var來直接聲明一個(gè)全局變量歉摧,當(dāng)然這不是重點(diǎn),重點(diǎn)是arguments.callee這個(gè)屬性也被禁止了腔呜。
給回調(diào)函數(shù)傳遞參數(shù)
經(jīng)常叁温,函數(shù)一般是可以當(dāng)作參數(shù)來使用。但是有時(shí)候核畴,一些函數(shù)自身需要帶參膝但,這時(shí)候,把函數(shù)當(dāng)參數(shù)使用的話膛檀,就顯得比較麻煩锰镀。一般的處理方法是,通過附加的傳參的辦法咖刃。
function callback(obj) {
console.log(obj)
}
function fn(callback, obj) {
callback(obj)
}
但是有些時(shí)候泳炉,函數(shù)的參數(shù)限定了,只能傳一個(gè)回調(diào)函數(shù)嚎杨,這時(shí)花鹅,這種附加傳參的顯得無力了。采用閉包的方式可以解決此問題枫浙。
function callback(obj) {
return function() {
console.log(obj)
}
}
document.body.addEventListener('click',callback('hello')); //執(zhí)行callback('hello')刨肃,則返回的是一個(gè)函數(shù)
利用正則表達(dá)式處理實(shí)際問題
1古拴、獲取有價(jià)值部分
經(jīng)常,在項(xiàng)目中真友,可能會(huì)獲取到一些帶有帶有各種干擾因素的值黄痪。而我們需要提取相應(yīng)的數(shù)字部分,可以使用正則表達(dá)式獲取盔然。
var val = "98.8元/斤";
val.replace(/[^(0-9).]/ig,'') //98.8
2桅打、獲取URL中的value值
經(jīng)常,我們會(huì)從url中獲取到location.search
愈案,但卻是一個(gè)字符串挺尾,然后還需要將這個(gè)字符串進(jìn)行分拆才能得到想要的值,而使用正則站绪,則快速方便得多遭铺。
//假設(shè)當(dāng)前url為:https://www.baidu.com?name=jawil&age=23
//普通實(shí)現(xiàn):
function fn(key) {
var obj = {}
var searchStr = window.location.search.substring(1);
searchStr.split('&').forEach(function(item) {
var arr = item.split('=');
obj[arr[0]] = arr[1];
});
return obj[key]
}
console.log(fn('name')) //jawil
console.log(fn('age')) //23
//使用正則實(shí)現(xiàn):
function fn(key) {
var reg = new RegExp("(^|&)"+ key +"=([^&]*)(&|$)"); //url正則表達(dá)式
var flag = window.location.search.substring(1).match(reg);
return flag != null ? unescape(flag[2]) : null;
}
console.log(fn('name')) //jawil
3、格式化數(shù)字
通常恢准,我們需要將一個(gè)大的數(shù)字 19456212 轉(zhuǎn)化為 19,456,212 這種樣子魂挂。使用正則表達(dá)式可以很好的處理:
var num = 19456212.85;
num.toLocaleString() //19,456,212.85 toLocaleString()會(huì)根據(jù)你機(jī)器的本地環(huán)境來返回字符串,它和toString()返回的值在不同的本地環(huán)境下使用的符號(hào)會(huì)有微妙的變化
//為了保險(xiǎn)起見顷歌,可以使用方法實(shí)現(xiàn)
function fn(s, n) {
n = n > 0 && n <= 20 ? n : 2;
s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(n) + '';
var l = s.split('.')[0].split('').reverse(),
r = s.split('.')[1];
t = '';
for (i = 0; i < l.length; i++) {
t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? ',' : '');
}
return t.split('').reverse().join('') + '.' + r;
}
console.log(fn(19456212.85)) //19,456,212.85
總結(jié)
我歸納的東西比較雜锰蓬,都是平時(shí)遇到的一些小技巧∶袖觯基本上都是一些表達(dá)式上的優(yōu)化芹扭,之后,再有啥好東西赦抖,我繼續(xù)在這篇中添加舱卡。
javascript日常的使用過程中,很多語句队萤,其實(shí)都是可以有多種寫法轮锥,嘗試著使用不同的寫法,對(duì)比一下哪種寫法更簡潔要尔,更易讀舍杜,更能提高執(zhí)行效率,可以實(shí)現(xiàn)對(duì)代碼的優(yōu)化赵辕。而我在項(xiàng)目開發(fā)過程中使用到的一些簡寫既绩,很大部分是了解別人的代碼寫法,從中學(xué)以致用还惠。另外一個(gè)很好的辦法就是饲握,查調(diào)試自己的壓縮代碼的時(shí)候,不防讀一下被壓縮優(yōu)化過的代碼,變成了啥樣子的救欧,會(huì)有發(fā)現(xiàn)衰粹,壓縮過的代碼,實(shí)際上編譯器已經(jīng)幫我們實(shí)現(xiàn)了最佳寫法笆怠,這樣铝耻,不妨借鑒一下,用到自己的項(xiàng)目中去骑疆。