JS极限操作之一键转数字
简介:
直入主题,加号“+”是司空见惯的符号,一般用于加减例如:
var a = 1 + 1;
console.log(a); //2
这个代码不用多说,很简单的加减法,结果不用多说。
“+”号还有另一个作用,在JS中可以将字符串进行连接,作为连字符,例如:
var a = 'abc' + '123';
console.log(a) // abc123
那么问题就来了,如果一个数字和一个字符串相加呢?如下:
var str = '2';
console.log(1 + str); // 12
console.log(str + 1); // 21
结果很明显,当我们取得的数据是字符串类型的时候,那么不管我们把这个字符串放在“+”前后哪个位置都会让这个数字转成了字符串,而不是我们想要的将字符串自动转成数字,这在做数据计算的时候会有很大影响。
常规解决办法:
var str = '2';
console.log(1 + Number(str)); // 3
console.log(1 + parseInt(str)); // 3 也可以使用parseFloat
这两个办法是灰常合理的办法,浅析一下这两个东西的区别和优缺点
Number函数:
优点:可以转换所有大部分类型的数据。
缺点:不能按需求转换二进制等字符串数据,字符串解析能力弱。
parseInt函数:
优点:可以再第二个参数传入当前字符串为多少进制的数字,自动转换十进制,从2进制到36进制(10个数字加26个字母)。可以解析以数字开头的数字(parseFloat可以解析浮点数)。
缺点:仅适合转换字符串(如转换布尔时,仅能转换为NaN)。
因为36进制涵盖所有的字母,所以,可以算算自己的名字或任意纯小写字符串是什么数字:
console.log(parseInt('zhangyaze',36)); // 100094224570394
console.log(parseInt('helloworld',36)); // 1767707668033969
console.log(parseInt('zyz',36)); // 46619
两个办法是不错,可读性也高,但是写的太多,sorry,谁让咱懒呢,所以,让我们精简一下。
精简办法一:
var str = '2';
console.log(1 + str * 1); // 3
很明显,这个也是可行的,“因为在JS中,数字操作可以将任意类型转换为数字,原理是执行Number()函数”,那么如果我们将字符串乘1,很明显,如果是一个数字,它乘1,数字并不会发生任何改变,那么两个字符可以快速的将字符串合理的转换为数字。
但是,这个办法还是长,我们往往会忽略了“+”号还有一个作用,不仅仅是 “加号”和“连字符”,它还是可以用来“表示正数”的嘛,而在JS里,加号当单独使用的时候,则是进行了一次数字操作,因为正任何一个数,该不会发生任何改变,所以,JS中单独使用“+”号则可以对该数据进行Number()函数进行转换,所以,让我们再精简一下。
终极精简办法:
var str = ''2;
console.log(1 + +str); // 3
如此一来,我们的字符串就用一个字符快速的转为了数字,而他的效果其实完全等同于第一种办法,效率也是完全可以的。
这个方法经测试也同样适用于其他的数据类型:
console.log(+true); // 0 布尔值
console.log(+null); // 0 空值
console.log(+{valueOf(){return '123'}}); // 123 对象
接下来说说唯一的缺点:可读性变差,如果不注意空格,那么两个“+”号连在一起,将会容易解读成递增符号。
附Number函数解析规则列表:
源数据 | 解析后 |
---|---|
Boolean值 | true为1,false为0 |
null | 0 |
undefined | NaN |
对象 | 调用对象的valueOf()方法,如果转换为NaN,则会调用toString(),依照字符串解析规则解析,如下 |
字符串 | 1.只包含数字(包括正负号)或浮点数格式,按十进制转换。 2.如果字符串为空,转换为0。 3.如果含有任何其他的字符,转换为NaN。 |
继续,封面结尾:
There are roughly 23,000 medical assistants working in Ohio, making Ohio one of the states with the largest number of working medical assistants. cheap generic buy viagra viagra goes generic