为什么 document.write(typeof 18-'aaa')返回的是NaN?

为什么 document.write(typeof 18-'aaa')返回的是NaN?

为什么 document.write(typeof 18-'aaa')返回的是NaN?

而document.write(typeof(18-'aaa'))返回的是number.

不应该都是number吗?

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

你第一个的语法不正确哦,这样试试就知道了http://img1.sycdn.imooc.com//climg/5a0919d80001420e04370103.jpg

  • 留白未来 提问者 #1
    老师您看看我这个问答里发的关于运算符优先级的那个回复,看看那样理解有没有问题。因为我看您说的typeof a 好像和我那个typeof(typeof 18-'aaa')是一个意思。不知道我对这个问题的理解对不对。
    2017-11-13 12:26:00
怎么都被占用了呢 2017-11-13 13:37:07

document.write(typeof 18-'aaa')这句话,会这么执行,先执行typeof 18,返回一个“number”,参与减运算,“number”-“aaa”的结果就是个NaN

  • 提问者 留白未来 #1
    立刻懂了!感谢!
    2017-11-13 13:47:10
提问者 留白未来 2017-11-13 12:20:46

现在推测是和运算优先级有关:typeof (18-'aaa')中,()运算符优先度是最高一级,比typeof高,所以(18-'aaa')内优先计算得出typeof(NaN),然后进行typeof运算,结果是number。typeof 18-'aaa'中,typeof 优先级比 - 高,所以先进行typeof运算,运算到-'aaa'的时候发现是非数值无法运算,返回结果是NaN,这里不会再进行类型判断了,因为一开始typeof就已经参与过运算。如果想再进行类型判断,需要写成typeof(typeof 18-'aaa')。

以上,纯粹靠猜。

DWCWDX 2017-11-13 06:31:16

首先你传入参数的格式不对,如果参数是字符串的话,你需要加引号吧,不然编译器怎么知道你传入的是啥;然后第二个,你在加括号之后是以参数形式读进去的,如果你在最外层加上引号,那么参数就会以一个整体字符串读入,而你没加,typeof函数只是读取了第一个“18”,然后后面的忽略了。不过拜托大哥,你本身写的就是bug,为什么还要问为什么出现了bug呢?

  • 提问者 留白未来 #1
    1,18-'aaa'的结果是NaN, 2,NaN本身不是js中的number类型吗?为什么说是bug? 3,typeof不是有两种写法么? 不加()的写法中,只要加引号那结果必然是字符串,那就没有判断类型的意义了吧。而且两种写法是“typeof(查看类型)” 和“typeof 查看类型”,而不是 “typeof ‘查看类型’” 4,“而你没加,typeof函数只是读取了第一个“18”,然后后面的忽略了。”,那结果也应该是number啊。
    2017-11-13 11:44:34
  • 提问者 留白未来 #2
    是不是和一句代码中不同运算的优先级有关?
    2017-11-13 11:54:52
  • DWCWDX 回复 提问者 留白未来 #3
    很认真,我看你的推断很有道理。我说是bug是因为有一定经验的人不会采取这样的写法,思维惯性吧,这次也让我学到了很多,谢谢你的这个问题。
    2017-11-15 14:19:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
HTML5与CSS3实现动态网页 2018
  • 参与学习       1887    人
  • 提交作业       4643    份
  • 解答问题       5760    个

有HTML和CSS基础,却不知道如何进阶?本路径带你通过系统学习,完成从“会做网页”到“做出好的动态网页”的蜕变,迈出成为前端工程师的第一步。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师