《你不知道的JS》型別轉換
阿新 • • 發佈:2018-12-22
第四章 強制型別轉換
- 如果物件中定義toJSON()方法,JSON字串化會首先呼叫該方法,然後用它的返回值來進行序列化
var a={ val:[1,2,3], toJSON:function(){ return this.val.slice(1); } } JSON.stringify(a);// "[2,3]" 可選引數 replacer、space 如果是陣列,則必須是一個字串陣列,其中包含序列化操作要處理的物件的屬性名稱,除此之外其他的屬性會被忽略 如果是函式,首先會對該物件本身呼叫一次,然後對物件中的每個屬性各呼叫一次。每次傳入兩個引數,分別是key和value var a = { b: 42, c: '42', d: [1, 2, 3] }; JSON.stringify(a, ['b', 'c']); // "{"b": 42, "c": "42"}" JSON.stringify(a, function(k, v) { if( k != 'c') { return v; } }); // "{"b": 42, "d": [1, 2, 3]}"
toNumber操作
true => 1;
false => 0;
undefined => NaN;
null => 0;
- ToNumber對字串的處理遵循數字常量的基本法則,處理失敗時會返回NaN。
- ToNumber對於以0開頭的十六進位制數字並不按照十六進位制進行處理,而是按照十進位制
- 物件/陣列會首先被轉化為相應的基本型別值,如果返回的是非數字的基本型別值,則再遵循以上規則強制轉換為數字。
對於如何轉成相應的基本型別,我們有如下規則,如果有valueOf() 或 toString()方法,則將方法返回值強制型別轉換 var a = { valueOf: function() { return "42"; } }; var b = { toString: function() { return "42"; } }; var c = [4, 2]; c.toString = function() { return this.join(""); // "42" }; Number(a); // 42 Number(b); // 42 Number(c); //42 Number(""); // 0 Number([]); // 0 Number(["abc"]); // NaN
ToBoolean操作
- 假值列表
假值的布林強制型別轉化結果為false
undefined
null
false
+0, -0, NaN
"" //空字串
-
真值列表:假值列表之外的值
-
假值物件:封裝了假值的物件,但是真值
-
~操作符
var a = "hello world";
~a.indexOf("lo") 只有為-1時 是假值 是一種很奇特的用法
if(~a.indexof("lo"))
顯示解析數字字串
ar a = "42"; var b = "42px"; Number(a); // 42 parseInt(a); // 42 Number(b); // NaN parseInt(b); // 42 解析允許字串含有非數字字元,從左到右遇到非數字字元就停止 轉換不允許出現非數字字元,否則會失敗並返回NaN
parseInt(…)針對的是字串值,非字串值會先被強制型別轉換為字串在進行解析,這個會導致詭異的問題 parseInt(1/0,19) 為18
顯示轉換為布林值
- 使用Boolean()和!!來進行顯示強制轉換為布林值
&& 和 ||操作符
- || 和 &&:邏輯運算子【返回兩者中中的一個且僅一個值】
- ||: 條件判斷為true則返回第一個運算元,反之返回第二個
- &&與||相反,條件判斷為false則返回第二個運算元,反之返回第一個。
寬鬆相等和嚴格相等
- 寬鬆相等== 允許在相等比較中進行強制型別轉換,而 嚴格相等=== 不允許
- 無論如何 都不建議 使用 == true 和 == false
- 建議使用以下格式
if(a)
if(!!a)
if(Boolean(a))
null == undefined!!
抽象關係比較
- x <= y =>被處理為 y > x然後將結果反轉
- 如果比較符號兩邊經過toPrimitive出現數字,則強制按照數字大小比較
- 如果兩邊都是字元的話,那麼就按照字元順序比較