数学运算(+ - * /)的类型转换
”+“ 运算符都是字符串拼接和数字的加。
1.当一侧为String类型,则字符串拼接
2.当一侧为Number类型,另一侧为非String的原始类型,则另一侧转化为Number进行运算
3.当一侧Number类型,另一侧为引用类型,则两边都转换为字符串进行拼接
**优先级由上至下从高到低**
------
123 + '123' // "123123" (规则1)
123 + null // 123 (规则2)
123 + true // 124 (规则2)
123 + {} // "123[object Object]" (规则3)
[1] + 1 // "11" (规则3)
"- * /"都是转换成数字去运算
我们在对各种非Number类型运用数学运算符(- * /)时,会先将非Number类型转换为Number类型。
true // 1
false // 0
"123" // 123
Symbol // NaN
BigInt // NaN
Infinity // Infinity
{} // NaN
[1] // 1
["12"] // 12
[1, 2] // NaN
在条件语句中类型转换
单个变量数据类型
只有 null undefined '' NaN 0 false 这几个是 false,其他的情况都是 true,比如 {} , []
使用 == 比较的规则
规则1: NaN和任何类型比较都返回false,包括自己
规则2:undefined 和 null 比较为true, 除此之外 undefined、null 和其他任何类型数据比较都返回false
规则3:Boolean和其他类型比较,Boolean首先要转化成Number类型
规则4:String 和 Number比较,String首先要转化成Number类型
规则5:原始类型和引用类型进行比较,引用类型会按照`ToPrimitive规则`转化成原始类型。
`ToPrimitive规则`是引用类型向原始类型转变的规则, 如果`[Symbol.toPrimitive](hint)`存在则显示它的返回值,如果不存在则它遵循先valueOf后toString的模式期望得到一个原始类型。
toPrimitive规则
调用obj[Symbol.toPrimitive](hint)该方法是否存在,
否则,如果提示是 "string"
尝试obj.toString()和obj.valueOf(),无论存在什么。
否则,如果提示为"number"或"default"
尝试obj.valueOf()和obj.toString(),无论存在什么。
let user = {
name: "John",
money: 1000,
[Symbol.toPrimitive](hint) {
alert(`hint: ${hint}`);
return hint == "string" ? `{name: "${this.name}"}` : this.money;
}
};
// conversions demo:
alert(user); // hint: string -> {name: "John"}
alert(+user); // hint: number -> 1000
alert(user + 500); // hint: default -> 1500
------ 或者 ------
let user = {
name: "John",
money: 1000,
// for hint="string"
toString() {
return `{name: "${this.name}"}`;
},
// for hint="number" or "default"
valueOf() {
return this.money;
}
};
alert(user); // toString -> {name: "John"}
alert(+user); // valueOf -> 1000
alert(user + 500); // valueOf -> 1500