JavaScript的类型及其隐式类型转换特性

75 阅读2分钟

什么是弱类型语言?

在编程语言中,弱类型语言指的是在运算时能够隐式转换类型的语言。JavaScript是典型的弱类型语言,它会在运行时自动进行类型转换,而不需要显式指定。

JavaScript的类型

原始类型:number,string,bigInt,symbol,undefined,null,boolean
引用类型:Object(包含Array,RegExp,Math,Function,Date,这些类型的原型就是Object)

类型转换规则

JS中,类型转换只有三种:1. 转换成数字 2.转换成布尔值3. 转换成字符串 转换具体规则如下:

原始值转换目标结果
number布尔值除了 0-0NaN 都为 true
string布尔值除了空串 ("") 都为 true
undefinednull布尔值false
引用类型布尔值true
number字符串5 => "5"
Boolean、函数、Symbol字符串'true'
数组字符串[1,2] => "1,2"
对象字符串"[object Object]"
string数字'1' => 1'a' => NaN
数组数字空数组为 0,单数字元素转数字,其他 NaN
null数字0
非数组的引用类型数字NaN
Symbol数字抛错
加法运算 +
操作数类型转换规则示例
任意 + String另一个操作数转换为 String1 + "2""12"
其他情况转换为 Number 后相加true + false1 + 01
相等比较 ==
比较类型转换规则示例
Number == StringString 转换为 Number0 == ""0 == 0true
Boolean == 其他Boolean 转换为 Numbertrue == "1"1 == "1"1 == 1true
Object == 原始类型Object 转换为原始类型[1] == 1"1" == 11 == 1true
null == undefined总是 truenull == undefinedtrue

总结提示

  1. 使用 ===!== 可避免隐式转换
  2. 显式转换更安全:Number(), String(), Boolean()
  3. 复杂对象的转换结果可能出乎意料,需特别注意

对象转原始类型的流程

对象转原始类型,会调用内置的[ToPrimitive]函数,对于该函数而言,其逻辑如下:

1)如果Symbol.toPrimitive()方法,优先调用再返回

2)调用valueOf(),如果转换为原始类型,则返回

3)调用toString(),如果转换为原始类型,则返回

var obj = {
 value: 3,
 valueOf() {
 return 4;
 },
 toString() {
 return '5'
 },
 [Symbol.toPrimitive]() {
 return 6
 }
 }
 console.log(obj + 1); // 输出7

4)如果都没有返回原始类型,会报错

let obj = {
  valueOf() {
    return {};
  },
  toString() {
    return {};
  }
};
console.log(obj + 1); // TypeError

拓展点

如何让if(a == 1 && a == 2)条件成立?

var a = {
    value: 0,
    valueOf() {
        return ++this.value
    }
}
 console.log(a == 1 && a == 2);//true