• 前言

    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. SQL挑战——如何高效生成编码

    有这样一个需求:需要根据输入的编码(这个编码值来自于数据库的一个表)生成下一个编码,编码规则如下所示(我们暂且不关心这个逻辑是否合理,只关心如何实现): 1: 最小值为A0000, 最大值为ZZZZZ ...

  2. Tomcat:云环境下的Tomcat设计思路——Tomcat的多实例安装

    Cloud现在是一个热门的技术,Tomcat是学习Java的人一般都会接触的Web服务器,如果在Cloud环境下使用Tomcat,又当如何呢?不可避免的,要安装多个Tomcat了,这里称之为Tomca ...

  3. jQuery自动完成组建Autocomplete

    一,属性介绍 * minChars (Number) 在触发autoComplete前用户至少需要输入的字符数.Default: 1,如果设为0,在输入框内双击或者删除输入框内内容时显示列表* wid ...

  4. 尝试一下sql server2016里面的json功能

    前2天下载了一个2016的rc版本来玩一下,首先感觉是~开发者版本免费啦!!撒花!!!另外一个东西,sql server 2016能支持json 的解析和应用啦,虽然我不知道它的性能如何,先来一发测试 ...

  5. 单表60亿记录等大数据场景的MySQL优化和运维之道

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  6. SQL Server调优系列进阶篇(查询语句运行几个指标值监测)

    前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...

  7. JAVA-android 更改APP名称与图标

    首先要在你的资源文件放入你想换的图标图片拖到drawable-XX文件夹下,然后你打开AndroidManifest.xml这个配置清单文件找到application标签里的这句android:ico ...

  8. Linux rpmbuild命令

    一.简介 rpmbuild命令用于创建软件的二进制包和源代码包. 二.选项 参考:http://blog.sina.com.cn/s/blog_4ba5b45e0102e5r2.html http:/ ...

  9. FineReport集成到AWS系统中的方案

    本人实施了北京炎黄盈动的BPM及OA系统,主要目标是对业务流程进行控制和管理,加快Oracle JDE的业务前端录单速度和弥补JDE在流程控制方面的不足,实现BPM数据能与JDE无缝互相结合,经过3个 ...

  10. 一起来啃书——PHP看书

    形式所迫,不得不开展android的学习,PHP这边也开始了啃书的日子.两部500+的书,45天够不,有点忙有点忙... 早上的胃胀,简直是一记闷棍,长点儿记性吧........ 1.PHP+MYSQ ...