🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### 一、值类型转换 ``` 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) 这与我们理解的小于或等于以及大于或等于不同,记住!