|
6 | 6 | </head>
|
7 | 7 | <body>
|
8 | 8 | <script>
|
| 9 | +// 隐式类型转换 |
| 10 | +// primitive type |
| 11 | +/** |
| 12 | + * Object => String |
| 13 | + */ |
| 14 | +// 1. 转换场景 |
| 15 | +// console.log(); |
| 16 | +// alert(); |
| 17 | +// "" + obj; //字符串拼接 |
9 | 18 |
|
10 |
| -// "=="引起的类型转换 |
| 19 | +// 2. 转换方法 |
| 20 | +// Object.prototype.toString() 返回一个表示该对象的字符串 |
| 21 | +// Object.prototype.valueOf() 返回指定对象的原始值 |
| 22 | + |
| 23 | +// 3. 转换规则 |
| 24 | +// 1. 设原始值为调用 ToPrimitive 的结果 |
| 25 | +// 2. 调用 toString 方法返回原始值 |
| 26 | +// (3). 若 toString 未返回原始值,调用 valueOf 返回原始值 |
| 27 | +// (4). 若 valueOf 仍未返回原始值,报错 |
| 28 | + |
| 29 | +// 4. 案例 |
| 30 | +var obj = { |
| 31 | + toString: function() { |
| 32 | + console.log('use obj.toString'); |
| 33 | + return {};// 返回非原始类型 |
| 34 | + }, |
| 35 | + valueOf: function() { |
| 36 | + console.log('use obj.valueOf') |
| 37 | + return 'sun';// 返回原始类型 |
| 38 | + } |
| 39 | +} |
| 40 | +console.log(obj);//use obj.toString //use obj.valueOf //sun |
| 41 | +// 说明:先调用 toString 方法,如果得不到原始类型数据,继续调用 valueOf 方法 |
| 42 | +// 如果不重写 toString 方法,obj.toString() 返回 "[object Object]",为字符串原始类型 |
| 43 | + |
| 44 | +/** |
| 45 | + * Object => Number |
| 46 | + */ |
| 47 | +// 1. 转换场景 |
| 48 | +// Number() //强制转换 |
| 49 | +// Math |
| 50 | +// obj == 1 //比较 |
| 51 | +// obj + 1 //数值运算 |
| 52 | +// +obj |
| 53 | + |
| 54 | +// 2. 转换方法 |
| 55 | +// Object.prototype.valueOf() 返回指定对象的原始值 |
| 56 | +// Object.prototype.toString() 返回一个表示该对象的字符串 |
| 57 | + |
| 58 | +// 3. 转换规则 |
| 59 | +// 1. 设原始值为调用 ToPrimitive 的结果 |
| 60 | +// 2. 调用 valueOf 方法返回原始值 |
| 61 | +// (3). 若 valueOf 未返回原始值,调用 toString 返回原始值 |
| 62 | +// (4). 若 toString 仍未返回原始值,报错 |
| 63 | + |
| 64 | +// 4. 案例 |
| 65 | +console.log(typeof(+[1])); //number |
| 66 | +console.log(+[]); // 0 |
| 67 | +console.log(+[1,2]); // NaN |
| 68 | +console.log(+[undefined]); // 0 |
| 69 | +console.log(+[undefined,undefined]); // NaN |
| 70 | +console.log(+Array(0)); // 0 |
| 71 | +console.log(+Array(1)); // 0 |
| 72 | +console.log(+Array(2)); // NaN |
| 73 | +console.log(+Array(017)); // NaN |
| 74 | + |
| 75 | +var obj = { |
| 76 | + valueOf: function() { |
| 77 | + console.log('use valueOf'); |
| 78 | + return {}; |
| 79 | + }, |
| 80 | + toString: function() { |
| 81 | + console.log('use toString'); |
| 82 | + return 7; |
| 83 | + } |
| 84 | +} |
| 85 | +console.log(obj + 1);//use valueOf //use toString //8 |
| 86 | +// 说明:先调用 valueOf 方法,如果得不到原始类型数据,继续调用 toString 方法 |
| 87 | +// 如果返回的原始类型为 "7",结果为 "71" |
| 88 | + |
| 89 | +/** |
| 90 | + * => Boolean |
| 91 | + */ |
| 92 | +// 1. 转换场景 |
| 93 | +// if(obj) //布尔比较 |
| 94 | +// while(obj) //布尔比较 |
| 95 | + |
| 96 | +// 2. 转换规则 |
| 97 | +// 只有以下为 false,其余为 true |
| 98 | +// undefined、null、-0、0、+0、NaN、'' |
| 99 | + |
| 100 | +// 3. 案例 |
| 101 | +if(new Object() && [0] && [] && "0"){ |
| 102 | + console.log("true"); |
| 103 | +}else{ |
| 104 | + console.log("false"); |
| 105 | +} |
| 106 | +// true |
| 107 | +// 说明:对象一定为 true |
| 108 | + |
| 109 | + |
| 110 | +/** |
| 111 | + * "=="引起的类型转换 |
| 112 | + */ |
11 | 113 | // 1. 存在 NaN 必为 false
|
12 | 114 | // 2. 【null】 == 【undefined】 不转换,始终为 true
|
13 | 115 | // 3. 【null / undefined】 == 【其他非 null / undefined】 不转换,始终为 false
|
14 | 116 | // 4. 【原始类型 string / number / boolean】 == 【Date对象】 原始类型=>number,Date对象 --> toString() / valueOf()
|
15 |
| -// 5. 【原始类型 string / number / boolean】 == 【非Date对象】 原始类型=>number,Date对象 --> valueOf() / toString() |
| 117 | +// 5. 【原始类型 string / number / boolean】 == 【非Date对象】 原始类型=>number,非Date对象 --> valueOf() / toString() |
16 | 118 | // 6. 【原始类型 string / number / boolean】 == 【原始类型 string / number / boolean】 原始类型 => number
|
17 | 119 |
|
18 | 120 | console.log(NaN == NaN);//false
|
19 | 121 | console.log("sunshine" == NaN);//false 存在 NaN 必为 false
|
20 | 122 | console.log(1 == true);//true true => 1
|
21 | 123 | console.log(true == "sun");//false true => 1 "sun" => NaN
|
| 124 | +console.log("" == false);//true |
22 | 125 |
|
23 | 126 | var a = [0];
|
24 | 127 | if(a){
|
|
84 | 187 | console.log(parseInt(str2));
|
85 | 188 | console.log(parseFloat(str2));
|
86 | 189 | console.log(Number(str3));
|
87 |
| - |
| 190 | +console.log(Number("")); // 0 |
88 | 191 |
|
89 | 192 | </script>
|
90 | 193 | </body>
|
|
0 commit comments