由于Javascript是一门弱类型的语言,在我们的代码中无时无刻不在发生着类型转换,所以了解Javascript中的类型转换对于了解我们认识Javascript的运行原理至关重要。

本文主要从数值转换这一维度来剖析在JS中,数值转换会遵循什么样的规则,有哪些用途?

哪些情况下我们会用到js中的数值转换?

  1. 在传统的js中,对元素进行变换、位移、改变大小时,我们经常需要对长度单位进行计算操作;
  2. 当我们提供了一个通用add函数,此时需要对传入参数的类型进行限制,不能是非数字格式;
  3. 更多场景请关注知乎问答:JavaScript中 Number()函数在哪些场景中用到?

Javascript中存在哪些数值转换方式?

我们都知道js中存在显式类型转换和隐式类型转换,其中显式类型转换包含:

  • Number()
  • parseInt()
  • parseFloat()
  • 一元加和减操作符

隐式类型在js中的体现比较复杂,这里简单罗列以下几种情况:

  • 位运算符在操作非数值时,会使用Number()来对变量进行转换,然后进行计算;
  • 乘/除/减法操作符;
  • 关系操作符(<,>,<=,>=);
  • 相等操作符其中一个变量为数值时,会把另一个变量转换为数值进行比较。

由于js的弱类型特性,隐式类型转换其实是相对而言的,如果你了解了一段代码的类型转换方式,那么它对于你而言,就可以被视为显式转换。

由于Javascript中的隐式类型转换基本都是通过调用Number函数的方式进行的,所以这篇文章主要讨论不同显式类型转换的区别。在讨论之前,我们先看一段代码示例:

 var a = '+3.14159test';

 var num1 = Number(a);         // NaN
var num2 = parseInt(a, 10);     // 3
var num3 = parseFloat(a);      // 3.14159
var num4 = +a             // NaN
var num5 = -a             // NaN

Number函数

特点

Number()可以用于转换任何类型。

ECMA规范关于Number转换的规则描述:

https://tc39.github.io/ecma262/#sec-number-objects

转换规则

  • 如果参数是Boolean,则如果为true,返回1;false返回0;
  • 如果数字类型,直接返回;
  • null返回0,undefined返回NaN;
  • 如果是对象,则首先调用valueOf方法,如果返回值能转换为数值,则返回;否则调用toString方法,然后将返回值按照其他类型规则转换后的内容返回;
  • 如果是字符串
    • 如果只包含数字类型,则返回该数字类型的十进制格式;如果前边有-号,则返回负数;
    • 空字符串返回0;
    • 十六进制字符串返回十进制数字;如果前边有-号,返回NaN;
    • 如果非数字,返回NaN;
 var num1 = Number(true);          //
var num2 = Number(false);      //
var num3 = Number(12);       //
var num4 = Number();         //
var num5 = Number(null);       //
var num6 = Number(undefined);    // NaN
var num7 = Number('012');      //
var num8 = Number('-012');      // -12
var num9 = Number(' 0x12');      //
var num10 = Number('-0x12');    // NaN
var num11 = Number('12test'); // NaN
var num12 = Number(          //
  {
    valueOf: function (){
      return '012'
    },
toString: function () {
      return '012test'
    }
  }
)

parseInt函数

特点

仅用于转换字符串类型,首先会忽略字符串前面的空格。如果字符串一开始是数字或者加减号后边跟数字,则返回该字符串一直到非数字截止。

ECMA规范关于parseInt转换的规则描述

https://tc39.github.io/ecma262/#sec-parseint-string-radix

转换规则

  • 如果第一个参数非字符串或数字类型,则返回NaN;
  • 第一个参数格式正常,第二个参数不传值
    • 如参数一开始的非空格字符不是非数字且非加减号,则返回NaN
    • 如参数一以0x开头,则以十六进制来解析字符串,并返回该字符串的十进制格式;
    • 如参数一以0开头,则在es3标准中按照八进制来解析,es5标准中按照十进制来解析,最终返回十进制格式;(很重要,不了解会导致一些低版本浏览器莫名其妙的问题)
  • 第二个参数传值,首先会将参数二进行Number()转换
    • 如参数二能转换成一个非0数字,则将参数一按照对应进制进行转换
    • 如参数二不能转换成一个非0数字,则按照参数二为空进行处理
 var num1 = parseInt('  0xf');                // 15   同parseInt('  +0xf')
var num2 = parseInt(' -0xf'); // -15
var num3 = parseInt(' 12test'); // 12
var num4 = parseInt('f'); // NaN
var num5 = parseInt('f', 16); //
var num6 = parseInt('015', 8); //
var num7 = parseInt('15.34'); //
var num8 = parseInt('f', '0x10');      //

parseFloat函数

特点

与parseInt类似,但只能接收一个参数,传入字符串只会按照10进制进行解析,会将传入的字符串解析成Double类型数字。

ECMA规范关于parseInt转换的规则描述

https://tc39.github.io/ecma262/#sec-parsefloat-string

转换规则

  • 如果第一个参数非字符串或数字类型或点字符,则返回NaN;
 var num1 = parseFloat('  15.34.43');        // 15.34
var num2 = parseFloat('0x123.45'); // 0 因为不支持十六进制
var num3 = parseFloat(' 012.0test'); // 12

一元加和减操作符

一元加操作符的功能完全和Number()函数一致;一元减操作符是在加操作符的基础上取负值

小结

当我们可以确定被转换的变量类型是string类型时,推荐优先使用parseFloat,可以当被转换变量为小数的正常使用;当使用parseInt时,推荐使用第二个参数来确定参数一的进制类型,避免因为不同浏览器的兼容问题;

在写作过程中,越写越发现牵涉到的知识点很多,或许很多地方存在纰漏、误差。如有问题,还请指正!!!

【前端】深入浅出Javascript中的数值转换的更多相关文章

  1. JavaScript中的数值转换

    在JavaScript中,有3个函数可以把非数值转换为数值 1.Number()函数 Number()可以用于任意数据类型. 转换规则如下. 如果是Boolean值,true和false将分别被转换为 ...

  2. 前端随笔 - JavaScript中的闭包

    前阵子重新复习了一下js基础知识,第一篇博客就以分享闭包心得为开始吧. 首先,要理解闭包,就必须要了解一个概念:作用域链. 作用域链 作用域代表着可访问变量的集合,变量分为全局变量和局部变量两种,在函 ...

  3. JavaScript之parseInt()数值转换常被忽略的问题

    使用parseInt()你可以从字符串中获取数值,该方法接受另一个基数参数,这经常省略,但不应该.当字符串以”0″开头的时候就有可能会出问题,例如,部分时间进入表单域,在ECMAScript 3中,开 ...

  4. javascript 数据类型之数值转换

    数值转换 一.有3个函数可以把非数值转换为数值: Number() parse Int() parse Float() 说明: 1.Number()可以用于任何数据类型,强转类型,如果不能把指转成数值 ...

  5. 深入浅出 JavaScript 中的 this

    在 Java 等面向对象的语言中,this 关键字的含义是明确且具体的,即指代当前对象.一般在编译期确定下来,或称为编译期绑定.而在 JavaScript 中,this 是动态绑定,或称为运行期绑定的 ...

  6. 【转】深入浅出 JavaScript 中的 this

    Java 等面向对象的语言中,this 关键字的含义是明确且具体的,即指代当前对象.一般在编译期确定下来,或称为编译期绑定.而在 JavaScript 中,this 是动态绑定,或称为运行期绑定的,这 ...

  7. 【前端】javascript中10常用的个小技巧总结

    javascript中10常用的个小技巧总结 本文转自:http://www.cnblogs.com/libin-1/p/6756393.html 1. new Set() 可能有人知道ES6中提供了 ...

  8. javaScript中eval()方法转换json对象

    <script language="javascript"> var user = '{name:"张三",age:23,'+ 'address:{ ...

  9. python与JavaScript中正则表达式如何转换

    使用python爬取网站数据的时候,总会遇到各种各样的反爬虫策略,有很大一部分都和JavaScript(以下简称为JS) 有关.在破解这些JS代码的过程中,经常会遇到模拟JS正则表达式的情况,因此,今 ...

随机推荐

  1. Spring详解(三)------DI依赖注入

    上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建.初始化.销毁等工作交给spring容器来做.那么创建对象的时候,有可 ...

  2. 神奇的background

    background:url() fixed ....  可以实现页面向下滚动时背景图片 保持位置不变   感觉好像背景在随鼠标滚动而滚动一样

  3. mysql中group by 的用法解析

    1. group by的常规用法 group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤. 假设现有数据库表如下 ...

  4. Spring框架Controller层(表现层)针对方法参数是Bean时HttpServletRequest绑定参数值问题解释

    在做项目的时候,有一个需求是将数据库中的信息封装到实体类返回到jsp界面 传过来的参数只是实体类的id属性,然后根据id属性去查数据库,事情就是这样,然后 结果遇到很奇怪的事情,在jsp页面中使用EL ...

  5. POI操作Excel的API注意点总结

    本篇是关于POI.jar操作Excel的API注意事项 基数问题 说明:我使用的是POI 3.15版本的,在版本问题上建议大家,在版本稳定的基础上尽量使用高版本的 看过很多帖子在问一个问题:假设原来有 ...

  6. poj 2455 二分+最大流

    这个因为点少用邻接矩阵做的. 题意:求由1到n的t条不重复路径中最大边权值的最小值. 思路:先对边权进行排序,然后二分边权值,建图求从1到n的最大流,当最大流为t时便求出答案. 代码: #includ ...

  7. 从web图片裁剪出发:了解H5中的Blob

    刚开始做前端的时候,有个功能卡住我了,就是裁剪并上传头像.当时两个方案摆在我面前,一个是flash,我不会.另一个是通过iframe上传图片,然后再上传坐标由后端裁剪,而我最终的选择是后者.有人会疑惑 ...

  8. Spring mvc 转发、重定向

    spring控制器最后返回一个ModelAndView(urlName),其中urNamel可以是一个视图名称,由视图解析器负责解析后将响应流写回客户端;也可以通过redirect/forward:u ...

  9. NullpointerException处理

    毫无疑问,空指针NullpointerException是我们最常遇到异常,没有之一! 在刚进入编程职业时,我想,大部分刚进入的同学肯定会受到前辈们的叮咛:一定要防止空指针,这是个低级错误.你们不是? ...

  10. 结对作业--基于GUI的四则运算生成器

    组员:201421123015 陈麟凤 201421123019 张志杰 201421123020 黄海鸿 coding 地址 :https://coding.net/u/zhang1995/p/wo ...