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 · 2760 次点击
    这是一个创建于 1756 天前的主题,其中的信息可能已经有所发展或是发生改变。

    廖雪峰 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.im/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   ·   实用小工具   ·   1017 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:20 · PVG 04:20 · LAX 12:20 · JFK 15:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.