#### 一、值类型转换
```
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之后