用 JS 把字符串转化成整型

2017-06-20 18:28:37 +08:00
 MrFireAwayH
看到一道题要求这样做 也有人给出了实现(我用方法 A 指代) 代码 http://jsbin.com/repakimaqu/edit?js

同时我知道两个波澜号操作的叠加也是可以在一定程度上做到转换字符为数字的(两次取反操作)

比如说

~~"123" === 123; // true

~~"123.123" === 123; // true

对于不能转换的对象 会返回数字 0

那么问题来了

原生 parseInt()

Number()

方法 A

双波澜号

他们之间的差异有哪些?

😪说起来最近被波澜哥洗脑了所以脑子里总是他……
2689 次点击
所在节点    JavaScript
9 条回复
MrFireAwayH
2017-06-20 18:29:42 +08:00
手机码字……格式不好看😪
zythum
2017-06-20 19:21:50 +08:00
所有通过位运算的(不管是~, >>, |)方式转的都会遇到整型上限的问题。所以在不知道数组到底多大的情况下谨慎使用,所以尽量用 parseInt。但是如果你自己情况,那就无所谓了。
v1024
2017-06-20 19:40:18 +08:00
楼主也是波澜哥的粉丝吗
zhuangtongfa
2017-06-20 20:04:35 +08:00
用 Number 最保险
noe132
2017-06-20 20:58:33 +08:00
参考:
http://ecma-international.org/ecma-262/7.0/index.html#sec-abstract-equality-comparison
http://ecma-international.org/ecma-262/7.0/index.html#sec-tonumber
http://ecma-international.org/ecma-262/7.0/index.html#sec-parseint-string-radix
http://ecma-international.org/ecma-262/7.0/index.html#sec-number-constructor-number-value

Number("123") 与 ~~"123" === 123 内部处理基本一致,都是调用 ToNumber(value)。因为有两次取反,可能会有取反的坑。
ToNumber 对于字符串类型的参数,就是按照 js 数值语法的字面量来处理字符串,所有合法的 javascript 数值字面量字符串会被转化为相应的值。所以 Number("1.1") === 1.1。若遇到不合法的返回 NaN

而 parseInt 有第二个参数为进制,默认为 10,取值范围为 2-36。
parseInt 的处理方法是将字符串前缀中提取 0-9a-z 的字符,然后一位一位的计算根据进制转化为数值
例如 "1a.54Q"以 10 为基,有效字符为 0-9,提取出来的有效字符串为"1",得到的值就是 1
"1a.54Q"以 16 为基有效字符为 0-9a-f,提取出来的有效字符串为"1a",得到的值就是 26
noe132
2017-06-20 21:11:49 +08:00
你上面给的方法 A 相当于一个用 JS 实现的的 parseInt,逻辑和 parseInt 基本一致
0915240
2017-06-20 22:08:51 +08:00
~~这种黑科技有整数上线问题 21 亿

慎用,用时需注意。
MrFireAwayH
2017-06-21 08:49:47 +08:00
谢谢各位!👍😳
MrFireAwayH
2017-06-21 08:50:07 +08:00
@v1024 😂对啊……波澜~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/369879

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX