typeof 的两种写法:
- typeof a
- typeof(a)
大部分情况下是通用的。
但是昨天遇到了一个情况,大概是这样子:
document.write(typeof 18-'aaa');
...
document.write(typeof(18-'aaa'));
结果屏幕输出的却是
NaN number
问题来了,一个方法的两种写法,为什么结果会不一样呢?
想来想去,归根结底还是个 运算符 的优先级 问题。
运算符 | 描述 |
---|---|
. [] () | 字段访问、数组下标、函数调用以及表达式分组 |
++ -- - ~ ! delete new typeof void | 一元运算符、返回数据类型、对象创建、未定义值 |
* / % | 乘法、除法、取模 |
+ - + | 加法、减法、字符串连接 |
<< >> >>> | 移位 |
< <= > >= instanceof | 小于、小于等于、大于、大于等于、instanceof |
== != === !== | 等于、不等于、严格相等、非严格相等 |
& | 按位与 |
^ | 按位异或 |
¦ | 按位或 |
&& | 逻辑与 |
¦¦ | 逻辑或 |
?: | 条件 |
= oP= | 赋值、运算赋值 |
, | 多重求值 |
解析:
- typeof (18-'aaa')中,
() 运算符优先度比 typeof 高,所以 (18-'aaa') 内优先计算得出 typeof(NaN) ,
然后进行typeof运算判断类型,结果是 "number" 。
typeof (18-'aaa')= typeof(NaN) = "number"
- typeof 18-'aaa'中,
typeof 优先级比 - 高,所以先进行 typeof 18 运算,返回一个“number”,
此时运算式就变成了 “number”-“aaa” ,结果就是个 NaN .
typeof 18-'aaa' = (typeof 18)-'aaa' = “number”-“aaa” = NaN
总结:
js语法中有不少看似一样效果的不同写法,但还是建议按照最严谨的写法来。
类似的还有:
强转数值类型中的数制( 0 八进制,0x 十六进制)
- 例如:将16进制的f转换为10进制
document.writeln(Number('0xf'));
document.writeln(parseInt('0xf'));
document.writeln(parseFloat('0xf'));
结果是
15 15 0
parseFloat理解成了提取‘0xf’字符串中的数值。
- 再如:将8进制的70转换为10进制
document.writeln(Number('070'));
document.writeln(parseInt('070'));
document.writeln(parseFloat('070'));
70 70 70
都理解成了提取‘070’字符串中的数值。
- 再再如:这次补充说明要进行8进制转换为10进制
document.writeln(Number("070",8));
document.writeln(parseInt("070",8));
document.writeln(parseFloat("070",8));
70 56 70
只有parseInt明白了要做什么。
所以要强转数制,还是要严格写法。
- 明确告诉ECMA,我丢给你的是一个数值,而不是字符串,我要你进行数制转换,而不要去尝试从中提取数值。
document.writeln(Number(070));
document.writeln(parseInt(070));
document.writeln(parseFloat(070));
56 56 56
养成一个良好的书写习惯,可以避免不少莫名其妙的bug。
一家之言,欢迎斧正!
网友评论