总述                  

  • 类型转换:显式、隐式(自动)
  • 隐式转换是由编译器自动进行的,基本主要抽象操作有ToPrimitive, ToNumber, ToString, ToBoolean等
  • 显式转换是通过调用Number(), String(), Boolean()等来实现,后面的操作实际是和隐式一样的原理

  隐式转换           

  • ToPrimitive(input[, PreferredType]):根据可选的类型值,把input转换成非对象(基本类型); ToNumber和ToString转换对象时会调用该操作
input类型 返回结果

Undefined/Null/Boolean

/Number/String

输入为基本类型,结果与输入的一样
Object

根据内部方法[[DefaultValue]](hint)返回结果,不同的PreferredType(hint)有不同的操作

  • hint为String

1. 如果toString()返回基本类型,将其作为结果

2. 否则,如果valueOf()返回基本类型,将其作为结果

3. 否则,抛出TypeError异常

  • hint为Number

1. 先判断valueOf再判断toString(与上面String的相反),否则抛出TypeError异常

  • hint没有指定

Date类型的会把hint默认设置为String,其它会以Number处理

  • ToNumber
输入值类型 返回结果
Undefined NaN
Null +0
Boolean 1: true, 0: false
Number 与输入一致
String

个人总结:看起来像数字的字符串可以转换成相应的数字,否则返回NaN,具体例子如下

Object 返回ToPrimitive(input, Number)结果

String转换成Number

 //空格
Number("");//
Number(" 01");//
//正负数
Number("+9");//+9
Number("-9");//-9
//指数e
Number("-9e-1");//-0.9
Number("-9E-1");//-0.9
//无穷数
Number("-Infinity");//-Infinity
//不同进制
Number("0B10");//
Number("0O10");//
Number("0X10");//
//数字
Number("100000000000000000000000000000");//1e+29
Number("0000.100");//0.1
//转换成了NaN
Number("- 0");//NaN
Number("ln10");//NaN
  • ToString
输入的类型 返回值
Undefined/Null/Boolean/String

"undefined"/"null"/"true"/"false"/与输入一致

基本类型,输入和返回一样

Number  对某些输入稍处理,然后作为字符串输出
Object 使用ToPrimitive(input, String)结果

Number转换成String

 String(NaN);//-"NaN"
String(-Infinity);//"-Infinity"
//正负数
String(-0);//"0"
String(+0);//"0"
String(-9);//"-9"
String(+9);//"9"
//指数,会自动转换,有效位数尽量少
String(0.000000009);//"9e-9"
String(1000000000000000000000000000000000);//"1e+33"
String(0.9e1);//"9"
String(0.9e-10);//"9e-11"
//会自动省去多余的0
String(0.90000000000000000);//"0.9"
//进制
String(0B10);//"2"
String(0O10);//"8"
String(0X10);//"16"
  • ToBoolean
结果 输入值
false (基本类型)0, -0, +0, NaN, "", false, Null, Undefined
true 基本类型中除上述的值,Object(所有Object都是!)
  • ToObject
输入的类型 返回结果
Undefined/Null TypeError异常,Object(null/undefined)结果均为{}
Boolean/Number/String 对于基本类型会先创建一个对象,并把输入值作为对象的primitiveValue
Object 与输入相同

  产生隐式转换的操作  

转换为数字类型:数字运算符都会尝试把变量转换为数字,如~, <<, >>, +, -, *, /, ^, %, &, |, ++等

+:如果操作数不是数字,则通过ToPrimitive(input, number)进行转换。若结果中有操作数为字符串,则执行字符串拼接,否则执行数字加法

转换为布尔类型

if(..), while(...), for(;...;...), ?:, ||, &&(选择器运算符), !, !!

==宽松相等比较,根据操作数的不同进行不同的类型转换

操作数类型 转换方式:对象->非对象,非数字->数字
string+number string转换为number
boolean+其它

boolean先转换为number,再做比较

"42"==true;//false

"42"==false;//false

null+undefined null == undefined;//true
对象+非对象 对象利用ToPrimitive拆封获得非对结果,再比较

  显式类型转换          

显式调用 隐式
Number(input) ToNumer(input)
String(input) ToString(input)
Boolean(input) ToBoolean(input)
Object(input) ToObject(input)

参考

ECMAScript规范5.1

《你不知道的javascript》中卷

js——类型转换的更多相关文章

  1. js类型转换的坑

    JS的灵活 说好听是说JS灵活, 说不好听就是JS的坑太多, JS类型转换就是一个大坑, JS的类型包括了原始类型的[null, undefined, String ,Number, Boolean] ...

  2. js类型转换

    1.js中有六种基本类型,分别是object.number.string.Boolean.null.undefined,其中number.string.Boolean为基本类型,有时使用会强制转换成对 ...

  3. js 类型转换学习

    类型转换分为显示转换和隐式转换 参考http://www.cnblogs.com/mizzle/archive/2011/08/12/2135885.html 先事件显示的 通过手动进行类型转换,Ja ...

  4. JS 对象、HTML事件处理、JS 类型转换、Date

    1. JS 对象 <script> var Person = new Object(); Person.id = 1; Person.name = "Hello World&qu ...

  5. 你可能忽略的js类型转换

    前言 相信刚开始了解js的时候,都会遇到 2 == '2',但 1+2 == 1+'2'为false的情况.这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这么猝不及 ...

  6. 一篇文章搞定JS类型转换

    啥要说这个东西?一道面试题就给我去说它的动机.题如下: var bool = new Boolean(false); if (bool) { alert('true'); } else { alert ...

  7. 类型和原生函数及类型转换(三:终结js类型转换)

    Number() parseInt() parseFloat() Boolean() String() toString() 一.显式类型转换 -------Number()函数把对象的值转换为数字. ...

  8. js类型转换比较表格

    JavaScript类型转换表格  值 转换为         字符串 数字 布尔值 对象 undefined "undefined" NaN false throw TypeEr ...

  9. JS类型转换(强制和自动的规则)

    显式转换 通过手动进行类型转换,Javascript提供了以下转型函数: 转换为数值类型:Number(mix).parseInt(string,radix).parseFloat(string) 转 ...

随机推荐

  1. 三十九、Linux 线程——线程的同步和互斥

    39.1 概念 线程同步 是一个宏观概念,在微观上包含线程的相互排斥和线程先后执行的约束问题 解决同步方式 条件变量 线程信号量 线程互斥 线程执行的相互排斥 解决互斥的方式 互斥锁 读写锁 线程信号 ...

  2. -如何存储并定时更新access_token

    来源:https://blog.csdn.net/sct_t/article/details/53002611 我们知道请求access_Token会返回这样一个json,包括access_token ...

  3. cocos2dx 屏幕分辨率

    http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework ...

  4. KMP模板(HDU1711)

    #include<stdio.h> #include<math.h> #include<string.h> #include<stack> #inclu ...

  5. Python 的异步 IO:Asyncio 简介

    转载自https://segmentfault.com/a/1190000008814676 好文章 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时, ...

  6. 2、jQuery的基本概念-必看-版本-入口函数- jq对象和dom对象区别

    1.4. jQuery的版本 官网下载地址:http://jquery.com/download/ jQuery版本有很多,分为1.x 2.x 3.x 大版本分类: 1.x版本:能够兼容IE678浏览 ...

  7. centOS7 tomcat 开机自启 自启动设置

    1.编写配置文件 // (1)修改tomcat.service vim /lib/systemd/system/tomcat.service // (2)复制以下代码,注意修改tomcat路径 [Un ...

  8. understand 在windows 以及 unbuntu 下的安装

    1.win7 64位下安装 1)下载Understand.4.0.908.x64.rar. 2)解压之,直接运行里面的Understand-4.0.908-Windows-64bit.exe. 3)选 ...

  9. 20165325 2017-2018-2 《Java程序设计》 第八周学习总结

    一.教材学习笔记 ch12 1.程序是一段静态的代码,进程是程序的一次动态执行过程 2.线程比进程还小,一个进程的进行期间可以产生多个线程. 3.Java内置对多线程的支持.我们的计算机在任何给定说的 ...

  10. React的Element的创建和render

    React的Element是React应用程序的最小构建块,它是用来描述我们在屏幕上看到的浏览器页面上的内容. 在React中构建 Element 有两种方式: 1.JSX的方式,JSX不是React ...