- 隐式转换
toPrimitive 方法会将值转换为基本类型,一般是 string 和 number,再通过 string 和 number 转换为 boolean 等等
(1)当 type 为 number
时
- valueOf -> toString -> TypeError
(2)当 type 为 string
时
toString -> valueOF -> TypeError
当调用 Date 的 toPrimitive 时,会默认 type 为 string;否则会默认 type 为 number
隐式转换通常发生在 +
`-\
*\
/`以及 ==、>、< 这些运算符中,这些运算符只能操作基本类型,所以运算第一步就是 toPrimitive 转换成基本类型再进行操作
- 操作符,如果两边有任意一个 string 或通过 toPrimitive 转为 string 的情形;其他情形下两边都会转为 number
1 + '12' // 13
1 + Symbol // Uncaught TypeError: Cannot convert a Symbol value to a number
false + true // 1
'1' + false // '1false'
- 操作符,如果两边有任意一个 string 或通过 toPrimitive 转为 string 的情形;其他情形下两边都会转为 number
- / 操作符,也会转为 number
== 操作符,两边都尽量转为 number
3 == true // false,true 转为 1
'0' == false // true,'0' 转为 0,false 转为 0
<
和>
操作符- 如果两边都是字符串,比较字母表顺序
- 其他情况,转为数字
- 对象转为 toPrimitive ```typescript ‘ca’ < ‘bd’ // false ‘a’ < ‘b’ // true ‘12’ < 13 // true ‘false’ > -1 // true
let a = {} a > 2
a.valueOf() a.toString() b.valueOf() b.toString() a + b
```
+
操作符什么时候用于字符串拼接
- 如果某个操作数是字符串,或能够通过以下步骤转换为字符串,
+
会产生拼接操作 - 如果其中一个是引用类型,首先用 toPrimitive 操作,返回字符串的话会拼接;返回数字的会计算
- 如果不能转换为字符串,则会将其转换为数字类型进行计算
总结:+
其中一个操作数是字符串(或 toPrimitive 得到字符串),则执行字符串拼接,否则执行数字加法;当变为加法的逻辑,只要其中一方是数字,那么另一方就会转为数字
- 为什么会有 BigInt 提案
Number.MAX_SAFE_INTEGET 表示了最大安全数字,在这个数的范围内数字精度不会丢失(不包含小数)。为了解决超出这个范围内的大数的计算问题,JS 需要用到一些三方库,比如 Math.js 。后面 Ecma 小组提案了 BigInt 来解决此问题
- Object.assign 和 … 运算符的区别
… 和 Object.assign 都是浅拷贝,都会转换 string 到包装类型
1.https加密过程,尽量详细
2.为什么数据上报使用1个像素的GIF
3.npm install的原理