JS数据类型转换

最近在阅读 《Javascript高级程序设计 第三版》,会不时的将其中重要的知识点记录下来。

本文将根据数据类型来列出各种类型转换的情况。

typeof操作符

typeof 是检验变量的数据类型的操作符,可检测的类型和返回的结果如下:

  • undefined —— 未定义的值
  • boolean —— 布尔值
  • string —— 字符串
  • number —— 数值
  • object —— 对象 或 null
  • function —— 函数

Null

实际上null是一个空对象指针,所以在前面提到的 typeof null 中会返回 object

Undefined

Undefined 派生于 null,所以以下表达式会返回 true:

undefined == null; // return true

但是两者的用法完全不同。

Boolean

Boolean(): 将其他数据类型转换为布尔值。

其中的转换规则如下:

数据类型转换为true的值转换为false的值
Booleantruefalse
String任何非空字符串“”(空字符串)
Number任何非0数字值(包括无穷大)0 和 NaN
Object任何对象null
Undefined不适用undefined

Number

基本数值字面量格式是十进制,但也能不同的字面量格式表示 八进制十六进制

var num1 = 55; // 十进制 55
var num2 = 055; // 八进制 等于十进制的 45
var num3 = 0x55; // 十六进制 等于十进制的 85

但是如果字面值超过进制的范围,前导将被忽略。后面的值当做 十进制 解析。如下:

var num2 = 079; // 无效的 八进制,解析为 十进制 79

在进行算数计算时,任何进制的值最终都会转换为十进制

浮点数值

由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript 会不失时机地将浮点数值转换为整数值。例如以下这种情况:

var float = 1.; // 解析为1
var float2 = 10.0; // 解析为10

浮点数值的最高精度是17 位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1 加0.2的结果不是0.3,而是0.30000000000000004。这个小小的舍入误差会导致无法测试特定的浮点数值。例如:

if (a + b == 0.3){  // 不要做这样的测试!
  alert("You got 0.3.");
}

在这个例子中,我们测试的是两个数的和是不是等于0.3。如果这两个数是0.05 和0.25,或者是 0.15 和 0.15 都不会有问题。而如前所述,如果这两个数是0.1 和0.2,那么测试将无法通过。因此,永远不要测试某个特定的浮点数值。

要计算这类值时可以先将浮点数值转换为整型,计算出结果后再除以相应的10的倍数:

var float1 = 0.1;
var float2 = 0.2;

var result = (float1 * 10 + float2 * 10) / 10; // 0.3

关于浮点数值计算会产生舍入误差的问题,有一点需要明确:这是使用基于IEEE754 数值的浮点计算的通病,ECMAScript 并非独此一家;其他使用相同数值格式的语言也存在这个问题。

数值范围

Number.MAX_VALUE: ECMAScript 能够表示的最小数值,在大多数浏览器中,这个值是5e-324,如果小于这个数,则是-Infinity(负无穷)。
Number.MIN_VALUE: ECMAScript 能够表示的最大数值,在大多数浏览器中,这个值是1.7976931348623157e+308,如果大于这个数,则是Infinity(正无穷)。

NaN

NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。

注意,该数值并非唯一的。

NaN == NaN; // return false

isNaN() 这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”。函数会先把参数转换为数字,如果无法转换为数字,则返回true。

isNaN(NaN); //true
isNaN(10); //false(10 是一个数值)
isNaN("10"); //false(可以被转换成数值10)
isNaN("blue"); //true(不能转换成数值)
isNaN(true); //false(可以被转换成数值1)

数值转换

有3 个函数可以把非数值转换为数值:

  1. Number(): 可以用于任何数据类型。
  2. parseInt(): 专门用于把字符串转换成(整型)数值。
  3. parseFloat(): 专门用于把字符串转换成(浮点型)数值。

其中,Number()函数的转换规则如下

  • 如果是Boolean 值,true 和false 将分别被转换为1 和0。
  • 如果是数字值,只是简单的传入和返回。
  • 如果是null 值,返回0。
  • 如果是undefined,返回NaN。
  • 如果是字符串,遵循下列规则:
    • 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1"
      会变成1,"123"会变成123,而"011"会变成11(注意:前导的零被忽略了);
    • 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽
      略前导零);
    • 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整
      数值;
    • 如果字符串是空的(不包含任何字符),则将其转换为0;
    • 如果字符串中包含除上述格式之外的字符,则将其转换为NaN。
    • 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换
      的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符
      串值。

parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。

  • 如果第一个字符不是数字字符或者负号,parseInt() 就会返回NaN;也就是说,用parseInt()转换空字符串会返回NaN(Number()对空字符返回0)。
  • 如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
  • 如果字符串中的第一个字符是数字字符,parseInt()也能够识别出各种整数格式(即前面讨论的十进制、八进制和十六进制数)

例子如下:

var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56(八进制数)
var num6 = parseInt("70"); // 70(十进制数)
var num7 = parseInt("0xf"); // 15(十六进制数)

由于ECMAScript 3 和5 存在分歧。所以可以为这个函数提供第二个参数:转换时使用的基数(即多少进制)。

var num = parseInt("0xAF", 16); //175

parseFloat() 和 parseInt() 的情况大部分相同。不同点如下:

  • 解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。
  • 会忽略前导的值,只能解析成十进制,所以也没有第二个参数。

String

要把一个值转换为一个字符串有两种方式。

  1. toString(): 该函数几乎每个值都有(数值、布尔值、对象和字符串值都有,但null和undefined没有)。转换数值时可以传入参数,作用是以多少进制返回数值的字符串表示。

  2. String(): 在不知道要转换的值是不是null 或undefined 的情况下,还可以使用转型函数String(),这个
    函数能够将任何类型的值转换为字符串。String()函数遵循下列转换规则:

  • 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
  • 如果值是null,则返回"null";
  • 如果值是undefined,则返回"undefined"。

例子如下:

var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"

Object

Object对象自带的类型转换函数有:

  1. toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
  2. toString():返回对象的字符串表示。(在上一节点中已介绍。)
  3. valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值