Js中parseInt的使用及注意事项

目录
  • start
  • 回顾一下map
  • 学习一下 parseInt
  • 总结:
  • 总结

start

先看一个题目['1','2','3'].map(parseInt)

乍一看,我写下答案:[1,2,3]

控制台运行:['1',NaN,NaN]

为什么?map函数我很熟悉了,那么问题出在哪里?大概率出在 parseInt上了

回顾一下map

map() 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。总共就两个参数,一个是回调函数,一个是指定对应的this。

1.第一个参数:回调函数

var newArr = [1, 2, 3].map((item, index, arr) => {
  console.log(item, index, arr)
  return item * 2
})
/*
1 0 [ 1, 2, 3 ]
2 1 [ 1, 2, 3 ]
3 2 [ 1, 2, 3 ]
*/

console.log(newArr) // [ 2, 4, 6 ]

回调函数的三个参数依次为:1.当前正在处理的元素;2.当前元素的索引;3.调用map的数组;

2.第二个参数:指定this

var obj = { name: 'obj对象' }

var newArr = [1, 2, 3].map(function (item, index, arr) {
  return item * 2 + this.name
}, obj)

console.log(newArr) // [ '2obj对象', '4obj对象', '6obj对象' ]

这里稍微注意下,这里不能使用箭头函数的形式,因为箭头函数的this没有自己的this对象,内部的this就是定义时上层作用域中的this。

学习一下 parseInt

parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数,radix 是 2-36 之间的整数,表示被解析字符串的基数。

怎么理解:

  • 将一个字符串A转换成数字B;
  • 第一个参数:需要转换的字符串A;
  • 第二个参数:表示进制的基数(用我自己的大白话讲就是:解析字符串A的时候,把A当做多少进制的数字。)

正常的使用:

console.log(parseInt('10')) // 10
console.log(parseInt('10a')) // 10

console.log(parseInt('111', 2)) // 7
console.log(parseInt('A12', 16)) // 2578

注意事项:

对于 parseInt 第一个参数。如果参数不是一个字符串,则将其转换为字符串 (使用 ToString抽象操作)。字符串开头的空白符将会被忽略。

对于 parseInt 第二个参数。从 236 的整数,表示进制的基数。例如指定 16 表示被解析值是十六进制数。如果超出这个范围,将返回 NaN。假如指定 0 或未指定,基数将会根据字符串的值进行推算。注意,推算的结果不会永远是默认值 10!文章后面的描述解释了当参数 radix 不传时该函数的具体行为。

1. 第一个参数如果不是字符串,会被转换为字符串,且开头空白符会被忽略。

console.log(parseInt(10)) // 10
console.log(parseInt('            10')) // 10
console.log(parseInt('  11   22')) // 11 /* 如果字符之间有空格,读取第一个 */

2. 第二个参数,取值范围为 2-36 的整数,如果超出这个范围,将返回 NaN

console.log(parseInt('10', 1)) // NaN
console.log(parseInt('10', 2)) // 2
console.log(parseInt('10', 36)) // 36
console.log(parseInt('10', 37)) // NaN

3. 第二个参数假如指定 0 或未指定,基数将会根据字符串的值进行推算。

console.log(parseInt('10')) // 10
console.log(parseInt('010')) // 10   /* 某些浏览器这里会解读成 8进制 */
console.log(parseInt('ox10')) // NaN

/* 第二个参数如果是字符串,会被尝试读取数字 */
console.log(parseInt('10', '36')) // 36

/* **我实践的结果:** 第二个参数如果是字符串,会被尝试读取数字,无法读取,默认基数将会根据字符串的值进行推算*/
console.log(parseInt('10', '7tamato')) // 10
console.log(parseInt('10', 'tamato7')) // 10
console.log(parseInt('0x10', 'tamato7')) // 16

估算的方式:

  • 如果输入的 string 以 0x 或 0X(一个 0,后面是小写或大写的 X)开头,那么 radix 被假定为 16,字符串的其余部分被当做十六进制数去解析。
  • 如果输入的 string 以 “0”(0)开头,radix 被假定为 8(八进制)或 10(十进制)。具体选择哪一个 radix 取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制),但不是所有的浏览器都支持。因此,在使用 parseInt 时,一定要指定一个 radix。
  • 如果输入的 string 以任何其他值开头,radix 是 10 (十进制)。

4. 解析的字符串包含的数字超过 基数,返回NaN

console.log(parseInt('3', 2)) // NaN
console.log(parseInt('4', 3)) // NaN
console.log(parseInt('1324', 3)) // NaN

5. 小数点后超过7位

console.log(parseInt(0.000005)) // 0
console.log(parseInt(0.0000005)) // 5

/* 原因是 0.0000005 不是字符串,会被toString() => 5e-7 */
console.log((0.0000005).toString()) // 5e-7

回到初始的问题

['1','2','3'].map(parseInt)

可以理解成这样:

parseInt('1',0,['1','2','3'])
parseInt('2',1,['1','2','3'])
parseInt('3',2,['1','2','3'])
  • parseInt没有第三个参数,所以可以忽略。
  • 基数为0 => 默认10进制
  • 解析的字符串包含的数字超过基数,返回NaN

所以答案:[1,NaN,NaN]

总结:

由于 parseInt 第二个参数的推算并不稳定,所以建议在使用 parseInt 的时候第二个参数也添加上。

再捋捋解析规则:

  • 第一个参数默认为字符串类型,不是字符串类型,会被 toString;如果字符串无法解析,直接返回NaN;
  • 第二个参数指定为 0 或未指定,会根据第一个参数的格式,进行推断。基数的取值范围为 2-36;基数超出范围NaN;

来都来了

来都来了,顺便看一下和parseInt 比较相似的parseFloatparseFloat比较简单,只有一个参数,就是需要解析的字符串。

对于 BigInt 类型的数据,使用 parseInt和 parseFloat 转换BigInt类型的数据,都会存在精度丢失的情况,需要注意下。

end

其实这道题目就是考察,对 parseInt 方法的熟悉程度。

总结

到此这篇关于Js中parseInt的使用及注意事项的文章就介绍到这了,更多相关Js parseInt使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于JavaScript中parseInt()的一个怪异行为解决

    目录 1. parseInt() 中的一个怪异行为 2.解决 parseInt() 该怪异行为 3. 总结 parseInt() 是一个内置的 JavaScript 函数,它可以将数字字符串解析为整数.比如,我们将数字字符串 '100' 解析为整数: const number = parseInt('100'); number; // 100 如预期那样,'100' 被解析为整数 100. parseInt(numericalString, radix) 也接受第二个参数:radix(基数),另

  • 浅谈JavaScript中的parseInt()的妙用

    起因 写这篇博客的起因是今天在刷leetcode的每日一题,是一道字符串转换整数 (atoi)的题,感兴趣的话可以点击题目名称去看一下具体描述.在我多次debug终于成功提交之后,去评论区看了一下大佬们的解题思路,看完之后不禁感叹javascript中原来parseInt( )已经这么优秀了啊.这告诉我了一个道理,我们自认为再熟悉不过的api,可能我们并没有真正意义上的掌握." 我的解答 /** * @param {string} str * @return {number} */ var my

  • JavaScript parseInt()与Number()区别案例详解

    学习目标: parseInt().Number()这两个函数用到最多的地方就是把一个字符串转换成数据类型,那么他们都有哪些区别? 学习内容: parseInt()函数将给定的字符串以指定的基数解析为整数. parseInt(string,radix) 第二个参数表示使用的进制,我们一般使用10进制,也可能会有到8或者16进制.为了避免对"0"和"0x"开头的字符串解析错误,各种javascript编程规范都规定必须要明确给出第二个参数的值,如parseInt(&qu

  • 解析JS参数parseInt('012', 16)和parseInt(012, 16)是否相等

    目录 引言 一.parseInt()的使用说明 1.1 解析数字和字母的混合字符串 1.2 用于浮点数的取整: 1.3 将其他的进制转化为十进制 1.4 parseInt中的隐式转化 二.经典面试题 引言 parseInt('012', 16)和parseInt(012, 16)相等吗? ["10", "10", "10", "10", "10"].map(parseInt)的结果是什么? 先来一起复习一下

  • JS面试题解['1', '7', '11'].map(parseInt) 输出

    目录 输出结果 map函数有问题? 会不会是传入的 parseInt 出现问题 ? 输出结果 ['1', '7', '11'].map(parseInt) // 结果输出 -> [1, NaN, 3] 为什么输出会有 NaN ? 为什么把 11 转成整数会是 3 ? 想把数组里的字符串数字转换成整数,于是使用 map函数来对数组的每一项作用,作用的函数是 parseInt函数,所以预期的结果应该是[1,7,11] ,然而最终浏览器的 JavaScript 引擎给出的答案是 [1, NaN, 3]

  • JavaScript parseInt0.0000005打印5原理解析

    目录 前言 1.什么时候使用parseInt? 2.关于parseInt的一些事情 语法 例子 3. parseInt 是如何转换数字的? 3.1 第一步?将数字转换为字符串 3.2 第二步,做舍入操作 4. 如何安全获取浮点数的整数部分? 5. 举一反三 前言 最近,我在开发项目时遇到了一个奇怪的问题,parseInt (0.0000005) === 5.通常,输出 0 才是正确的,但为什么是 5?让我们一起探讨这个问题. 1.什么时候使用parseInt? 首先,您通常什么时候使用parse

  • Js中parseInt的使用及注意事项

    目录 start 回顾一下map 学习一下 parseInt 总结: 总结 start 先看一个题目['1','2','3'].map(parseInt) 乍一看,我写下答案:[1,2,3] 控制台运行:['1',NaN,NaN] 为什么?map函数我很熟悉了,那么问题出在哪里?大概率出在 parseInt上了 回顾一下map map() 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成.总共就两个参数,一个是回调函数,一个是指定对应的this. 1.第一个参

  • JS中parseInt()和map()用法分析

    本文实例讲述了JS中parseInt()和map()用法.分享给大家供大家参考,具体如下: parseInt()的几个例子 var b = parseInt("01"); alert("b="+b); var c = parseInt("09/08/2009"); alert("c="+c); 结果:b=1,c=0 parseInt()用来解析字符串,返回整数,有几个特点: 1.无视被解析字符串最前和最后的空格,即:"

  • js中parseInt()诡异行为的探究与改正

    探讨背景: 不知道小伙伴们有没有发现,如果是parseInt(0.006)或者parseInt(0.0006)等返回的值都应该 0,但是parseInt(0.0000006)返回的值却诡异的 6,这到底为什么呢? parseInt函数的作用 首先先说一下,parseInt()的作用是什么?他是js原生的方法,是用来把数字字符串转化为Number类型的数字的,还有他只是转化整数部分. parse 是转化,Int 是整型,整数,目的是把里面转换成整数 var num = parseInt(demo

  • js中parseInt函数浅谈

    从很热门的实例parseInt("09")==0说起.parseInt(number,type)这个函数后面如果不跟第2个参数来表示进制的话,默认是10进制.比如说parseInt("010",10)就是10进制的结果:10,parseInt("010",2)就是2进制的结果:2,parseInt("010",8)就是8进制的结果:8,parseInt("010",16)就是2进制的结果:16. 下面我来说

  • js中window.open的参数及注意注意事项

    IE9下使用window.open时需要注意name参数值不能有"-"出现,否则会出现脚本错误,IE9以及版本测试没有问题 window.open(URL,name,specs,replace) 参数 说明 URL 可选.打开指定的页面的URL.如果没有指定URL,打开与新的空白窗口 name 可选.指定target属性或窗口的名称.支持以下值: _blank - URL加载到一个新的窗口.这是默认 _parent - URL加载到父框架 _self - URL替换当前页面 _top

  • JS中的正则表达式及pattern的注意事项

    RegExp对象的创建: 常规的正则表达式的创建可用直接量,即斜杠 "/" 括起来的字符.但在要求参数变化的环境下,RegExp()构造函数是更好的选择: var reg1 = /'\w+'/g; var reg2 = new RegExp('\'\\w+\'','g'); 对比两种创建方式,RegExp中的第一个参数为要创建的正则字符串,一方面注意,因为不是直接量的表示形式,因此不用斜杠" / "括起来了:而是字符串中必须要对引号" ' "和转

  • 基于js中的存储键值对以及注意事项介绍

    前端有时候需要存储键值对,需要主要的一点是键必须为字符串,重要的再次说明,键需要为字符串. 重点内容 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> <script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jque

  • 深入理解JS中Number(),parseInt(),parseFloat()三者比较

    参考阅读: 详解js中Number().parseInt()和parseFloat()的区别 详解JS转换数值函数Number().parseInt().parseFloat() 在项目开发中我们经常会用到转型方法,尤其是JS这种松散型的语言.其中比较常用的方法就是Number()方法和ParseInt()/ParseFloat()方法了,下面我们分别对这几种方法的转型机制进行详细地说明.具体内容详情如下所示: [正文内容] Number() --------------------------

  • 用NODE.JS中的流编写工具是要注意的事项

    Node.js中的流十分强大,它对处理潜在的大文件提供了支持,也抽象了一些场景下的数据处理和传递.正因为它如此好用,所以在实战中我们常常基于它来编写一些工具 函数/库 ,但往往又由于自己对流的某些特性的疏忽,导致写出的 函数/库 在一些情况会达不到想要的效果,或者埋下一些隐藏的地雷.本文将会提供两个在编写基于流的工具时,私以为有些用的两个tips. 一,警惕EVENTEMITTER内存泄露 在一个可能被多次调用的函数中,如果需要给流添加事件监听器来执行某些操作.那么则需要警惕添加监听器而导致的内

随机推荐