JS裝逼實(shí)用技巧

評(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):

  1. 對(duì)于布爾值仑濒,邏輯與是非常簡單的,只要有一個(gè)false偷遗,就返回false墩瞳;
  2. 對(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):

  1. 對(duì)于布爾值,邏輯或是非常簡單的抠刺,只要有一個(gè)true塔淤,就返回true;
  2. 對(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)目中去骑疆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末田篇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子箍铭,更是在濱河造成了極大的恐慌,老刑警劉巖椎镣,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诈火,死亡現(xiàn)場離奇詭異,居然都是意外死亡状答,警方通過查閱死者的電腦和手機(jī)冷守,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惊科,“玉大人拍摇,你說我怎么就攤上這事」萁兀” “怎么了充活?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜡娶。 經(jīng)常有香客問我混卵,道長,這世上最難降的妖魔是什么窖张? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任幕随,我火速辦了婚禮,結(jié)果婚禮上宿接,老公的妹妹穿的比我還像新娘赘淮。我一直安慰自己,他們只是感情好睦霎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布梢卸。 她就那樣靜靜地躺著,像睡著了一般碎赢。 火紅的嫁衣襯著肌膚如雪低剔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音襟齿,去河邊找鬼姻锁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛猜欺,可吹牛的內(nèi)容都是我干的位隶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼开皿,長吁一口氣:“原來是場噩夢啊……” “哼涧黄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赋荆,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤笋妥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后窄潭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體春宣,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嫉你,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了月帝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幽污,死狀恐怖嚷辅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情距误,我是刑警寧澤簸搞,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站深寥,受9級(jí)特大地震影響攘乒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惋鹅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一则酝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闰集,春花似錦沽讹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沐鼠,卻和暖如春挚瘟,著一層夾襖步出監(jiān)牢的瞬間叹谁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工乘盖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焰檩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓订框,卻偏偏與公主長得像析苫,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穿扳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,212評(píng)論 0 4
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,506評(píng)論 1 51
  • 經(jīng)常聽中醫(yī)講體寒衩侥, 那么體寒具體會(huì)有哪些表現(xiàn)? 寒又是怎么產(chǎn)生的矛物? 我們今天討論這個(gè)話題茫死。 在中醫(yī)看來大部分寒是因...
    十八里悅閱讀 1,016評(píng)論 0 9
  • ? 一、會(huì)議背景 隨著國家對(duì)文化產(chǎn)業(yè)發(fā)展多項(xiàng)促進(jìn)政策的出臺(tái)以及社科院發(fā)布《中國新媒體發(fā)展報(bào)告》我們不難看出泽谨,受益于...
    閑人電影閱讀 267評(píng)論 0 0
  • 其實(shí)在2017年的8月份之前璧榄,我對(duì)教育沒有一點(diǎn)研究,我不知道什么算教育吧雹?我也不懂教育,但是涂身,直到2017年8月雄卷,...
    叫我plus閱讀 292評(píng)論 0 3