JS-Implicit-Type-Conversion
T -> Number/算数类型
Number() 显式构造
- String
- 空 => 0
- 合法字面值 => parse正确
- 不具有parseint, parsefloat的灵活性
- Boolean
- t/f => 1/0
- null => 0
- undefined => NaN
- Function, Date, RegExp, Array, Customized Type(等等种种引用类型)
- 先toString(), 再遵循第一条
T -> String/字符串
toString()方法 String()显式构造
- Number
- 格式化输出
- ‘true’ ‘false’ ‘null’ ‘undefined’ ‘NaN’
- Function, Date, RegExp => 包围字面值
- Array => ‘,’.join(Array)
- Customized Type => ‘[object Object]’
注意+的overload: 算数类型运算引发Number转换, 而+字符串拼接引发String转换
T -> Boolean/布尔类型
没有其他中间过程的隐式转换 任何引用类型(Object)均为true 布尔等价于值类型布尔, 即true/false, T/F
- 5兄弟为false, 其余为true
- String中空字符串
- Number中0, 0.0
- Number中NaN
- undefiend
- null
注意: ! !! ? : if for while 触发Boolean转换, 一般先进行Evaluate
注意: && || 是脚本式返回值 即左/右operand, 然后一般触发如上转换
- 注意: 然后一般
== 隐式转换规则
与===的唯一差别是不同type时是否进行ITC 同type时/后无差别 与Python不同, JS值类型比较值, 引用类型比较地址
- 引用类型与引用类型
此时是===/==同义, 即比较地址 一般binding 同一个ooob才相等 引用类型比较地址
- 引用类型与算数类型(NaN)
- 引用转换为算数类型(详见以上)
- 而后值类型比较(值类型比较值)
- 引用类型与字符串
- 引用类型转换为字符串(详见以上)
- 而后值类型比较(值类型比较值)
- 引用类型与布尔类型
- 引用类型装换为算数类型(详见以上)
- 布尔类型转换为算数类型(详见以上)
- 而后值类型比较(值类型比较值)
注意不是引用类型转布尔! 啊呀! 远远不及Python Intuitively!
- 字符串与算数类型
- 字符串转换为算数类型(详见以上)
- 而后值类型比较
- 字符串与布尔类型
- 都转换为算数类型(详见以上)
- 而后值类型比较
- 布尔类型与算数类型
- 布尔类型转换为算数类型(详见以上)
- 而后值类型比较
- 总结
==
左右type不同, 转换为算数类型(值类型算数类型等价于Number()作用
)null
undefined
是特例记住规则既是类型, 也是单例
- 不会转换为算数类型, 而是与其他任何都不相等(!==/!=)
!==是显然的
- 二者之间
null == undefiend
null !== undefiend
- 不会转换为算数类型, 而是与其他任何都不相等(!==/!=)
- 引用类型与字符串凑合到一起时特例?
[] == [] // false
[] == 0 // true
({}) == NaN // Number('[object Object]') == NaN false
// NaN 牛逼
//
[] == '' // true
({}) == '' // false
[12] == '12' // true
[12, 13] == '12,13' // true
[12] == '12px' // false
[] == false // true
![] == false // true 优先级!引发布尔转换
[1] == true // true
[3] == true // false
[1, 1] == true // false
- Hold on / Hold Fast To
PREVIOUSCPP-template-advanced
NEXTJS-Reference