类型转换

转字符串 数字 布尔值 对象
undefined 'undefined' 0 false throws TypeError
null 'null' 0 false throws TypeError
true 'true' 1 new Boolean(true)
false 'false' 0 new Boolean(false)
'' (空字符串) 0 false new String('')
'1.2'(数字字符串) 1.2 true new String('1.2')
'shiny'(非数字字符串) NaN true new String('shiny')
0 '0' false new Number(0)
-0 '0' false new Number(-0)
Infinity 'Infinity' true new Number(Infinity)
-Infinity '-Infinity' true new Number(-Infinity)
33 '33' true new Number(33)
{} (任意对象) true new Number(NaN)
[] '' 0 true new Number(NaN)
[33] '33' 33 true new Number(NaN)
['a'] 'a' NaN true new Number(NaN)
function(){} NaN true new Number(NaN)
  • 原始值转对象很简单,原始值通过调用String(),Number(),Boolean()构造函数,转换为他们各自的包装对象。nullundefined属于例外,当将他们用在期望是一个对象的地方都会造成一个类型错误(TypeErroe)异常,而不会执行正常的转换。
  • 对象转换相对复杂,下面具体描述

1、转换和相等性

由于JS可以做灵活的类型转换,因此其'=='相等运算符也随相等的含义灵活多变。例如:

null == undefined		// 这两值被认为相等
'0' == 0 // 前面的字符串转为了数字
0 == false // 比较之前布尔值转成了数字
'0' == false // 比较前字符串和布尔值都转成了数字

一个值转换为另一个值并不意味着两个值相等。比如,如果在期望使用布尔值的地方使用了undefined,它将会转换为false,但这并不表明undefined == false。JS运算符和语句期望使用多样化的数据类型,并可以相互转换。if语句将undefined转换为false,但==运算符从不试图将其操作数转换为布尔值。

相等运算符==比较并不严格。如果两个操作数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较:

  • 如果两个操作数的类型相同,则根据值进行比较,也就是类似于严格相等(===)进行比较。
  • 如果两个操作数类型不同,==相等操作符也可能会认为他们相等。检测相等将会遵守如下规则和类型转换:

    1、如果一个值是null,另一个是undefined,则它们相等。

    2、如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。

    3、如果其中一个值是true,则将其转为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较。

    4、如果一个值是对象,另一个值是数字或字符串,则将对象转为原始值,然后再进行比较。对象通过toString()方法或者valueOf()方法转换为原始值。JS语言核心的内置首先尝试使用valueOf(),再尝试使用toString(),除了日期类,日期类只是用toString()转换。那些不是JS语言核心中的对象则通过各自的实现中定义的方法转换为原始值。

    5、其他不同类型之间的比较均不相等。

2、显示类型转换

  • 做显示类型转换最简单的方法就是使用Boolean()、Number()、String()或Object()函数。当不通过new运算符调用这些函数时,它们会作为类型转换函数:
Number('3')			>> 3
String(false) >> 'false'
Boolean([]) >> true
Object(3) >> new Number(3)

需要注意的是,除了null或undefined之外的任何值都具有toString()方法,这个方法执行结果通常和String()方法的返回结果一致。

  • JS中某些运算符会做隐式的类型转换,又是用户类型转换。
x+''			//等价于String('x')
+x // 等价于Number(x).也可以写成x-0
!!x // 等价于Boolean(x).注意是双叹号。
10+'shiny' // '10shiny',数字10转换为字符串
'7'*'4' // 28,两个字符串均转换为数字
var n = 1 - 'x' // NaN: 字符串x无法转换为数字
n + 'shiny' // 'NaN shiny': NaN转换为字符串NaN
  • Number类定义的toString()方法可以接收表示转换基数(radix)的可选参数,如果不指定此参数,转换规则将是基于十进制。
var n = 17;
var a = n.toString(2); // 转化为 ‘10001’
var b = '0' + n.toString(8); // 转换为‘021’
var c = '0x' + n.toString(16); // 转换为‘0x11'
  • 如果通过Number()转换函数传入一个字符串,它会试图将其转化为一个整数或浮点数直接量,这个方法只能基于十进制数进行转换,并且不能出现非法的尾随字符。parseInt()函数和parseFloat()函数(它们是全局函数,不从属于任何类的方法)更加灵活。parseInt()可以接收第二个可选参数,这个参数指定数字转换的基数,合法的取值范围是2-36。
parseInt('1 shinygang')				>> 3
parseFloat('3.14 shinygang') >> 3.14
parseInt('-12.33') >> -12
parseInt('0xff') >> 255
parseFloat('.1') >> 0.1
parseInt('.1') >> NaN,整数不能以'.'开始
parseInt('11', 2) >> 3 (1*2+1)
parseInt('ff', 16) >> 255 (15*16+15)

3、对象转换为原始值

  • 对象到布尔值的转换非常简单:所有对象(包括数组和函数)都转换为true。对于包装对象亦是如此:new Boolean(false)是一个对象而不是原始值,它江转换为true。
  • 对象到字符串和对象到数字的转换都是通过调用带转换对象的一个方法来完成的。JS对象有两个不同的方法来执行转换:toString()和valueOf()

    toString():它的作用是返回一个反应这个对象的字符串。默认的toString()方法并不会返回一个有趣的值。
({x:1}).toString()   	>> "[object Object]"

很多类定义了更多特定版本的toString()方法。例如,数组类的toString()方法将每个数组元素转换为一个字符串,并在元素之间添加逗号后合并成结果字符串。函数类的toString()方法返回这个函数的实现定义表示方式。日期类定义的toString()方法返回了一个可读的日期和时间字符串。RegExp类定义的toString()方法将RegExp对象转换为表示正则表达式直接量的字符串。

[1,2,3].toString()					>> "1,2,3"
(function(x){f(x);}).toString() >> "function(x){\n f(x); \n}"
/\d/g.toString() >> "/\\d/g"
new Date(2010,0,1).toString() >> "Fri Jan 01 2010 00:00:00 GMT+0800 (CST)"

valueOf():如果存在任意原始值,它就默认将对象转换为表示它的原始值。对象是复合值,而且大多数对象无法真正表示为一个原始值,因此默认valueOf()方法简单地返回对象本身,而不是返回一个原始值。数组、函数和正则表达式简单地继承了这个默认方法,调用这些类型的实例的valueOf()方法只是简单返回对象本身。日期则返回对应毫秒数。

3..1、JS中对象到字符串的转换经过了如下这些步骤:

  • 如果对象具有toString()方法,则调用这个方法。如果他返回一个原始值,JS将这个原始值转换为字符串,并返回这个字符串结果。
  • 如果对象没有toString()方法,或这个方法并不返回一个原始值,那么JS会调用valueOf()方法。如果存在这个方法,则JS调用它。如果返回值是原始值,JS将这个值转换为字符串,并返回这个字符串结果。
  • 否则,JS无法从toString()或valueOf()获得一个原始值,因此这时它将抛出一个类型错误异常。

    3.2、在对象到数字的转换过程中,JS做了同样的事情,只是它会首先尝试使用valueOf()方法:
  • 如果对象具有valueOf()方法,后者返回一个原始值,则JS将这个原始值转换为数字返回
  • 否则,如果对象具有toString()方法,返回一个原始值,则JS将其转换并返回
  • 否则,JS抛出一个类型异常错误。

JS-类型转换的更多相关文章

  1. js类型转换的坑

    JS的灵活 说好听是说JS灵活, 说不好听就是JS的坑太多, JS类型转换就是一个大坑, JS的类型包括了原始类型的[null, undefined, String ,Number, Boolean] ...

  2. js类型转换

    1.js中有六种基本类型,分别是object.number.string.Boolean.null.undefined,其中number.string.Boolean为基本类型,有时使用会强制转换成对 ...

  3. js 类型转换学习

    类型转换分为显示转换和隐式转换 参考http://www.cnblogs.com/mizzle/archive/2011/08/12/2135885.html 先事件显示的 通过手动进行类型转换,Ja ...

  4. JS 对象、HTML事件处理、JS 类型转换、Date

    1. JS 对象 <script> var Person = new Object(); Person.id = 1; Person.name = "Hello World&qu ...

  5. 你可能忽略的js类型转换

    前言 相信刚开始了解js的时候,都会遇到 2 == '2',但 1+2 == 1+'2'为false的情况.这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这么猝不及 ...

  6. 一篇文章搞定JS类型转换

    啥要说这个东西?一道面试题就给我去说它的动机.题如下: var bool = new Boolean(false); if (bool) { alert('true'); } else { alert ...

  7. 类型和原生函数及类型转换(三:终结js类型转换)

    Number() parseInt() parseFloat() Boolean() String() toString() 一.显式类型转换 -------Number()函数把对象的值转换为数字. ...

  8. js类型转换比较表格

    JavaScript类型转换表格  值 转换为         字符串 数字 布尔值 对象 undefined "undefined" NaN false throw TypeEr ...

  9. js——类型转换

      总述                   类型转换:显式.隐式(自动) 隐式转换是由编译器自动进行的,基本主要抽象操作有ToPrimitive, ToNumber, ToString, ToBoo ...

  10. JS类型转换(强制和自动的规则)

    显式转换 通过手动进行类型转换,Javascript提供了以下转型函数: 转换为数值类型:Number(mix).parseInt(string,radix).parseFloat(string) 转 ...

随机推荐

  1. D. How many trees? DP

    D. How many trees? time limit per test 1 second memory limit per test 64 megabytes input standard in ...

  2. 课程作业02(关于Java的几点讨论)

    ---恢复内容开始--- 1.一个Java类文件中真的只能有一个公有类吗? public class Test { public static void main(String[] args) { } ...

  3. zoj 2136 Longest Ordered Subsequence 最长上升子序列 新思路

    Longest Ordered Subsequence Time Limit: 2 Seconds      Memory Limit: 65536 KB A numeric sequence of ...

  4. RewriteMap(apache)

    最近在工作中发现一个陌生的语法,apache服务器站点rewrite配置文件里的,开始还以为是apache的一种新语法,以这个词网上搜索,没搜到相关文章,跟老同事请教了一下,说这个是RewriteMa ...

  5. Scala 运算符和集合转换操作示例

    Scala是数据挖掘算法领域最有力的编程语言之一,语言本身是面向函数,这也符合了数据挖掘算法的常用场景:在原始数据集上应用一系列的变换,语言本身也对集合操作提供了众多强大的函数,本文将以List类型为 ...

  6. SQL server 数据库备份大

    首先简单的介绍一下Sql server 备份的类型有: 1:完整备份(所有的数据文件和部分的事务日志文件) 2:差异备份(最后一次完成备份后数据库改变的部分) 3:文件和文件组备份(对指定的文件和文件 ...

  7. JAVAEE企业级应用开发浅谈第一辑

    不积跬步无以至千里,不积小流无以成江海 Step1.情景概要 作为一个JAVA WEB 开发人员,在开发web 项目时项目大家都有自己的一些新的体会,对于web 开发出现的一些比较经典的名词大家都会有 ...

  8. java基础---java语言概述

    一.计算机编程的两种范型 1.面向过程的模型---具有线性执行特点,认为是代码作用于数据. 2.面向对象的模型---围绕它的数据(即对象)和为这个数据定义的接口来组织程序:实际上是用数据控制代码的访问 ...

  9. 即时通信系统Openfire分析之八:集群管理

    前言 在第六章<路由表>中,客户端进行会话时,首先要获取对方的Session实例.获取Session实例的方法,是先查找本地路由表,若找不到,则通过路由表中的缓存数据,由定位器获取. 路由 ...

  10. C#设计模式之八桥接模式(Bridge)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第二个模式,该模式是[桥接模式],也有叫[桥模式]的.大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的.因为桥在我们现实 ...