这是《你不知道的 JS 》上的内容,书上的解释如下:
比较双方首先调用 toPrimitive,如果结果出现非字符串,就根据 ToNumber 规则将双方强制类型转换为数字进行比较
[42] < ['43'] // true
a 和 b 并没有转换为数字,因为 toPrimitive 返回的是字符串,所以这里比较的是 “ 42 ” 和 "043" 这两个字符串
[42] < ['043'] // false
我想问的是,第一个表达式为什么 toPrimitive 会转换为数字,而第二个表达式却说并没有转换为数字?
1
MinonHeart 2017-05-05 19:08:19 +08:00
[42].toString() -> '42'
['43'].toString() -> '43' '42'.charCodeAt(0) == '43'.charCodeAt(0) '42'.charCodeAt(1) < '43'.charCodeAt(1) 所以 [42] < ['43'] |
2
xilixjd OP @MinonHeart 好的,明白了,那书上描述是不是写错了,并不是转换为数字啊
|
3
FrankFang128 2017-05-05 19:24:56 +08:00 2
神经病才比较这两个东西
|
4
Kisesy 2017-05-05 19:25:10 +08:00
不太了解 js ,不过我觉得也许 js 默认并不把八进制的字符解析成整数
|
5
xilixjd OP @FrankFang128 实际上书上并没有刻意比较这两个东西,只是说明了一下比较符号(<,>)的性质
|
7
FrankFang128 2017-05-05 19:36:19 +08:00
任何不同类型的值,都不要直接比较,没有任何意义。
|
8
noe132 2017-05-05 19:37:07 +08:00
参考
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-abstract-relational-comparison x < y 首先将 x 和 y 调用 toPrimitive(x ,hint number) toPrimitive(y ,hint number) 保存为 px py 根据上面情况,toPrimitive 会返回对 x 和 y 先调用 valueOf 当返回结果类型是 Object,或者不能调用 valueOf 则调用 toString 当返回结果类型是 Object,或者不能调用 toString 抛出 TypeError [42].toString() // "42" ['43'].toString() // "43" 根据上面情况,当 px py 都为 string 时 如果 py 是 px 的 prefix 返回 false. 如果 px 是 py 的 prefix 返回 true. 如果都不,则对 px 和 py 进行一个字符一个字符的对比 "42" "43" 第一位 '4' 相同 第二位'2' 和 '3'的 charcode 比较 '2'比'3'的 charcode 小 返回 true 类似的 [42] < ['043'] 的比较,前几步类似,在后面比较时'4' 和 '0'的 charcode 比较 '4'大于 '0' 所以结果是 false |
9
MinonHeart 2017-05-05 19:38:25 +08:00 via iPhone
@xilixjd 左右两边 toPrimitive 转换后都是字符串
|
10
noe132 2017-05-05 19:39:57 +08:00
Q: 我想问的是,第一个表达式为什么 toPrimitive 会转换为数字,而第二个表达式却说并没有转换为数字?
A: 实际上,第一个表达式 toPrimitive 也是字符串。比较的规则在 ecma-262 里,查规范就知道内部是怎么进行比较的了。只是你感觉好像转化成了数值。 |
11
jamesxu 2017-05-05 19:46:18 +08:00 via iPhone
js 是个蛋疼的语言
|
12
xilixjd OP |
14
sensui7 2017-05-05 20:34:21 +08:00
而且, 很多东西对实际编程 js 没多大用.
|