#### 一、值類型轉換
```
var a = 42;
var b = a + ""; //隱式
var c = String(a); //顯式
```
#### 二、抽象值操作
JSON.stringify對于number、boolean、null來說相當于是toString,而對于undefined、function來說會返回undefined,對于string來說會在原來的基礎上再套上""(`""a""`)。如果function和undefined是在數組中的話,則數組的該位置會變成null而不是undefined以保證數組單元的位置不變
JSON.stringify接收第二個參數,可以是數組或函數,表示哪些屬性應該被處理
```
var a = {b: 1, c: 2, d: 3};
JSON.stringify(a, ["b", "d"]); //"{"b":1, "d":3}"
JSON.stringify(a, function(k, v){
if(k !== "c") return v;
}); //"{"b":1, "d":3}"
```
```
Number()
true -> 1
false -> 0
undefined -> NaN
null -> 0
"" -> 0
[] -> 0
{} -> NaN
```
```
Boolean()
undefined -> false
null -> false
"" -> false
0(+-) -> false
NaN -> false
//其余都是true
```
#### 三、顯示轉換
字符串和數字
```
String(n);
Number(str);
n.toString();
+str;
5+"3" -> "53"
5+ +"3" -> 8 //+"3"變為了3,由于++是運算符,5++3會報錯,因此用空格區分
```
日期轉換為數字
```
+d -> n //相當于getTime
Date.getTime();
Date.now();
```
~x相當于-(x+1)
顯式解析數字字符串
```
var a = "42";
var b = "42px";
Number(a); //42
Number(b); //NaN
//parseInt參數只能是str,否則變成NaN(先強制轉換成字符串再嘗試parseInt)
parseInt(a); //42
parseInt(b); //42
```
顯示轉換為boolean
```
!!v 等價于Boolean(v)
```
#### 四、隱式轉換
字符串和數字
+的定義為:左右兩方均為數字則執行數字操作,否則先將兩方toSring再相加(如果兩方均為boolean的話直接按0或1運算,否則boolean將變為string類型)
```
[1, 2] + [3, 4]; //1,23,4
[1, 2] + {}; //1,2[object Object]
[1, 2] + function(){}; //1,2function(){}
true + true; //2
false + function(){}; //falsefunction(){}
```
-的定義為:兩方均先toString,再Number,再相減
```
[1] - [3]; //-2
[1, 2] - [3, 4]; //NaN
```
||和&&
```
c = a || b 相當于c = a ? a : b
c = a && b 相當于c = a ? b : a
//而if(a || b)其實就是
var a = 11, b = 12;
a || b -> 11 || 22 -> 11 -> true -> if(true)
```
#### 五、寬松相等和嚴格相等
==比較的是值,===比較的是值和類型這句話是錯的。實際上,==允許在相等比較中進行強制類型轉換,而===不允許。你可以理解為,==號是想方設法地將二者強制類型轉換以達到相等的目的。(`42 == [42] -> true`)
比較中的特殊操作
NaN不等于NaN,-0等于+0
1. 雙方均為引用類型,則比較地址
2. boolean和其他類型作比較時,都是將boolean進行Number操作,而不是將其他類型進行Boolean操作。然后,想方設法地強轉另一方讓其與0|1相等。
3. 只有null和undefiend這兩個相互比較或自比較結果為true,否則任何其他類型和這兩個比較返回均為false
4. string與string比,number與number比,boolean與boolean比,不進行任何強轉
Object(n)如果n為null或undefined則返回{},否則的話調用n的封裝函數
```
別忘了==是想方設法通過強轉讓兩方相等
false == ""; //true -> 0 == "" -> 0 == 0(Number(""))
false == []; //true -> 0 == ""(String([])) -> 0 == 0(Number(""))
false == {}; //false
//!的優先級高于==,因此先進行!操作
[] == ![]; //true -> [] == !true(Boolean([])) -> [] == false -> true
```
< 和 >
如果一方為數字,則想方設法將另一方強轉為數字,否則,想方設法將雙方強轉為字符串。如果雙方均為引用類型,則比較地址
<=和>=
a<=b相當于!(b>a)
a>=b相當于!(a<b)
這與我們理解的小于或等于以及大于或等于不同,記住!
- 你不知道的JS上
- 第一部分 第三章 函數作用域和塊作用域
- 第一部分 第四章 提升
- 第一部分 第五章 閉包
- 第二部分 第一章 關于this
- 第二部分 第二章 this全面解析
- 第二部分 第三章 對象
- 第二部分 第五章 原型
- 第二部分 第六章 行為委托
- 你不知道的JS中
- 第一部分 第二章 值
- 第一部分 第三章 原生函數
- 第一部分 第四章 強制類型轉換
- 第一部分 第五章 語法
- 第二部分 第一章 異步
- 第二部分 第三章 Promise
- 第二部分 第四章 生成器
- 第二部分 第五章 性能
- 你不知道的JS下
- 第一部分 總結
- 第二部分 第二章 語法
- 第二部分 第三章 代碼組織
- 第二部分 第四章 Promise
- 第二部分 第五章 集合
- 第二部分 第六章 新增API
- 第二部分 第七章 元編程
- 第二部分 第八章 ES6之后