typeof两种写法的一点差异

2017-11-13  本文已影响0人  留白的未来
typeof 的两种写法:
但是昨天遇到了一个情况,大概是这样子:
document.write(typeof 18-'aaa');
... 
document.write(typeof(18-'aaa'));

结果屏幕输出的却是
NaN number

问题来了,一个方法的两种写法,为什么结果会不一样呢?

想来想去,归根结底还是个 运算符 的优先级 问题。

运算符 描述
. [] () 字段访问、数组下标、函数调用以及表达式分组
++ -- - ~ ! delete new typeof void 一元运算符、返回数据类型、对象创建、未定义值
* / % 乘法、除法、取模
+ - + 加法、减法、字符串连接
<< >> >>> 移位
< <= > >= instanceof 小于、小于等于、大于、大于等于、instanceof
== != === !== 等于、不等于、严格相等、非严格相等
& 按位与
^ 按位异或
¦ 按位或
&& 逻辑与
¦¦ 逻辑或
?: 条件
= oP= 赋值、运算赋值
, 多重求值
解析:

typeof (18-'aaa')= typeof(NaN) = "number"

typeof 18-'aaa' = (typeof 18)-'aaa' = “number”-“aaa” = NaN

总结:

js语法中有不少看似一样效果的不同写法,但还是建议按照最严谨的写法来。
类似的还有:

强转数值类型中的数制( 0 八进制,0x 十六进制)
document.writeln(Number('0xf'));
document.writeln(parseInt('0xf'));
document.writeln(parseFloat('0xf'));

结果是
15 15 0
parseFloat理解成了提取‘0xf’字符串中的数值。

document.writeln(Number('070'));
document.writeln(parseInt('070'));
document.writeln(parseFloat('070'));

70 70 70
都理解成了提取‘070’字符串中的数值。

document.writeln(Number("070",8));
document.writeln(parseInt("070",8));
document.writeln(parseFloat("070",8));

70 56 70
只有parseInt明白了要做什么。

所以要强转数制,还是要严格写法。

document.writeln(Number(070));
document.writeln(parseInt(070));
document.writeln(parseFloat(070));

56 56 56

养成一个良好的书写习惯,可以避免不少莫名其妙的bug。

一家之言,欢迎斧正!

上一篇下一篇

猜你喜欢

热点阅读