JavaScript(三)数据类型转换

时间:2022-08-27 09:42:19

类型转换
JavaScript中的取值类型非常灵活,如当JavaScript期望使用一个布尔值的时候,你可以提供其它数据类型的,JavaScript将根据需要自行转换数据类型。如下示例:

10 + “objects”    // 结果“10objects”,数字10被转换成字符串
“7” * “4” // 结果是28,两个字符串被转换成了数字。
var n = 1 - "x" // 结果是n等于NaN,因为字符串“x”无法被转换为数字
n + "objects" // 结果是“NaN objects”。NaN被转换成了字符串类型
字符串 数字 布尔值   对象
undefined "undefined" NaN false throws TypeError
null "null" 0 false throws TypeError
true "true" 1 true new Boolean(true)
false "false" 0 false new Boolean(false)
""(空字符串) "" 0 false new String("")
"1.2" "1.2" 1.2 true   new String("1.2")
"one" "one" NaN true new String("one")
0 "0" 0 false new Number(0)
-0 "0" -0 false new Number(-0)
NaN "NaN" NaN false new Number(NaN)
Infinity "Infinity" Infinity true new Number(Infinity)
-Infinity "-Infinity" -Infinity true new Number(-Infinity)
1 "1" 1 true new Number(1)
{} "[object Object]" NaN true new object({})
[] "" 0 true new object([])
[9] "9" 9 true new object([9])
["a"] "a" NaN true new object(["a"])
function(){} "函数的实现代码" NaN  true  

小结:字符串转换成数字,如果字符串的开始和结尾有空格的数字可以正常转换成数字,如“ 123 ”可以转换成数字123,但如果有其它特殊符号得到的数字结果将是NaN。

显示类型转换
尽管JavaScript可以自动做许多类型转换,但有时为了使代码变得清晰易读需要使用显示类型转换。
做显示类型转换最简单的方法就是使用Boolean(),Number(),String(),object()函数,当前面没有关键字new时,它们会作为类型转换函数,来将值转换成我们需要的数据类型。需要注意的是,除了null和undefined之外的任何值都具有toString()方法,这个方法的执行结果通常和String方法的返回结果一致,同样需要注意的是,如果试图把null或undefined转换为对象,会抛出一个类型错误的错误。object()函数在这种情况下不会抛出异常,它仅简单的返回一个新创建空间的对象。

在计算机程序中数字的解析和格式化是非常普通的工作,JavaScript中提供了专门的函数和方法来做更加精确的数字到字符串,字符串到数字的转换。
Number类定义的toString()方法可以接收表示转换基数(进制)的可选参数,如果不指定此参数,转换规则将是基于十进制。同样也可以将数字转换成其它进制。

如下示例:

var num = 10;
binay_str = n.toString(2); // 将数字转换成二进制
octal_str = n.toString(8); // 将数字转换成八进制
hex_str = n.toString(16); // 将数字转换成十六进制

当处理财务或科学数据的时候,对于输出小数点位置和有效数字位数,或者是科学技术法时,Number类为这种小数到字符串的转换提供了三个方法:
toFixed(位数):根据参数指点小数点后的位数,如果有效位后面还有小数,则按四舍五入的方式进位。
toExponential(有效位):科学计数法,小数点前只保留1位,根据参数指定小数点后的有效位,同样如果有效位后面还有小数按四舍五入进位。
torecision(有效位):根据指定的有效数字位数将数字转换成字符串,如果有效位数字少于数字整数部分的位数,则转换成科学计数法。
如下示例:

var n = 123456.789;
n.toFixed(0); // "123457"四舍五入进1
n.toFixed(2); // "123456.79""四舍五入进1
n.toFixed(5); // "123456.78900"位数不足用0补位
n.toExponential(1); // "1.2e+5"
n.toExponential(3); // "1.235e+5"
n.toPrecision(4); // "1.235e+5"
n.toPrecision(7); // "123456.8"
n.toPrecision(10); // "123456.7890"

如果通过Number()转换函数传入一个字符串,它会试图将其转换为一个整数或浮点数,这个方法只能基于十进制数进行转换,并且不能出现非法的尾随字符。parseInt()函数,parseFloat()函数(它们是全局函数,不从属于任何类的方法)更加灵活。parseInt()只解析整数,parseFloat()可以解析整数和浮点数。如果字符串前缀是“0x”“0X”,parseInt()将其解释为十六进制,parseInt()和parseFloat()都会跳过任意数量的前导空格,尽可能解析更多数值字符串,并忽略后面的内容,如果第一个非空格字符是非法的特殊符号,将返回NaN。
如下示例:

parseInt("3 Hello World");         // 结果是3
parseFloat(" 3.14 Hello World"); // 结果是3.14
parseInt("-12.34"); // 结果是-12
parseInt("oxFF"); // 结果是255
parseInt("0xff"); // 结果是255
parseInt("-0xff"); // 结果是-255
parseFloat(".1"); // 结果是0.1
parseInt("0.1"); // 结果是0
parseInt(".1"); // 结果是NaN
parseFloat("#23.33"); // 结果是NaN
parseInt()可以接收第二个可选参数,这个参数指定数字转换的基数,取值范围是2-36。
如下示例:
parseInt("11",2)   // 将二进制转换成十进制输出
parseInt("ff",16); // 将十六进制转换成十进制输出
parseInt("zz",36); // 将三十六进制转换成十进制输出
parseInt("077",8); // 将八进制转换成十进制输出

对象转换为原始值
对象到布尔值转换非常简单,所有对象(包括数组,函数)都转换为true,对于对象到字符串和对象到数字的转换是通过调用待转换对象的一个方法来完成的。

所有对象继承了两个转换方法,一个是toString()它的作用是返回一个反应这个对象的字符串,很多类定义了更多特定版本的toSring()方法,如数组类的toString()方法将每个数组元素转换为一个字符串,并在元素之间添加逗号后合并成结果字符串。函数类的toString()返回这个函数的实现定义的表示方式。日期类Date定义的toString()返回一个可读的日期和时间字符串。RegExp类定义的toString()将RegExp对象转换为正则表达式字符串。

[1,2,3].toString();                 // 结果是"1,2,3"
(function(x) {...}).toString(); // 结果是"function(x) {...}"
/\d+/g.toString(); // 结果是"/\\d+/g"
new Date().toString(); // 当前时间

另一个转换对象的函数是valueOf(),如果存在原始值,它就默认将对象转换为表示它的原始值,对象是复合值,而且大多数对象无法真正表示为一个原始值,因此valueOf()方法简单的返回对象本身,而不是返回一个原始值。
如下示例:

var d = new Date();
d.valueOf(); // 打印当前时间的时间戳1553439997486
var a = [1,2,3];
a.valueOf(); // 打印[1,2,3]

JavaScript中对象到字符串的转换经历如下步骤:
1、如果对象具有toString()方法,则调用这个方法,如果它返回一个原始值,JavaScript将整个值转换成字符串(如果本身是字符串的话),并返回这个字符串结果。
2、如果对象没有toString()方法,或者这个方法并不返回一个原始值,那么JavaScript会调用valueOf()方法,如果返回值是原始值,JavaScript将整个值转换为字符串并返回这个字符串结果。
3、如果JavaScript无法从toString()或valueOf()获得一个原始值,此时它将抛出一个类型错误的异常。

对象到数字的转过程也是一样,只是它首先会调用valueOf()。
1、如果对象有valueOf()方法,后者返回一个原始值,则JavaScript将这个原始值转换为数字并返回这个数字。
2、如果没有valueOf()这个方法,调用toString()方法,后者返回一个原始值,则JavaScript将其转换成字符串后返回。

3、如果没有valueOf()和toSring()方法,抛出一个类型错误异常。

对象转换为数字的细节解释了为什么空数组会被转换为数字0以及为什么具有单个元素的数组同样会转换成一个数字。数组继承默认的valueOf方法,这个方法返回一个对象而不是一个原始值,因此,数组到数字的转换调用toString方法,空数组转换成空字符串,空字符串转换成数字0,含有一个元素的数组转换为字符串的结果和这个元素转换字符串的结果一样。如果数组只包含一个数字元素,这个数字转换为字符串,在转换回数字。

"+" 和 "==" 应用的对象到原始值的转换包含日期对象的一种特殊情形。 日期类是JavaScript语言核心中唯一的预先定义类型,它定义了有意义的向字符串和数字类型的转换。 对于所有非日期的对象来说, 对象到原始值的转换基本上是对象到数字的转换(首先调用valueOf()) , 日期对象则使用对象到字符串的转换模式,然而,这里的转换和上文讲述的井不完全一致:通过valueOf或toString()返回的原始值将被直接使用,而不 会被强制转换为数字或字符串。

和"==" 一样, "<” 运算符以及其他关系运算符也会做对象到原始值的转换, 但要除去日期对象的特殊情形:任何对象都会首先尝试调用valueOf(), 然后调用toString()。不管得到的原始值是否直接使用,它都不会进一步被转换为数字或字符串。
"+"、 "=="、 "!=" 和关系运算符是唯一执行这种特殊的字符串到原始值的转换方式的运算符。 其他运算符到特定类型的转换都很明确,而且对日期对象来讲也没有特殊情况。 例如 " - ,, (减号)运算符把它的两个操作数都转换为数字。

下面的代码示例:

var now = new Date();    // 当前时间
typeof (now+ 1); // "string"
typeof (now - 1); // "number"
now == now. toString(); // true
now > (now -1); // true

JavaScript(三)数据类型转换的更多相关文章

  1. JavaScript中数据类型转换总结

    JavaScript中数据类型转换总结 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = &quot ...

  2. JavaScript的数据类型转换

    首先,由于JavaScript是弱类型语言(弱类型的语言的东西没有明显的类型,他能随着环境的不同,自动变换类型而强类型则没这样的规定,不同类型间的操作有严格定义,只有相同类型的变量才能操作,虽然系统也 ...

  3. JavaScript之数据类型转换

    JavaScript中有多种数据类型,在实际工作中,不管是有意还是无意的,我们总能碰到不一样的数据类型值之间进行运算,或者我想从用户输入获得一个数字时,而用户却输入了一个字符串,这种时候就需要用到今天 ...

  4. Sql Server函数全解<三>数据类型转换函数和文本图像函数

    阅读目录 一:数据类型转换函数 二:文本和图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和flo ...

  5. Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)

    上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...

  6. Sql Server函数全解&lpar;三&rpar;数据类型转换函数和文本图像函数

    一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和float,但是对于其它数据类型,例如整型和字符类型,隐士 ...

  7. js &vert; JavaScript中数据类型转换总结

    转载 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = “123”; a = Number(a); ...

  8. Struts2入门&lpar;三&rpar;——数据类型转换

    一.前言 笔者一直觉得,学习一个知识点,你首先要明白,这东西是什么?有什么用?这样你才能了解.好了,不说废话. 1.1.类型转换为何存在?什么是类型转换? 在MVC框架中,都是属于表示层解决方案,都需 ...

  9. javascript中数据类型转换

    转换为数字: parseInt():转换为整数型数值:从下标0开始判断,若为数值型则继续直到遇到非数值,返回前面的整数值: 小数点无效,若0开始为非数值则返回NaN: 转换空字符串会返回NaN: 能转 ...

  10. JS 之 数据类型转换

          首先我们来简单了解一下JS中的数据类型,JavaScript拥有字符串.数字.布尔.数组.对象.Null.Undefiend 6中数据类型.同一时候,JavaScript拥有动态类型. 也 ...

随机推荐

  1. Spring MVC MultipartFile实现图片上传

    <!--Spring MVC xml 中配置 --><!-- defaultEncoding 默认编码;maxUploadSize 限制大小--><!-- 配置Multi ...

  2. Atitit 图像扫描器---基于扫描线

    Atitit 图像扫描器---基于扫描线 调用范例 * @throws FileExistEx */ public static void main(String[] args) throws Fil ...

  3. edge&period;js架起node&period;js和&period;net互操作桥梁

    今天要介绍的是edge.js这个github上刚兴起的开源项目,它可以让node.js和.net之间在in-process下互操作..net版本在4.5及以上,因为.net4.5带来的Task,asy ...

  4. C语言中堆和栈的区别

    原文:http://blog.csdn.net/tigerjibo/article/details/7423728 C语言中堆和栈的区别 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进 ...

  5. rgba兼容性处理

    根据caniuse(http://caniuse.com/#search=rgba),rgba兼容性为IE9以及以上浏览器. 实例代码: <!doctype html> <html ...

  6. spring boot项目如何测试,如何部署

    有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...

  7. &lt&semi;el-upload&gt&semi;&lt&semi;&sol;el-upload&gt&semi;组件上传图片到七牛云

    [01]搭建好页面结构.定义数据与接口 <el-upload method="post" ref="upload" :action="domai ...

  8. Jmeter连接数据库方式

    关系型数据库: 1.mysql: 方式:Database URL:jdbc:mysql://localhost:port/DBname?user=**&password=**&allo ...

  9. cryptoJS AES 加解密简单使用

    简单记录一下,前端利用 cryptoJS 如何加解密的.主要是关于 AES 加解密. 需求描述:需要对 url 中的参数进行 AES 解密,然后再把该参数进行 MD5 加密通过接口传递. AES AE ...

  10. (最小生成树)Agri-Net -- POJ -- 1258

    链接: http://poj.org/problem?id=1258 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82831#probl ...