-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 2 题:['1', '2', '3'].map(parseInt) what & why ? #4
Comments
parseInt 基数是一个介于2和36之间的整数 可能第二点这个说法不太准确 |
在30-seconds-of-code看到一个这个题的变形,分享一下
|
我开始也这么理解:第二个参数需要的范围是2~36之间,如果小于 2 或者大于 36,则 parseInt() 将返回 NaN。但是parseInt(5,4),第二个参数在[2,36]之间,但是结果依旧返回NaN啊。 |
这是今天在 Advanced-Frontend组织 看到一个比较有意思的题目。 ['10','10','10','10','10'].map(parseInt);
// [10, NaN, 2, 3, 4] parseInt
const intValue = parseInt(string[, radix]);
parseInt(100); // 100
parseInt(100, 10); // 100
parseInt(100, 2); // 4 -> converts 100 in base 2 to base 10 注意:
更多详见parseInt | MDN map
var new_array = arr.map(function callback(currentValue[,index[, array]]) {
// Return element for new_array
}[, thisArg]) 可以看到 const arr = [1, 2, 3];
arr.map((num) => num + 1); // [2, 3, 4] 更多详见Array.prototype.map() | MDN 回到真实的事例上回到我们真实的事例上 ['1', '2', '3'].map(parseInt) 对于每个迭代 ['1', '2', '3'].map((item, index) => {
return parseInt(item, index)
}) 即返回的值分别为: parseInt('1', 0) // 1
parseInt('2', 1) // NaN
parseInt('3', 2) // NaN, 3 不是二进制 所以: ['1', '2', '3'].map(parseInt)
// 1, NaN, NaN 由此,加里·伯恩哈德例子也就很好解释了,这里不再赘述 ['10','10','10','10','10'].map(parseInt);
// [10, NaN, 2, 3, 4] 如何在现实世界中做到这一点如果您实际上想要循环访问字符串数组, 该怎么办? ['10','10','10','10','10'].map(Number);
// [10, 10, 10, 10, 10] |
parseInt(string, radix) |
parseInt(string, radix),radix在 (2, 8)的时候,Number(string) < radix。 |
4进制最大数是3,5大于3,所以NaN。 |
ratio 值为 (2, 8)的时候,parseInt的第一个参数必须小于ratio |
第二个参数是处于2~36没错,但是第二个参数代表解析的进制数,在四进制里面是不可能会出现5这个数字的,所以返回的就是NaN,要想转成5的话应该是parseInt('11', 4)结果就是5 |
copyed from W3School |
['1', '2', '3'].map(parseInt)等价于[parseInt('1',0), parseInt('2',1), parseInt('3',2)] |
总之 radix在[2-9]区间内 Number(string.charAt(0)) 不能大于等于 radix |
基数为1(1进制)的时候,返回的结果都是NaN,所以parseInt('2', 1)返回结果是NaN |
根据上边大家所述的原理,事实上如果想要完成字符串转化为数字的工作,应该将进制限制下来:
当然最简单就是干脆别传这个index了,免得像parseInt()这种可以接受多个参数的函数面对一大堆参数时不知所措
|
其实这个可以用函数式思维来解决,具体可以看月影老师写的这篇博文 |
parseInt('11', "4") 这个为啥等于5呢,他4进制,11应该也不在其范围内么,怎么会得出的结果为5呢 |
'11'表示的是4进制的数啊 5 是十进制 1=>1 2=>2 3=>3 10=>4 11=>5 |
第一步,“11”以非"0x" or "0X" or "0" 开头,“11”转为数字11,即parseInt(11, "4")。 |
明白了,谢谢 |
|
一般对我来说,在平时coding时,都是箭头函数,这点能避免很多问题的,另外 parseInt在使用时,我一般都是会加上第二个参数为10 |
这么多答案,而且那些答案也说得有理有据,分析得非常深入 |
@thinkfish 哈哈 实际应用肯定是最小减少问题,但原理了解透彻还是很有必要的嘛 |
在理,至少在遇到问题的时候能快速定位 |
这种方法绕过了parseInt的第二个参数,实际执行如下: |
@developement711 |
map接收一个函数,函数第一个参数为当前遍历的值,第二个参数为index,然后parseInt函数,第一个参数为要解析的值,第二个参数为进制,根据这个进制返回对应的十进制整数。所以题目的返回值可以简化为
|
💛 ['1', '2', '3'].map(parseInt) what & why ? [1,NaN,NaN] parseInt(string, radix):将一个字符串 string 转换为 radix 进制的整数, radix 为介于2-36之间的数。
radix 可选
所以: |
5不是有效的4进制的有效数字 |
我不是很明白, |
你这种情况基地为4,前面为5,肯定是NAN啊。parseInt(10,4) = 4 parseInt(11,4) = 5 。(满4进1) |
觉得parseInt对于进制解析,比较好理解的类似parseInt('20',4) 结果是8,但是对于parseInt('21',4),结果是9,也比较好理解,但是!!!!对于parseInt('25',4),结果是2,这个会比较容易错乱,其实这里是因为5不是4进制以内的数字,所以这里等价于parseInt('2',4),所以结果是2,楼上说的满4进1说法,个人觉得并不准确 |
好棒 |
很容易忽略 map 的第二个参数要传到 parseInt 的进制参数里,造成错误,这题有点意思! |
map 返回三个参数,parseInt 就自动接收前两个参数的原因就是因为实参的原因吗?有相关的文章可以参考吗? |
@xingorg1 不是这样的,
不是这样的,parseInt(5,4),会变成parseInt("5",4),但是如果4进制的话,字符串每个位置上的最大值肯定是小于等于4的 |
我觉得还是传使用是最好的 |
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map#example_using_map_generically |
['1', '2', '3'].map(function(item, index) {
return parseInt(item, index)
}) index被当做了进制 |
因为map的 callback 函数会被自动传入三个参数:数组元素,元素索引,原数组本身。 题目中 ['1', '2', '3'].map(parseInt) 结合map源码 /*Array.prototype.map implementation*/
Array.prototype.map = function (callback/*, thisArg*/) {
var T, A, k;
if (this == null) {
throw new TypeError('this is null or not defined');
}
// 原数组
var O = Object(this);
var len = O.length >>> 0;
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function');
}
if (arguments.length > 1) {
T = arguments[1];
}
A = new Array(len);
k = 0;
while (k < len) {
var kValue, mappedValue;
// k是元素索引
if (k in O) {
// 数组元素
kValue = O[k];
// 注意这里kValue = ["1", "2", "3"][0], 当前数组元素传入了、索引也传入了、原数组也传入了
mappedValue = callback.call(T, kValue, k, O);
A[k] = mappedValue;
}
k++;
}
return A;
}; 但因为parseInt只接收2个,所以 考点
|
类似的还有String.prototype.substring.call(undefined),实在是搞不清楚这类题有啥考察的必要,这类题只要翻规范就能知道答案。难道是考察对规范的熟悉程度么,但是仅仅道题也体现不出对规范的熟悉程度吧,就算要考察对规范的熟悉程度那也不应该考察有啥特殊标识符,有啥新功能,介绍一下XX机制之类的么,随便找个实现细节就用来做面试题真有种为了卷而卷的感觉 |
没人觉得这个map()很不合理吗?为什么要热心地再给个index参数呢,多余还埋雷。 |
第二点解释不妥当,当parseInt 第二个参数radix 小于 2 或大于 36时,parseInt直接返回 NaN |
答案:
|
parseInt(5,4) 是因为规定的是按四进制解析 但是5 明显已经超出了 四进制的最大值 所以被解析为 了 NaN |
好经典的题 360 考过 parseInt(x,y);
// x 为 string
// y 为进制 取值范围 2-36 默认十进制
|
基数的范围是2-36,不在此范围内,parseInt直接返回NaN |
===> 看了老哥的解析瞬间明白了,思路清晰 parseInt("454",5) 当解析454时,4属于范围内,所以得到4,但是5不属于,所以走到这里直接把后面全部抛弃掉, 相当于parseInt("4",5); ---最终得到4。 parseInt("44",5) 当解析44时,4属于范围内,后面那个4还是在范围内,所以,算作一个整体,属于正常,不进行任何操作 根据进制算法,最终算出,从右往左 45^0+45^1 = 24 parseInt("445",5) 当解析445时,4属于范围内,后面那个4还是在范围内, 但是在后面的5不属于, 所以,5抛弃掉,只取44,相当于 parseInt("44",5); , 根据进制算法,最终算出,从右往左 45^0+45^1 = 24 parseInt("544",5) 当解析544时,5直接不属于范围内,所以全部抛弃掉,只取"", 相当于parseInt("",5); 返回NaN parseInt("5",5) 当解析5时,5直接不属于范围内,所以全部抛弃掉,只取"", 相当于parseInt("",5); 返回NaN |
脑壳疼 |
这是来自QQ邮箱的假期自动回复邮件。 您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
将字符串解析指定为 指定进制 字符串中的值应该小于 进制的值 不然返回NaN parseInt('100', 2); 000 001 010 011 100 ==>4 parseInt("17",8); 00 01 02 03 04 05 06 07 10 11 12 13 14 15 16 17 ==>15 parseInt("11",2); 00 01 10 11 =》 3 |
这是来自QQ邮箱的假期自动回复邮件。 您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
parseInt(5, 4)是NaN是因为 5不能用4进制来表示 |
这是来自QQ邮箱的假期自动回复邮件。 您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
第一眼看到这个题目的时候,脑海跳出的答案是 [1, 2, 3],但是真正的答案是[1, NaN, NaN]。
var new_array = arr.map(function callback(currentValue[, index[, array]]) { // Return element for new_array }[, thisArg])
这个callback一共可以接收三个参数,其中第一个参数代表当前被处理的元素,而第二个参数代表该元素的索引。
而parseInt则是用来解析字符串的,使字符串成为指定基数的整数。
parseInt(string, radix)
接收两个参数,第一个表示被处理的值(字符串),第二个表示为解析时的基数。
了解这两个函数后,我们可以模拟一下运行情况
map函数返回的是一个数组,所以最后结果为[1, NaN, NaN]
最后附上MDN上对于这两个函数的链接,具体参数大家可以到里面看
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map
The text was updated successfully, but these errors were encountered: