• 前言

    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. 微信网站设置右上角发送、分享的内容——.net版本

    一.首先了解本文要解决的问题: 公司前一段开发了移动网站,老板喜欢通过微信看,然后把看到的东西通过右上角的按钮分享出来,但老板发现分享出来的东西,没有指定的图片,没有描述:所以我就得老老实实干活了.. ...

  2. 一致性算法Paxos详解

    分布式系统除了能提升整个系统的性能外还有一个重要的特性就是提高系统的可靠性,可靠性指的是当分布式系统中一台或N台机器宕掉后都不会导致系统不可用,分布式系统是state machine replicat ...

  3. PostgreSql常用脚本

    添加表字段 ALTER TABLE public.university ADD COLUMN "Province" character varying(10); COMMENT O ...

  4. Js 关于console 在IE 下的兼容问题

    程序员在开发代码的过程中,使用console作为调试代码过程的一种手段. 发布到测试生产环境,发现IE8 出现加载错误.使用开发者工具调试,发现可以绕过问题. 通过网络搜索和在项目中进行修正. 以下办 ...

  5. 006.udp转发包并代理访问服务器总结

    背景: 当加速器(client)拦截了游戏客户端发送的完整数据包(package)时,将package传给中间服务器(mid_server),经过自己的链路传输数据之后,中间服务器模拟游戏客户端将数据 ...

  6. 003.同时Ping多个IP(select实现IO复用,信号计时),ping程序升级版

    写这个的目的主要是为了以后的方便: 1.信号计时函数的使用 2.ip头的构建和icmp头的构建 3.selec函数t的用法 代码实现: /src/ping.h /* * ping.h * * Crea ...

  7. 支付宝APP支付开发- IOException : DerInputStream.getLength(): lengthTag=127, too big.

    支付宝APP支付Java开发报错: IOException : DerInputStream.getLength(): lengthTag=127, too big. 后来排查是因为没有设置私钥.

  8. Facebook的体系结构分析---外文转载

    Facebook的体系结构分析---外文转载 From various readings and conversations I had, my understanding of Facebook's ...

  9. Java Web开发之Servlet获取ckeditor内容

    js: <!-- ckeditor插件 --> <script type="text/javascript" src="js/ckeditor/cked ...

  10. codevs哈希水题

    1230 多重hash练习一下,不用也可以 // // main.cpp // codeves1230 // // Created by Candy on 9/29/16. // Copyright ...