数据类型
最新的 ECMAScript 标准定义了8种数据类型:// 基本数据类型
Boolean // true false
String // 字符串是一串表示文本值的字符序列,例如 'vuejs'
Number // 整数或浮点数,例如:42 或者 3.14159
BigInt // 可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制
undefined // undefined 表示变量未定义时的属性
null // 一个表明 null 值的特殊关键字。 JavaScript 是大小写敏感的,因此 null 与 Null、NULL或变体完全不同
Symbol // 一种实例是唯一且不可改变的数据类型
// obj
Object // 对象数据类型的转换
四则运算符
// 加法
1 + '1' // 11
true + true // 2
4 + [1,2,3] // 41,2,3
'a' + + 'b' // aNaN
// 其他运算符
4 * '3' // 12
4 * [] // 0
4 * [1, 2] // NaN- 加法
- 运算中其中一方为字符串,那么就会把另一方也转换为字符串。
- 如果一方不是字符串或者数字,那么会将它转换为数字或者字符串。
- 另外对于加法还需要注意这个表达式
'a' + + 'b',因为+ 'b'等于NaN,所以结果为aNaN,你可能也会在一些代码中看到过 + ‘1’ 的形式来快速获取number类型。
- 其他运算符
- 只要其中一方是数字,那么另一方就会被转为数字。
对象转原始类型
对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数,对于该函数来说,算法逻辑一般来说如下:
- 如果已经是原始类型了,那就不需要转换了
- 调用
valueof(),如果转换为基础类型,就返回转换的值 - 调用
toString(),如果转换为基础类型,就返回转换的值 - 如果都没有返回原始类型,就会报错
当然你也可以重写 Symbol.toPrimitive ,该方法在转原始类型时调用优先级最高。
let a = {
valueof() {
return 0;
},
toString() {
return '1';
},
[Symbol.toPrimitive]() {
return 2;
}
}
console.log(1 + a) // 3比较运算符
- 如果是对象,就通过 toPrimitive 转换对象
- 如果是字符串,就通过 unicode 字符索引来比较
let a = {
toString(){
return 0;
},
vauleOf(){
return 1;
}
}
console.log(a > -1); // true转Boolean
在条件判断时,除了 undefined, null, false, NaN, '', 0, -0,其他所有值都转为 true,包括所有对象。