JavaScript中的数据类型转换

本文中提到的“原始值”指的是undefined,null,Boolean,string和number。

本文中的对象是native对象,宿主对象(浏览器定义的对象)按照各自的算法转换。

JavaScript中共有六种数据类型,Undefined、Null、Boolean、Number、String和Object。

关于类型转换,JavaScript很有趣的一点是,它会根据他期待的数据类型自动进行类型转换。也就是说,即便你不给他他想要的,他也会自己动手把你给的变成他想要的。

那么这里就有两个问题,他期待什么和他怎么变

我们先来看,他怎么变?

 

我们知道,JavaScript中有用于类型转换的函数,比如String( ),Number( ),Boolean( ),Object( )。通过这些方法,我们可以显式的将数据转换为想要的类型。

下图是《JavaScript权威指南》中给各种数据类型相互转换的结果:

原始值的转换都很简单,和我们想象的几乎一致,其中复杂的是对象到原始值的转换,所以要单独进行讨论。

3.8.3中介绍了对象转换为不同类型的过程,不管要转换成什么类型,都是通过调用JavaScript会使用对象的两个转换方法——valueOf( )和toString( )来获得原始值,获取结果如下表:

只不过转换为不同类型获取原始值规则不同。

  • 将对象转换为字符串的规则:
  1. 如果他有toString( ),调用,如果他返回一个原始值,将其转换为为字符串(如果不是字符串)并返回。
  2. 如果他返回的不是原始值,或他没有toString( ), 调用valueOf( ),如果返回一个原始值,将其转换为字符串(如果不是字符串)并返回 。
  3. 否则,抛出一个类型错误异常。
  • 将对象转换为数字的规则:
  1. 先尝试用valueOf( ),如果返回一个原始值,再将其转换为数值并返回。
  2. 如果返回的不是原始值或他没有valueOf( ),再尝试toString( ),如果返回一个原始值,将其转换为数值并返回。
  3. 否则,抛出一个类型错误异常。

以上是对数据类型进行显性转换的规则。

之前我们说了,JavaScript会根据自身需要对数据进行隐式转换

这就需要知道,他期待什么?也就是说,什么时候他会做出隐式转换这个行为。

  • 当它执行"!"操作符和if语句时,它会期待一个布尔值,如果你给他的不是一个布尔值,他会后台调用Boolean( )将其操作数转换为布尔值。

所以 !!x 就相当于Boolean(x)

  • 当它执行"-"或一元"+"操作符时,它会期待一或两个数值,如果你给他的不是数值,他会后台调用Number( )将其操作数转换为数值。

所以 x-0 就相当于Number(x)

+x  就相当于Number(x)

  • 当它执行 二元"+","=="("!="),和关系操作符时,会根据自身的期待进行类型转换。

而不管它们期待什么,有一点是相同的,就是当他们遇到一个对象的时候,它们会将对象转换为原始值直接做为结果返回,然后再根据各自的期待进行类型转换。

它们返回原始值的规则都是:非日期对象先尝试调用valueOf(),不行再调用toString();日期对象调用toString( )。

然后我们可以看看它们各自的期待:

二元“+”,期待数字或字符串,最期待字符串,其他类型都将进行类型转换。

也就是说,只要有一个是字符串,他就会期待字符串,然后调用String( )将非字符串转换为字符串。

如果两个都不是字符串,他才会调用Number( )将两个操作数都转换为数值。

如果其中一个是对象,将其转换为原始值,再和另一个操作数比较,决定如何行动。

所以x+""就相当于String(x)

关系操作符("<",">","<=",">=" ),期待数字和字符串,最期待数值,其他类型的操作数将进行类型转换:

如果操作数是对象,转换为原始值。(先调用valueOf(除了日期对象),直接返回结果,不强制转换为数字或字符串。)

转换之后,如果都是字符串,那么依照字母表顺序比较,如果至少有一个不是字符串,那么两个操作数都将转换为数值进行比较。

"=="("!=")的规则:

1.相同类型的按照===的规则比较。

2.不同类型的:

①undefined==null

②字符串和数字,将字符串转换为数字。

③布尔值和数字,将布尔值转换为数字。

④如果一个值是对象,另一个是数字或字符串。将对象转换为原始值。非JavaScript核心中的对象则通过各自的实现中定义的方法转换为原始值。

⑤其他不同类型的比较均不相等。

利用以上知识,我们就可以理解一些简洁的代码是如何达到目的的了:

  • +date 返回表示日期的毫秒数(date是日期对象。 )

因为+会将操作数转换为数字,而date是一个对象,所以会先调用对象的valueOf()方法,日期对象的这个方法会返回表示这个日期的毫秒数。

  • if(-[1,]) 在非IE6/7/8中的值为true,在IE6/7/8中为false。

第一步,执行"-"。因为"-"操作符会将操作数转换为数值,数组是一个对象,会调用其valueOf方法,返回一个对象,所以继续调用其toString( )方法,非IE6/7/8的JS引擎会自动去除数组最后的逗号,所以结果为[1],[1]被转换为数值,即1;而IE6/7/8的JS引擎不会自动剔除数组中的最后的逗号,所以其valueOf的返回值为“1,”,转换为数字得到NaN;

第二步,执行if语句。if语句期待一个布尔值,将-1转换为布尔值为true。将(-NaN)转换为布尔值得到false。

JavaScript的这个特点非常灵活,可以利用它减少很多代码。不过有利就有弊,如果我们没有理解它的运作机理,很可能一不小心就被它坑了。所以我们平时写代码的时候一定要注意它的隐式转换行为。

以上是我的一些理解和总结,可能会有一些错误的地方,希望大家可以帮我指正。

时间: 2024-10-12 02:23:52

JavaScript中的数据类型转换的相关文章

JavaScript之基础-3 JavaScript 数据类型、数据类型转换

一.数据类型 数据类型 基本类型 - 数字类型 - 既可以表示32位整数,也可以表示64位的浮点数 - 整数 - 十进制:逢十进一的整数,如1234567890 - 八进制:逢八进一的整数,如01235670 - 十六进制: - 浮点数 - 使用小数点记录数据,如 95.5,3.1415926 - 使用指数记录数据,如 4.3e23, 4.3E-23 string 类型 - 字符串类型 - 表示一系列的文本字符数据,如性别.姓名.住址等 - 由Unicode字符,数字,标点组成的序列 - Jav

js中的数据类型转换(找相应的值小案例)

js中数据类型转换是一个很频繁会用到的一部分,那么在实际案例中会出现各种的数据类型,想要满足某些条件,那还必须要不同类型的数据进行转换,今天就通过一个小例子,来找出相对应的数据类型. 先看一个一个数组,数组里的内容很复杂,包含了所有的数据类型,然后我们通过不同的条件找到相对应的内容: var arr = [ '100px', 'abc'-6, [], -98765, 34, -2, 0, '300', , function(){alert(1);}, null, document, [], tr

详细理解javascript中的强制类型转换

将值从一种类型转换为另一种类型通常称为类型转换,这是显式的情况:隐式的情况称为强制类型转换,JavaScript 中的强制类型转换总是返回标量基本类型值,如字符串.数字和布尔值. 如何理解: 类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时? 1.如果是静态语言,比如c等,所有的类型转换应该都是在编译阶段处理的吧? 2.如果是动态语言,如js等, 编译阶段会处理类型转换吗? 一.ToString 它负责处理非字符串到字符串的强制类型转换 数字的字符串化遵循通用规则

python中的数据类型转换

今天想要写的是python中比较简单但是又相对重要的数据类型之间的互相转换.所谓数据类型转换其实很简单,生活中就有很多的例子,比如:15+2.2=17.2,看着好像只是一次普通的数学运算,但是却存在了一次数据类型之间的转换."15"在数据类型中被称为整型,"2.2"在数据类型中则被称之为浮点型,那么在我们的程序中整型是没办法直接和浮点型的数据进行运算操作,这时候我们可爱的python就偷偷的将"15"转化成了"15.0"的浮点

Python中的数据类型转换举例及脚本统计服务器内存实例

统计系统剩余的内存 In [1]: s1 = 'abc' In [2]: help(s1.startswith) Help on built-in function startswith: startswith(...) S.startswith(prefix[, start[, end]]) -> bool Return True if S starts with the specified prefix, False otherwise. With optional start, test

C#中的数据类型转换

数据类型在一定的条件下是可以相互转换的,如将int型数据转换成double型数据.C#允许使用两种转换方式:隐式转换和显式转换. 1.隐式转换 隐式转换:从类型A到类型B的转换可以在所有情况下进行,执行转换的规则非常简单,可以让编译器执行转换. 隐式转换不需要做任何工作,也不需要另外编写代码.如将int型数据转换成double型数据: int a = 10; double b = a;//隐式转换 隐式转换规则是:任何类型A,只要其取值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B.基

WPF中在XAML中实现数据类型转换的两种方法

熟悉数据绑定的朋友都知道,当我们在Model中获取一个对象的数据,常常需要对其进行数据转换后显示在UI界面上,比如你用bool类型存储了一个人的性别,但是在界面上却需要经过转化后显示为男或女: 今天又把数据绑定部分又看了一下,在这里就算是做个总结吧! 方法一:当我们定义一个类,该类中又有该类类型的一个属性,那么如果我们只是在XAML中使用简单的数据绑定的话,程序就会出现问题,究其原因就是程序无法正确对该类的对象的类类型的属性无法正确转化,所以我们需要自定义一个转换类,该类继承TypeConver

Object-C 中各数据类型转换 NSData转NSString,Byte,UIImage

1,NSData 与 NSString NSData --> NSString NSString *aString = [[NSString alloc] initWithData:adata encoding:NSUTF8StringEncoding]; NSString --> NSData NSString *aString = @"1234"; NSData *aData = [aString dataUsingEncoding: NSUTF8StringEncod

JavaScript 学习笔记— —数据类型转换

Js中的数据类型:undefined,string,number,boolen,function,object(null,[],{}) 一.parseInt()和parseFloat() parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字:如果不是,该方法将返回NaN,不再继续执行其他操作.如果第一个字是+或—号同样支持. parseInt("1234blue"); //returns 1234 parseInt("0xA"); //retur