• 前言

    JavaScript是一种非常灵活的弱类型的语言,它的灵活性的一方面体现在其繁杂多样的类型转换。比如当JavaScript期望使用一个布尔值的时候(比如if语句中)你可以提供任一类型的值,JavaScript会按照需要自行转换类型;当使用==操作符比较两个类型值的时候,也会对两个操作数按需进行转换,同样的事情也发生在使用+,>和<等操作符时。这些灵活繁杂的转换往往会使初学者不知所措,本文对JavaScript的类型转换做一个总结。

  • JavaScript中的类型分类

    JavaScript中的类型可以分为两大类:原始类型( primitive types)和对象类型(object types).其中原始类型包括数字number,字符串string,布尔boolean,null和undefined五种;除此五种之外的类型都是对象类型(包括function,array,regex等).

  • 原始类型到其他类型的转换

    JavaScript中对于不同类型值之间的转换见下表(该表为<JavaScript权威指南>第三章表3-2)

    字符串 数字 布尔值 对象
    undefined “undefined” NaN 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”)
    “one”   NaN true new  String(“one”)
    0 “0”   false new Number(0)
    -0 “0”   false new Number(-0)
    NaN “NaN”   false new Number(NaN)
    Infinity “Infinity”   true new Number(Infinity)
    -Infinity “-Infinity”   true new Number(-Infinity)
    1(其他非无穷大的数字) “1”   true new Number(1)
    {} 待讨论 待讨论 true  
    [] “” 0 true  
    [9] “9” 9 true  
    [‘a’] 使用join()方法连接各个元素,分隔符为逗号 NaN true  
    function(){} 待讨论 NaN true  

    从上表可以看出,JavaScript中原始类型之间的类型转换已经被明确定义,原始类型到对象的转换也被明确定义,表格中有三个内容为"待讨论"的单元格,均是对象类型到原始类型之间的转换,是JavaScript类型转换的难点。这里简单对前两种情况做一下总结:

    • 只有undefined,null,空字符串,0(包括0和-0)和NaN转换为布尔类型时会被转换为false,其余类型的值转换成布尔类型都是true
    • 原始类型到对象类型的转换,null和undefined会抛出异常,而number,string和bool则会转换成对应的包装类型Number,String,Boolean.对于这三种原始类型,也可以使用Object构造函数转换成对象,Object构造函数会根据传入参数的具体值来调用Number,String或者Boolean中的一个来构造对象.代码如下
      var num = new Number(10);
      var str = new String("abc");
      var boolean = new Boolean(false);
      var num1 = new Object(10);
      var str1 = new Object("abc");
      var boolean1 = new Boolean(false);
      console.log(typeof num + " " +num.constructor ); //输出object function Number() { [native code] }
      console.log(typeof str + " " + str.constructor);//输出object function String() { [native code] }
      console.log(typeof boolean + " " + boolean.constructor);//输出object function Boolean() { [native code] }
      console.log(typeof num1 + " " + num1.constructor);//输出object function Number() { [native code] }
      console.log(typeof str1 + " " + str1.constructor);//输出object function String() { [native code] }
      console.log(typeof boolean1 + " " + boolean1.constructor);//输出object function Boolean() { [native code] }

对象类型到原始类型的转换

本小节中提到的"对象类型"仅指native objects,可以理解为由程序员定义的对象类型,不包括JavaScript宿主(比如浏览器)所定义的对象,因为宿主定义的对象可能有特殊的方法来进行类型转换.另外本小节标题里的原始类型仅包含bool,string和number三种类型,对象到null或者undefined的转换不需要讨论.而对象到bool类型的转换在上面已经讨论过,所有的对象类型转换布尔类型都是true,即使new Boolean(false)转换成布尔类型也是true.所以本小节值得讨论的内容就剩下对象类型到字符串的转换与对象类型到数字的转换.

对象到字符串和对象到数字类型的转换涉及到两个重要的方法,最终的转换结果会受到这两个方法返回结果的影响,这两个方法就是toString和valueOf.所有的对象都会从Object对象中继承到这两个方法.toString方法 用于返回对象的字符串表示(但是其实也可以不返回字符串).对于默认从Object继承而来的toString方法并不会返回太多有意义的内容.而valueOf方法目的是返回一个可以表示对象的原始类型值,但是由于对象的复杂性,大多数情况下根本不可能用一个原始类型值来表示,所以默认的valueOf只是返回对象自身.Date类型是一个特例,这是JavaScript预定义类型之中唯一重写了toString和valueOf方法的类型.

对象类型转换字符串类型步骤如下:

  1. 如果对象有toString方法,就调用toString方法,如果返回的是一个原始类型,把这个原始类型转换成字符串(当然如果toString返回的就是字符串就不需要了)
  2. 如果对象没有toString方法,或者toString返回的不是原始类型,就尝试调用valueOf方法,如果valueOf方法返回的是原始类型,则将原始类型转换成字符串(如果valueOf放回的就是字符串就不需要了)
  3. 如果toString方法和valueOf方法都不存在,或者他们的返回类型都不是原始类型,则抛出TypeError异常

对象类型转换数字类型步骤如下:

  1. 如果对象有valueOf方法并且该方法返回一个原始类型,则将这个原始类型转换成数字
  2. 否则如果对象有toString方法并且该方法返回原始类型,则将这个原始类型转换成数字
  3. 否则抛出TypeError异常

例子与对象转换字符串类似,不再给出.介绍到这里,大家应该知道为什么空数组转换成字符串是空字符串,但是转换成数字是0了吧.可以解释仅有一个元素的数组在转换成字符串和数字时的结果.

JavaScript中的类型转换(一)的更多相关文章

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

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

  2. JavaScript中的类型转换(二)

    说明: 本篇主要讨论JavaScript中各运算符对运算数进行的类型转换的影响,本文中所提到的对象类型仅指JavaScript预定义的类型和程序员自己实现的对象,不包括宿主环境定义的特殊对象(比如浏览 ...

  3. [翻译]解释JavaScript中的类型转换

    原文地址:JavaScript type coercion explained 类型转换是将值从一种类型转换为另一种类型的过程(比如字符串转换为数值,对象转换为布尔值,等等).任何类型,无论是原始类型 ...

  4. javascript中强制类型转换

    javascript开发过程中,强制类型转换一般发生在条件判断和==运算符.其他情况,发生的类型转换(与这两种情况也是基本类似,属于万变不离其宗的范畴),暂不讨论. == 双等运算符 考虑代码: a ...

  5. javascript中的类型转换,宽松相等于严格相等

    为了将值转换为基本类型值(string,number,boolean,null,undefined),抽象操作ToPrimitive会首先检查该值有没有valueOf()方法,如果有并且返回基本类型值 ...

  6. 【你不知道的javaScript 中卷 笔记2】javaScript中的类型转换

    1.1 对象内部属性 [[Class]] 常见的原生函数: String() Number() Boolean() Array() Object() Function() RegExp() Date( ...

  7. javascript中数据类型转换

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

  8. javascript中的类型转换(进制转换|位运算)

    1:parseInt(string) : 这个函数的功能是从string的开头开始解析,返回一个整数 parseInt("123hua"); //输出 123 parseInt(& ...

  9. js | JavaScript中数据类型转换总结

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

随机推荐

  1. JSON字符串和Dictionary字典类型的相互转换

    在开发过程中,往往会遇到数据类型转换的情况,根据自己的业务,可能转换类型有多种,下面就说一下json字符串和字典类型的转换. public static class JsonUntity { /// ...

  2. asp.net 后台 Http POST请求

    时间忙,简单些,直接贴代码上图 百度站长平台为站长提供链接提交通道,您可以提交想被百度收录的链接,百度搜索引擎会按照标准处理 http://zhanzhang.baidu.com/linksubmit ...

  3. kill

    向一个/一些进程发送一个信号 $kill [-slL] -s指定发送的信号,可以使用名称或者信号编号 -l列出当前系统的所有信号 $kill -l 1) SIGHUP 2) SIGINT 3) SIG ...

  4. python抓取网页中图片并保存到本地

    #-*-coding:utf-8-*- import os import uuid import urllib2 import cookielib '''获取文件后缀名''' def get_file ...

  5. webkit浏览器常见开发问题

    前段时间有人问我一个简单的问题,html如何创建解析的? 我讲了一大堆,什么通过DocumentLoader, CachedResourceLoader, CacheResource, Resourc ...

  6. 第15章 设备无关位图_15.3 DIB和DDB的结合

    第15章 设备相关位图_15.3 DIB和DDB的结合 15.3.1 从DIB创建DDB (1)hBitmap =CreateDIBitmap(…)——注意这名称会误导,实际上创建的是DDB 参数 说 ...

  7. LoadRunner 12.02 安装教程及中文语言包安装

    注意事项: 安装前,把所有的杀毒软件和防火墙关闭. 若以前安装过LoadRunner,则将其卸载. 安装路径不要带中文字符. LoadRunner 12已经不再支持xp系统,仅支持win7和win8系 ...

  8. .net(c#)提取多层嵌套的JSON

    Newtonsoft.Json.Net20.dll 下载请访问http://files.cnblogs.com/hualei/Newtonsoft.Json.Net20.rar 在.net 2.0中提 ...

  9. noip2013 火柴排队

    题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...

  10. wk_04

    函数 函数是对程序逻辑进行结构化或过程化的一直编程方法.能将整块代码巧妙的隔离成易于管理的小块,把重复代码放到函数中而不是进行大量的拷贝--这样既能节省空间,也有助于保持一致性,因为你只需要改变单个的 ...