什么是弱类型语言?
在编程语言中,弱类型语言指的是在运算时能够隐式转换类型的语言。JavaScript是典型的弱类型语言,它会在运行时自动进行类型转换,而不需要显式指定。
JavaScript的类型
原始类型:number,string,bigInt,symbol,undefined,null,boolean
引用类型:Object(包含Array,RegExp,Math,Function,Date,这些类型的原型就是Object)
类型转换规则
JS中,类型转换只有三种:1. 转换成数字 2.转换成布尔值3. 转换成字符串 转换具体规则如下:
| 原始值 | 转换目标 | 结果 |
|---|---|---|
| number | 布尔值 | 除了 0、-0、NaN 都为 true |
| string | 布尔值 | 除了空串 ("") 都为 true |
undefined、null | 布尔值 | 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 | 另一个操作数转换为 String | 1 + "2" → "12" |
| 其他情况 | 转换为 Number 后相加 | true + false → 1 + 0 → 1 |
相等比较 ==
| 比较类型 | 转换规则 | 示例 |
|---|---|---|
| Number == String | String 转换为 Number | 0 == "" → 0 == 0 → true |
| Boolean == 其他 | Boolean 转换为 Number | true == "1" → 1 == "1" → 1 == 1 → true |
| Object == 原始类型 | Object 转换为原始类型 | [1] == 1 → "1" == 1 → 1 == 1 → true |
| null == undefined | 总是 true | null == undefined → true |
总结提示
- 使用
===和!==可避免隐式转换 - 显式转换更安全:
Number(),String(),Boolean() - 复杂对象的转换结果可能出乎意料,需特别注意
对象转原始类型的流程
对象转原始类型,会调用内置的[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