JavaScript中的类型转换(一)
前言
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方法的类型.
对象类型转换字符串类型步骤如下:
- 如果对象有toString方法,就调用toString方法,如果返回的是一个原始类型,把这个原始类型转换成字符串(当然如果toString返回的就是字符串就不需要了)
- 如果对象没有toString方法,或者toString返回的不是原始类型,就尝试调用valueOf方法,如果valueOf方法返回的是原始类型,则将原始类型转换成字符串(如果valueOf放回的就是字符串就不需要了)
- 如果toString方法和valueOf方法都不存在,或者他们的返回类型都不是原始类型,则抛出TypeError异常




对象类型转换数字类型步骤如下:
- 如果对象有valueOf方法并且该方法返回一个原始类型,则将这个原始类型转换成数字
- 否则如果对象有toString方法并且该方法返回原始类型,则将这个原始类型转换成数字
- 否则抛出TypeError异常
例子与对象转换字符串类似,不再给出.介绍到这里,大家应该知道为什么空数组转换成字符串是空字符串,但是转换成数字是0了吧.可以解释仅有一个元素的数组在转换成字符串和数字时的结果.
JavaScript中的类型转换(一)的更多相关文章
- JavaScript中数据类型转换总结
JavaScript中数据类型转换总结 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = " ...
- JavaScript中的类型转换(二)
说明: 本篇主要讨论JavaScript中各运算符对运算数进行的类型转换的影响,本文中所提到的对象类型仅指JavaScript预定义的类型和程序员自己实现的对象,不包括宿主环境定义的特殊对象(比如浏览 ...
- [翻译]解释JavaScript中的类型转换
原文地址:JavaScript type coercion explained 类型转换是将值从一种类型转换为另一种类型的过程(比如字符串转换为数值,对象转换为布尔值,等等).任何类型,无论是原始类型 ...
- javascript中强制类型转换
javascript开发过程中,强制类型转换一般发生在条件判断和==运算符.其他情况,发生的类型转换(与这两种情况也是基本类似,属于万变不离其宗的范畴),暂不讨论. == 双等运算符 考虑代码: a ...
- javascript中的类型转换,宽松相等于严格相等
为了将值转换为基本类型值(string,number,boolean,null,undefined),抽象操作ToPrimitive会首先检查该值有没有valueOf()方法,如果有并且返回基本类型值 ...
- 【你不知道的javaScript 中卷 笔记2】javaScript中的类型转换
1.1 对象内部属性 [[Class]] 常见的原生函数: String() Number() Boolean() Array() Object() Function() RegExp() Date( ...
- javascript中数据类型转换
转换为数字: parseInt():转换为整数型数值:从下标0开始判断,若为数值型则继续直到遇到非数值,返回前面的整数值: 小数点无效,若0开始为非数值则返回NaN: 转换空字符串会返回NaN: 能转 ...
- javascript中的类型转换(进制转换|位运算)
1:parseInt(string) : 这个函数的功能是从string的开头开始解析,返回一个整数 parseInt("123hua"); //输出 123 parseInt(& ...
- js | JavaScript中数据类型转换总结
转载 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = “123”; a = Number(a); ...
随机推荐
- 挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute
说到FlagsAttribute,源自前几天看到了一小段代码,大概意思就是根据航班政策来返回哪些配送方式是否可用,根据这些是否可用 来隐藏或者开启界面的相关配送方式,如果大家订过机票可能知道配送方式有 ...
- pt-diskstats 报错 Can't locate Time/HiRes.pm in @INC
调用 pt-diskstats 时报错如下Can't locate Time/HiRes.pm in @INC [root@localhost ~]# pt-diskstats Can't locat ...
- Spark SQL 之 Performance Tuning & Distributed SQL Engine
Spark SQL 之 Performance Tuning & Distributed SQL Engine 转载请注明出处:http://www.cnblogs.com/BYRans/ 缓 ...
- Jmeter之Bean shell使用(二)
上一篇Jmeter之Bean shell使用(一)简单介绍了下Jmeter中的Bean shell,本文是对上文的一个补充,主要总结下常用的几种场景和方法,相信这些基本可以涵盖大部分的需求.本节内容如 ...
- CentOS 7.2 安装 Docker 1.12.3 版
本文出自http://www.cnblogs.com/scoter2008 1.强大的官方文档 https://docs.docker.com/engine/installation/linux/ce ...
- Python 变量类型
Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...
- Linux环境下使用gcc编译,gdb反汇编C语言程序
使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64 我把过程截图如下. 首先是hello world程序: 备注: ...
- AngularJS基础概念
作用域.控制器.指令 作用域 应用的作用域是和应用的数据模型相关联的,同时作用域也是表达式执行的上下文.$scope对象是定义应用业务逻辑.控制器方法和视图属性的地方. 作用域是应用状态的基础.基于动 ...
- MMORGP大型游戏设计与开发(客户端架构 part1 of vgui)
作为客户端的重要装饰,UI扮演着极为重要的角色,是客户端中核心的组成.vgui(微GUI)中,提供了核心的接口封装,实现了客户端中常见的界面操作,并结合lua脚本,使得控制界面更加的方便. 构架 总结 ...
- JavaSE复习总结之集合(Collection)
Java早期版本只给集合类库提供了很少的一组类,但是随着Java版本的升级,Java集合类库越来越充实.集合类库里面存放的,是各式各样的数据容器,我们基本都学过数据结构这门课,数据结构所讲的就是ADT ...