1. 程式人生 > >《你不知道的JS》型別轉換

《你不知道的JS》型別轉換

第四章 強制型別轉換

  • 如果物件中定義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出現數字,則強制按照數字大小比較
  • 如果兩邊都是字元的話,那麼就按照字元順序比較