美文网首页
typeof两种写法的一点差异

typeof两种写法的一点差异

作者: 留白的未来 | 来源:发表于2017-11-13 12:45 被阅读0次
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。

一家之言,欢迎斧正!

相关文章

网友评论

      本文标题:typeof两种写法的一点差异

      本文链接:https://www.haomeiwen.com/subject/pffzmxtx.html