JavaScript(三)数据类型转换
类型转换
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(三)数据类型转换的更多相关文章
- JavaScript中数据类型转换总结
JavaScript中数据类型转换总结 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = " ...
- JavaScript的数据类型转换
首先,由于JavaScript是弱类型语言(弱类型的语言的东西没有明显的类型,他能随着环境的不同,自动变换类型而强类型则没这样的规定,不同类型间的操作有严格定义,只有相同类型的变量才能操作,虽然系统也 ...
- JavaScript之数据类型转换
JavaScript中有多种数据类型,在实际工作中,不管是有意还是无意的,我们总能碰到不一样的数据类型值之间进行运算,或者我想从用户输入获得一个数字时,而用户却输入了一个字符串,这种时候就需要用到今天 ...
- Sql Server函数全解<三>数据类型转换函数和文本图像函数
阅读目录 一:数据类型转换函数 二:文本和图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和flo ...
- Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)
上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...
- Sql Server函数全解(三)数据类型转换函数和文本图像函数
一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和float,但是对于其它数据类型,例如整型和字符类型,隐士 ...
- js | JavaScript中数据类型转换总结
转载 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = “123”; a = Number(a); ...
- Struts2入门(三)——数据类型转换
一.前言 笔者一直觉得,学习一个知识点,你首先要明白,这东西是什么?有什么用?这样你才能了解.好了,不说废话. 1.1.类型转换为何存在?什么是类型转换? 在MVC框架中,都是属于表示层解决方案,都需 ...
- javascript中数据类型转换
转换为数字: parseInt():转换为整数型数值:从下标0开始判断,若为数值型则继续直到遇到非数值,返回前面的整数值: 小数点无效,若0开始为非数值则返回NaN: 转换空字符串会返回NaN: 能转 ...
- JS 之 数据类型转换
首先我们来简单了解一下JS中的数据类型,JavaScript拥有字符串.数字.布尔.数组.对象.Null.Undefiend 6中数据类型.同一时候,JavaScript拥有动态类型. 也 ...
随机推荐
- websocket+rabbitmq实战
1. websocket+rabbitmq实战 1.1. 前言 接到的需求是后台定向给指定web登录用户推送消息,且可能同一账号会登录多个客户端都要接收到消息 1.2. 遇坑 基于springbo ...
- 【异常】Servlet.service() for servlet [springMvc] in context with path [/orderdishessystem] threw exception [Handler processing failed; nested exception is java.lang.NoClassDefFoundError: net/sf/ezmorph/M
今天做登录的时候,引入json-lib-2.1-jdk15.jar的包时,执行到JSONObject jsonObject = new JSONObject()对象就报标题的那个错. 原来是除了要导入 ...
- MySQL将utf8字符集改为utf8mb4
前言 今天在查看tomcat日志时发现了一个错误:Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x82\xF0 ...
- selenium下拉到页面最底端
selenium操控浏览器下拉到页面最底端: #!/usr/bin/env python # -*- coding: utf-8 -*- from selenium import webdriver ...
- PHP 扩展管理
一直对 PHP 扩展了解的似是而非,每次安装扩展都要百度教程,很容易出现各种错误.所幸整理下管理扩展的所有操作,方便日后操作. 查看已加载的扩展 输出 phpinfo(): 使用 get_loaded ...
- qt 坐标变换
原文链接:Qt学习之路(28): 坐标变换 同很多坐标系统一样,QPainter的默认坐标的原点(0, 0)位于屏幕的左上角,X轴正方向是水平向右,Y轴正方向是竖直向下.在这个坐标系统中,每个像素 ...
- innodb是如何巧妙实现事务隔离级别
之前的文章mysql锁机制详解中我们详细讲解了innodb的锁机制,锁机制是用来保证在并发情况下数据的准确性,而要保证数据准确通常需要事务的支持,而mysql存储引擎innodb是通过锁机制来巧妙地实 ...
- Git合并不同url的项目
本文由云+社区发表 作者:工程师小熊 摘要:为了让项目能实现Git+Gerrit+Jenkin的持续集成,我们把项目从Git上迁移到了Gerrit上,发现有的同事在老Git提交代码,因为Gerrit做 ...
- [ Java面试题 ]框架篇二
1.Hibernate工作原理及为什么要使用Hibernate? 工作原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Tr ...
- Lambda表达式资料整理
重温委托,匿名方法,Lambda,泛型委托,表达式树 第一:委托 有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件.先上一段代码: 下边的 ...