Javascript 中参数传递问题? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
Pichai
V2EX    Javascript

Javascript 中参数传递问题?

  •  
  •   Pichai 2020-02-06 14:07:11 +08:00 3273 次点击
    这是一个创建于 2102 天前的主题,其中的信息可能已经有所发展或是发生改变。

    廖雪峰 Javascript 教程,把数组中的字符型转换为数值型。

     var arr=['1','2','3',]; var r=arr.map(parseInt); console.log(r); // 此处打印的是 1,NaN,NaN 

    别人给出的解释,这个解释没有看太明白。请从参数传递的角度详细解释一下。谢谢大家。

     因为 map()实际上会传入三个参数:(currentValue, index, callingArray)。parseInt 接受两个参数(string, radix),第二个参数声明底数(即指定被转换的“数字”多少进制)。 有关 parseInt 的 radix,当遇到 0、undefined 或未被指定时,parseInt 有如下行为: 1.被转换的字符串起于"0x"/"0X" --> 十六进制转为十进制; 2.被转换的字符串起于"0" --> 八进制或十进制(由解释器决定)转为十进制; 3.被转换字符串起于其他值 --> 十进制转为十进制。 当 arr = [1,2,3]时,arr.map(parseInt)实际为: parseInt('1', 0); // 按十进制转换'1' parseInt('2', 1); // 按一进制转换'2',但一进制中只有 0 没有 1 parseInt('3', 2); // 按二进制转换 3,但二进制中只有 0 和 1 没有 2 所以后两个只能报错了。 
    第 1 条附言    2020-02-06 17:43:50 +08:00
    谢谢大家了,自己是对于将函数作为参数传递这里没理解清楚。
    13 条回复    2020-02-07 05:01:52 +08:00
    chuangy
        1
    chuangy  
       2020-02-06 14:16:48 +08:00   2
    arr.map(parseInt) 等于 arr.map((value, index) => parseInt(value, index)) ,这样明白吗?
    ayase252
        2
    ayase252  
       2020-02-06 14:17:58 +08:00   1
    map 中回调函数的签名是(currentValue, index, array),当前值,索引号和数组本身,返回值就是结果中对应位置的值。

    如果你使用 parseInt 作为 map 的回调函数,其实是不符合约定的,因为 parseInt 的签名是(string, radix),分别是字符串和基数。这相当于把 index 作为基数来解析字符串,稍微想想也应该觉得不合理。
    lovedebug
        3
    lovedebug  
       2020-02-06 14:18:04 +08:00
    你看一下 MDN 对于 map 模拟源码就明白了。 建议直接看一下 map 的实现
    Ruohua3kou
        4
    Ruohua3kou  
       2020-02-06 14:19:03 +08:00
    tuobaye0711
        5
    tuobaye0711  
       2020-02-06 14:19:23 +08:00 via Android   1
    传入数组的下标对应着 parseInt 的进制的参数
    Pichai
        6
    Pichai  
    OP
       2020-02-06 14:32:07 +08:00
    谢谢大家,明白了。map 源码哪里没有理解清楚,现在搞清楚了。
    otakustay
        7
    otakustay  
       2020-02-06 15:25:45 +08:00
    转数字用.map(Number)
    optional
        8
    optional  
       2020-02-06 15:32:06 +08:00
    用 .map(Math.floor) .map(Math.ceil)
    Mutoo
        9
    Mutoo  
       2020-02-06 15:35:14 +08:00
    分享一篇 N 年前的 map 源码分析
    https://blog.mutoo.i/2013/12/array-map-with-parseint/
    learnshare
        10
    learnshare  
       2020-02-06 15:52:57 +08:00
    map 不建议用来遍历数组,只用作挨个处理元素即可

    https://developer.mozilla.org/en-US/docs/Web/Javascript/Reference/Global_Objects/Array/map#When_not_to_use_map

    >Since map builds a new array, using it when you aren't using the returned array is an anti-pattern; use forEach or for-of instead.
    learnshare
        11
    learnshare  
       2020-02-06 15:53:50 +08:00
    @learnshare 只用作挨个处理元素 *并返回新数组* 即可
    welling
        12
    welling  
       2020-02-07 00:35:29 +08:00
    这种简写,老司机都会翻车
    Pichai
        13
    Pichai  
    OP
       2020-02-07 05:01:52 +08:00
    @welling 这个是廖雪峰的教程,为了避免翻车的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2729 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 13:34 PVG 21:34 LAX 05:34 JFK 08:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86