一、其他值到布尔类型的值的转换规则
以下这些是假值:
? false
? undefined
? null
? +0、-0 和 NaN
? ""
假值的布尔强制类型转换结果为 false。从逻辑上说,假值列表以外的都应该是真值。
二、其他值到字符串的转换规则
- Null 和 Undefined 类型 ,null 转换为 “null”,undefined 转换为 “undefined”,
- Boolean 类型,true 转换为 “true”,false 转换为 “false”。
- Number 类型的值直接转换,不过那些极小和极大的数字会使用指数形式。
- Symbol 类型的值直接转换,但是只允许显式强制类型转换,使用隐式强制类型转换会产生错误,以下是例子:
let symbol = Symbol('name');
console.log(symbol);
let result1 = String(symbol);
console.log(typeof result1);
console.log(result1);
let result2 = symbol.toString();
console.log(typeof result2);
console.log(result2);
let result3 = symbol + '';
console.log(typeof result3);
console.log(result3);
- 对普通对象来说,除非自行定义 toString() 方法,否则会调用 toString()(Object.prototype.toString())来返回内部属性 [[Class]] 的值,如"[object Object]"。如果对象有自己的 toString() 方法,字符串化时就会调用该方法并使用其返回值,以下是例子:
let obj1 = {};
let result1 = String(obj1);
console.log(result1);
let obj2 = {
name: 'miracle',
age: 21
}
let result2 = obj2.toString();
console.log(result2);
Object.prototype.toString = function() {
return '我是改写字符串转换方法后的结果';
}
let result3 = obj2.toString();
console.log(typeof result3);
console.log(result3);
let arr1 = [];
let result1 = String(arr1);
console.log(typeof result1);
console.log(result1);
let arr2 = [1];
let result2 = String(arr2);
console.log(typeof result2);
console.log(result2);
let arr3 = [1, 2];
let result3 = String(arr3);
console.log(typeof result3);
console.log(result3);
let arr4 = [,,,];
let result4 = String(arr4);
console.log(typeof result4);
console.log(result4);
let arr5 = [,,1,,];
let result5 = String(arr5);
console.log(typeof result5);
console.log(result5);
三、 其他值到数字值的转换规则
- Undefined 类型的值转换为 NaN。
- Null 类型的值转换为 0。
- Boolean 类型的值,true 转换为 1,false 转换为 0。
- String 类型的值转换如同使用 Number() 函数进行转换,如果包含非数字值则转换为 NaN,空字符串为 0, 以下是例子:
let str1 = '';
let result1 = Number(str1);
console.log(typeof result1);
console.log(result1);
let str2 = 'miracle';
let result2 = Number(str2);
console.log(typeof result2);
console.log(result2);
- Symbol 类型的值不能转换为数字,会报错,Symbol类型目前只能显式转字符串。
- 对象(包括数组)会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则将其强制转换为数字,以下是例子:
let result3 = Number(null);
console.log(result3);
let obj1 = {
name: 'miracle',
age: 21
}
let result1 = Number(obj1);
console.log(result1);
let obj2 = {};
let result2 = Number(obj2);
console.log(result2);
let arr1 = [];
let result1 = Number(arr1);
console.log(result1);
let arr2 = [1];
let result2 = Number(arr2);
console.log(result2);
let arr3 = [1,2];
let result3 = Number(arr3);
console.log(result3);
为了将值转换为相应的基本类型值,抽象操作 ToPrimitive 会首先(通过内部操作 DefaultValue)检查该值是否有valueOf()方法。如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用 toString() 的返回值(如果存在)来进行强制类型转换。
如果 valueOf() 和 toString() 均不返回基本类型值,会产生 TypeError 错误
四、实用的类型转换表
原始值 | 转化为数值类型 | 转化为字符串类型 | 转化为 Boolean 类型 |
---|
false | 0 | “false” | false | true | 1 | “true” | true | 0 | 0 | “0” | false | 1 | 1 | “1” | true | “0” | 0 | “0” | true | “1” | 1 | “1” | true | NaN | NaN | “NaN” | false | Infinity | Infinity | “Infinity” | true | -Infinity | -Infinity | “-Infinity” | true | “” | 0 | “” | false | “20” | 20 | “20” | true | “twenty” | NaN | “twenty” | true | [ ] | 0 | “” | true | [20] | 20 | “20” | true | [10,20] | NaN | “10,20” | true | [“twenty”] | NaN | “twenty” | true | [“ten”,”twenty”] | NaN | “ten,twenty” | true | function(){} | NaN | “function(){}” | true | { } | NaN | “[object Object]” | true | null | 0 | “null” | false | undefined | NaN | “undefined” | false |
五、JS加法运算中的类型转换规则
1、解析视频 https://www.bilibili.com/video/BV1fJ411M7GW?from=search&seid=4048426098149042798
2、补充说明 视频中,有错误的地方,纠正如下:
let result9 = {} + [];
console.log(result9);
let result10 = [] + {};
console.log(result10);
let result11 = + [];
console.log(typeof result11);
console.log(result11);
|