你要知道的JavaScript--隐式类型转换

341 阅读2分钟

数学运算(+ - * /)的类型转换

”+“ 运算符都是字符串拼接和数字的加。

 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