js小技巧
1.把變量值轉(zhuǎn)為對(duì)象屬性
var IO = "socket";
var obj = {[IO]: "value"}
console.log(obj); //{socket: "value"}
在對(duì)象的key位置上面首装, 我們可以使用 [] 將變量套住杭跪,那么變量值就變key了
2. !!的使用
在看一下源碼中涧尿,經(jīng)诚终看到有人用!!, 覺(jué)得奇怪,其實(shí)這個(gè)是非常有用的一種方式瞬内,用于把值轉(zhuǎn)換成 boolean類(lèi)型
這樣有什么用呢虫蝶? 其實(shí)用處是非常大的倦西,很多時(shí)候我們需要類(lèi)型的轉(zhuǎn)化,比如我們從服務(wù)器傳遞數(shù)據(jù)過(guò)來(lái)疼约,可能用0 和 1做 false 和 true的標(biāo)記蝙泼,那么就意味著汤踏,在你的業(yè)務(wù)代碼中,很可能也直接使用0 或者 1, 到時(shí)這是一種非常不好的方式搂擦,很好是用true 或者 false來(lái)進(jìn)行 bool類(lèi)型的判斷哗脖, 而!!恰好提供了非常好的轉(zhuǎn)換方式
!!0 //false
!!1 //true
3.邏輯技巧
邏輯技巧是一個(gè)非常有意思的事情懒熙,下面會(huì)總結(jié)子在開(kāi)發(fā)中常用的邏輯技巧工扎。
- 如果存在xx的話肢娘,就返回什么
var ret = num && num * 2 //如果num存在的話而钞,就返回num *2的值
- x存在返回x, x 不存在返回y, y不存在返回z....
var ret = x || y || z
- 要么x不存在臼节,要么返回x的某個(gè)屬性值
var ret = !x || x[props]
- 利用多個(gè) : ? 代替If else
function match(ele) {
return ele === 'a' ? "match a"
: ele === 'b' ? "match b"
: ele === 'c' ? "match c"
: 'default';
}
match('b') //match b
4.NaN
這個(gè)在javascript中是一個(gè)意外, 一般來(lái)說(shuō)网缝,一個(gè)值 應(yīng)該和 自身 (等值 或者 全等), 但是 NaN和自身 是 不等值和全等的
NaN == NaN //false
NaN === NaN //false
5.==或者===
== 是等值
===是全等
對(duì)于基本數(shù)據(jù)類(lèi)型粉臊,string number等扼仲,判斷相等,我們?nèi)坑?=== 全等判斷
等值有些情況要注意一下
0 == '0' //true
0 == '' // true
'' == '0' //false
6. \ 在字符串中
注意 \ 在字符串中 也是表示轉(zhuǎn)義字符
比如 我想要在字符串中 表示 \ 那么只能使用 \
var a = '\' //error Invalid token
var a = '\\' //表示 \
a.length = 1
//如果想表示 "abc\n\r"
//應(yīng)該寫(xiě)成 "abc\\n\\r"
7.對(duì)象的聲明中屠凶,可以直接使用讀寫(xiě)器
注意 不用function聲明 和 不能和對(duì)象原本的已經(jīng)存在key重復(fù)
var obj = {
value: "default",
get props() {
return this.value
},
set props(value) {
this.value = value;
}
}
obj.props //"default"
obj.props = "aaa";
obj.props //"aaa"
8. 對(duì)象所屬和對(duì)象成型的異步分開(kāi)
借助于javascript的靈活性驰后,可以任意時(shí)候給一個(gè)對(duì)象增加屬性,于是就有了對(duì)象所屬和對(duì)象成型的異步分開(kāi)技巧阅畴。
這是什么意思呢? 就是 對(duì)象屬于哪個(gè)集合和這個(gè)對(duì)象會(huì)變成什么樣實(shí)際可以分開(kāi)的迅耘,而不必必須是生成一個(gè)完整的對(duì)象贱枣,然后再加入到一個(gè)具體的集合中。
上面的思考實(shí)際在很多時(shí)候會(huì)帶來(lái)靈活性颤专,比如它可以減輕我們函數(shù)的傳參邏輯纽哥,比如在用c寫(xiě)代碼時(shí),我們知道栖秕,c語(yǔ)言的對(duì)象屬性是固定的春塌,也就是說(shuō),如果想把一個(gè)對(duì)象加入到一個(gè)數(shù)組中簇捍,那么必須是先完整的生成這個(gè)對(duì)象吼句,然后再加入到數(shù)組中驹愚。但是對(duì)于javascript來(lái)說(shuō)谁鳍,對(duì)象的屬性可以改變窍荧,那么我們可以先把一個(gè)對(duì)象加入數(shù)組中郊楣,然后再去修改對(duì)象的對(duì)象输硝。
利用訂單模型舉例,我們想要把所有訂單都加入到訂單列表中哥童,那么有兩種思考模式
一種為 先生成完整訂單优训,然后再把訂單加入列表中
var order = {};
handlerOrder(order);
orderList.push(order);
一種為 先把訂單數(shù)據(jù)加入訂單列表中妆兑,然后在處理訂單數(shù)據(jù)
var order = {};
orderList.push(order);
handlerOrder(order);
相對(duì)而言,第二種的處理邏輯會(huì)更加簡(jiǎn)單一點(diǎn),因?yàn)楹竺鎯H僅需要思考如何處理訂單的數(shù)據(jù)就行,而不用考慮這個(gè)訂單的其他外在的連續(xù),相對(duì)而言玉罐,更加靈活
特別是在一些異步操作的時(shí)候饶号,我們可以先把訂單對(duì)象加入列表中算谈,然后在寫(xiě)一個(gè)封裝的函數(shù)幔欧,著重處理訂單的數(shù)據(jù)邏輯雁社。
9 url query正則中獲取某個(gè)key
function getParam(key) {
var res = new RegExp('[?&]'+ key +'=([^&#]*)').exec(location.search);
return res && res.length === 2 ? res[1] : '';
};