天天看點

你不知道的js——中

值——

在Js中字元串是

不可變

的,字元數組是

可變

的,字元串沒有數組那些很友善的函數,是以可以通過“借用”數組的非變更方法來處理字元串。

var a="abcde";
var c=Array.prototype.join.call(a,"-");  //"a-b-c-d-e"
var d=Array.prototype.map.call(a,function(v){
	return v.toUpperCase()+'.';
}).join("");       //    "A.B.C.D.E."
           

強制類型轉換——

在js中最常用的顯式強制類型轉換就是!!,因為!能将值強制轉換為與值相反的布爾值,!!能将它轉換為對應的布爾值。

區分寬松相等== 和嚴格相等 === 的解釋:== 允許在相等比較進行強制類型轉換,而 ===中不允許。在 ==比較中,字元串和數字比較時都轉換成數字;無論什麼情況都不要和true或false比較;null和undefined相等(他們也與其自身相等),其他值都不存在這種情況。

Number([])=0; Number({})=NaN; Number("")=0; String([null])="";
安全運用隐式強制類型轉換:如果兩邊值中有true或false,不要用==; 如果兩邊值有[]、""、0,盡量不用==。
           
  1. tostring:null、true、undefined、數字轉換成本身的字元串格式;不能用來轉換對象(會得到"[object object]");轉換數組時将所有單元 字元串化(a=[1,2,3] 轉換成 “1,2,3”)
  2. JSON.stringify()(本質上并不是強制類型轉換): 字元串、數字、布爾值、null的轉換方式與樓上一樣;在對象中遇到undefined、function、symbol會自動忽略,在數組中遇到會在該單元位傳回null;如果需要轉換的對象中定義了toJSON()方法,會先調用此方法。
  3. toNumber:null、[]、"" 轉換成0,undefined轉換成NaN;對象和數組會首先被轉換成對應的基礎類型值,然後再強制轉換。
  4. toBoolean: 規定所有對象都是真值,假值清單以外的都是真值。
    假值清單:null  undefined  false  +0  -0   NaN    ""(除此以外的所有字元串都是真值)
               

這裡有一個坑(涉及到代碼塊和強制類型轉換),留白思考

[]+{}; //"[object object]"

{}+[]; //0

文法——

每個指派表達式(例如 a=2;)都是有結果值的:可以看到它在谷歌控制台中輸出2,意思是這裡a=2的結果值為2(副作用是将a指派為2) ,這樣在多指派語句串聯時,我們就能明白為什麼b=a=2最後b的值是2,還能用在if語句判斷中,将a=2; if(a){}簡化為 if(a=2){}。

運算符優先級:&&> || > ?: (三元運算符),&&和||是左關聯,?:和=是右關聯(指從右往左組合),執行順序還是從左往右。d=e=a && b || c ? c || b ? a : c && b : a ,根據優先級和關聯知識,應該分解為 d=(e=((a && b) || c )? ((c || b) ? a : (c && b) ): a )