资讯专栏INFORMATION COLUMN

记一次js的坑

QiuyueZhong / 1832人阅读

摘要:问题把一个的数组转换成很自然的,我们会这么写但这却得不到我们想要的结果,会变成但如果我们给这个函数包一下,得到的却是正确的结果。所以,第一种写法结果是符合的预期的,虽然他不符合我们的预期。

问题:
把一个["1", "2", "3"]的数组转换成[1,2,3]

很自然的, 我们会这么写:


["1","2", "3"].map(parseInt);

但这却得不到我们想要的结果, 会变成

[1, NaN, NaN]

但如果我们给parseInt这个函数包一下,


["1","2", "3"].map(function(n){ return parseInt(n)});

得到的却是正确的结果。

下面就是要讲一下为什么?

事实上, 第一种写法, 放了2个错误:

在js中, map实际上调用的函数是一个多参数函数, 即function(value, index, array), 更详细的说明是MDN的说明:
> callback is invoked with three arguments: the value of the element, the index of the element, and the Array object being traversed.

也就是说, 第一种写法实际上是这样的:


["1","2","3"].map(function(value,index,array){ return parseInt(value, index, arrary); });

然后这里涉及到第二个错误了。

parseInt也是一个多参数函数;具体定义是parseInt(string, radix);, radix就是进制, MSD还强调Always specify this parameter to eliminate reader confusion and to guarantee predictable behavior.

根据上面展开的函数, 在对"1"执行的是parseInt("1", 0);, 这里要注意, js中会把多余的参数给忽略了~

但radix参数是零的时候, 他会根据第一个string来做判断, 这里是当十进制了。 所以执行成功。

接下的"2"肯定就错啦, radix不能是1进制。

parseInt("3", 2);为什么错, 不是有2进制么? 你见过2进制中有3的么。。。

所以, 第一种写法结果是符合js的预期的, 虽然他不符合我们的预期。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78126.html

相关文章

  • 一次Validform.js表单提交踩的坑

    摘要:刚进公司实习不久,最近公司有一个需求做一个的页面,利用传过来的参数来显示不同的表单内容,不同的表单提交的内容也就不一样。 刚进公司实习不久,最近公司有一个需求,做一个h5的页面,利用传过来的url参数来显示不同的表单内容,不同的表单提交的内容也就不一样。 虽然我刚拿到也觉得so easy,但是就是这个简单的东西也踩了很多坑,记录下来,不再懵逼。 1 隐藏的表单元素的value也会被默认...

    hss01248 评论0 收藏0
  • 【踩坑记录】一次MySQL主从复制延迟的坑

    摘要:最近开发中遇到的一个主从延迟的坑,记录并总结,避免再次犯同样的错误。运行时查询为空,执行完毕后查询时内容存在,初步怀疑是主从延迟问题。报错只是部分失败,确定是主从延迟的问题。接下来,会去学习主从复制的原理,敬请期待。 最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误。 情景 一个活动信息需要审批,审批之后才能生效。因为之后活动要编辑,编辑后也可能触发审批,审...

    cartoon 评论0 收藏0
  • 「Do.012」一次mac版AS3.1升级的坑

    摘要:首发公众号程序员日记作者贤榆的榆如果你觉得有帮助欢迎关注赞赏转发阅读时间字分钟注先简述一下时间线月日周日上午拿到新的下午装好系统晚上从旧的上迁移数据到新。到月号还没有修复,官方也还没有任何关于这方面的恢复。 showImg(https://segmentfault.com/img/remote/1460000016418427?w=690&h=365); 首发公众号:Android程序...

    Anleb 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<