JavaScript/隱式類型轉換

隱式轉換概述

編輯

Javascript執行運算符運算時,如果運算符兩邊的數據類型不一樣,則編譯器自動進行類型轉換。這種自動進行的類型轉換就叫隱式類型轉換。

例如:1 == "", ""會被隱式轉換,Number("") => 0 ==> 1==0 false

各種數據類型轉換為Boolean類型規則,需要注意:[]、{}都是Object對象類型,所以轉換為true。

所有的對象都繼承了toString()和valueOf()方法。

  • toString()返回該對象的字符串。
  • valueOf()如果存在原始值,返回原始值,如果對象無法表示一個原始值,則返回該對象本身。

算術計算的隱式類型轉換

編輯

isNaN函數:

console.log(isNaN(undefined));
console.log(isNaN(NaN));
console.log(isNaN("a"));
//以上为true

console.log(isNaN(null));
console.log(isNaN(false));
onsole.log(isNaN(true));
console.log(isNaN(123));
console.log(isNaN("123"));

酉運算符 ++、--、+、-都是把操作數轉化為number再計算。

雙目運算符:+、-、*、/,隱式調用Number()。加號有一點比較特殊,當加號兩邊有一側是字符串的話,那麼表達式得到的就是字符串,也就是隱式調用了String()。

var a = "a" * 1;
console.log(typeof(a) + " : " + a); 
var b = 1 - "";
console.log(typeof(b) + " : " + b);
var c = "2" / null;
console.log(typeof(c) + " : " + c);
var d = "1" - 1;
console.log(typeof(d) + " : " + d);
var a = "a" + 1;
console.log(typeof(a) + " : " + a);
var b = 1 + "";
console.log(typeof(b) + " : " + b);
var c = null + "abc";
console.log(typeof(c) + " : " + c);

邏輯運算符的隱式轉換

編輯

與、 或、 非、if()條件判斷,均調用了Boolean()。

大小比較的隱式轉換

編輯

比較大小的判斷>、<、>=、<=,若比較符兩邊有一個是數字,就會進行Number轉化,同時返回boolean類型的值

var a = "a" > 1;
console.log(typeof(a) + " : " + a);
var b = 1 > "";
console.log(typeof(b) + " : " + b);
var c = "2" > null;
console.log(typeof(c) + " : " + c);
var d = "1" > 1;
console.log(typeof(d) + " : " + d);

相等和不等比較的隱式類型轉換

編輯

運算符 == 兩邊如果一邊為數值,一邊為非數值。則非數值轉換為數值進行比較。

  • 一個值是null,另一個是undefined,則它們相等。
  • 一個值是數字,另一個是字符串,先將字符串調用Number()轉換成數字,然後使用轉換後的值進行比較。
  • 一個值為布爾值,則在比較之前先將其轉換為數值。
  • 一個值是對象,另一個值是數字或字符串,則調用對象的valueOf()轉換為原始值,然後再進行比較。
  • 兩個值都是對象,則比較它們是不是指向同一個對象
  • 其他類型之間的比較均不相等。
var a = "1" == 1;
console.log(typeof(a) + " : " + a);
var b = 0 == "";
console.log(typeof(b) + " : " + b);
var c = 0 != null;
console.log(typeof(c) + " : " + c); //why it is true?
var d = 0 == false;
console.log(typeof(d) + " : " + d);

隱式類型轉換的步驟

編輯
  • 如果隱式轉換的數據類型是原始值,則直接返回原始值
  • 如果隱式轉換的數據類型是引用值,則調用toPrimitive(input,preferedType)函數
  • 如果input是對象,則調用valueOf()方法。
  • 如果valueOf()返回原始值則直接返回原始值。不是則調用toString()方法。
  • toString()如果是原始值則直接返回原始值,不是則報錯誤。

示例

編輯

下述各行輸出均為true:

console.log([] == false);  // [] → '' → 0
console.log([] ? true : false); // [] → Boolean as true
console.log([0] == false);
console.log([0] ? true : false); // [0] → Boolean as true
console.log("0" == false);
console.log("0" ? true : false); // "0"  → Boolean as true
console.log([1] == true);
console.log([1] ? true : false); // [1] → Boolean as true
console.log("1" == true);
console.log("1" ? true : false); // "1"  → Boolean as true
console.log([2] != true);
console.log([2] ? true : false); // [2] → Boolean as true
console.log("2" != true);
console.log("2" ? true : false); // "2" → Boolean as true