JavaScript資料型別轉換總結

磚用冰西瓜發表於2019-02-19

我的github部落格 github.com/zhuanyongxi…

資料型別的轉換

在JS中,引用資料型別轉換為原始資料型別轉換隻有三種情況:

  • 轉換為布林值;
  • 轉換為數字;
  • 轉換為字串。

換一種方式來表達,在JS中,所有的資料都可以去轉(注意這裡的用詞,是“轉”,不是“轉成”)布林值、數字和字串(並不一定能成功)。

轉成布林值

非常簡單,除了undefined、null、“”、NaN、0、-0、false之外,全都是true。

轉成字串

也非常的簡單,需要注意的有四個:陣列、物件、函式、symbol。

其實重要的就是陣列和物件。

function fn() {
  console.log("Hello World");
}
console.log(String([1, 2]));	// "1,2"
console.log(String({}));	// "[object Object]"
console.log(String(fn));	
// "function a() {window.runnerWindow.proxyConsole.log(\"Hello World\");}"
console.log(String(Symbol('foo')));	// "Symbol(foo)"
複製程式碼

轉成數字

在JS中,轉數字比較複雜。常用的轉換數字的方法有:Number、parseInt和parseFloat。其中Number在轉字串的時候如果遇到有非數字的東西,會返回NaN,所以也被稱為強制轉換。另外兩個是從左到右一位一位的轉換,所以也被成為非強制轉換。

Number方法

與一元操作符+的效果相同。即Number("1")+"1"相同。

  • Boolean,true和false分別是1和0;
  • 數字返回數字;
  • null返回0;
  • undefined返回NaN;
  • Symbol會拋錯;
  • 如果是字串:
    1. 空字串轉為0;
    2. 只包含數字的情況,Number會消除前導的0,比如“001”,轉換之後就是1。浮點格式與整數相同。
    3. 如果字串包含除數字以外的其他字元(字串開頭可以有正負號),都會轉為NaN。
  • 如果是物件,先轉成字串,再把字串轉成數字。

如果是四則運算,字串的優先順序最高,數字第二。意思就是如果相加的遇到了字串,則不是字串的轉化為字串,如果沒有字串,有一個數字,則不是數字的轉化為數字。

資料型別的比較(隱式轉換)

  1. NaN與任何值都不相等,包括它自己。
  2. 物件與物件比較,比較的是不是指向同一個記憶體地址
  3. 物件與字串比較,物件先轉化為字串,然後做比較
  4. 物件與布林型別值比較,兩邊都要先轉為數字(false是0,true是1)。物件型別的值先隱式呼叫toString方法,在隱式呼叫Number方法
  5. 物件與數字比較,物件轉化為數字再比較(先隱式呼叫toString方法,再隱式呼叫Number方法將物件轉化為數字)
  6. 數字與布林型別值比較,就是進行數字的比較
  7. 數字與字串的比較,把字串轉化為數字,再比較
  8. 布林與布林,兩邊都轉化為數字再比較
  9. null與undefined比較,true
  10. null、undefined與其他型別比較,結果都是false,因為他們倆沒有toString方法

簡化版

  1. 只要有數字和布林值的,都轉換成數字進行比較;
  2. 物件與物件比較,比較的是不是指向同一個記憶體地址;
  3. 物件與字串比較,物件先轉化為字串,然後做比較;
  4. null、undefined、NaN與其他型別比較,null和undefined除了自己之外,相互比較也是相等的,此外與其他型別比較,結果都是false,因為他們倆沒有toString方法。其中NaN與任何比較都是false(包括自己)。
// 1,
1 == "1"; // true
1 == true;  // true

// 2,
var obj1 = {}
var obj2 = {}
var obj3 = obj1
obj1 == obj2 // false
obj1 == obj3 // true

// 3,
{} == "{}" // false,物件{}轉化為字串是"[object Object]"

// 4,
null == null // true
undefined == undefined // true
null == undefined // true
"" == null // false
NaN == NaN // false

複製程式碼

相關文章