js中的数据类型隐式转换的三种情况
js的数据类型隐式转换主要分为三种情况:
1. 转换为boolean类型
2. 转换为number类型
3. 转换为string类型
转换为boolean类型
数据在 逻辑判断 和 逻辑运算 之中会隐式转换为boolean类型
转换规则表:
|
数据类型 |
转换之后的值 |
|
数字 0 |
false |
|
NaN |
false |
|
空字符 ” |
false |
|
null |
false |
|
undefined |
false |
|
非0数字 |
true |
|
非空字符串 |
true |
|
非null对象类型 |
true |
注意:如果使用new操作符创建的对象隐式转换为boolean类型都是true,哪怕是new String(”);
提示:连续使用两个非操作符(!!)可以将一个数强制转换为boolean类型,这在开发之中比较实用。
转换为string类型和转换为number类型
我将这两个放在一起总结是因为一个数到底转换为string还是number受到运行环境和操作符的影响,而不像上面转换为boolean类型这么固定。
先说运行环境对数据类型隐式转换的影响
很多内置函数期望传入的参数的数据类型是固定的,如:alert(value)方法,它期望传入的value值是一个string类型,但是如果我们传入的是number类型或者object类型等非string类型的数据的时候,就会发生数据类型的隐式转换。这就是环境运行环境对数据类型转换的影响。
操作符也会影响数据的类型转换
1. 当+号作为一元操作符操作单操作数的时候,他就会将这个数转换为数字类型
2. 当+号作为二元操作符时,如果两个操作数中存在一个字符类型的话,那么另外一个操作数也会无条件地转换为字符串
3. 当+号作为二元操作符时,如果两个操作数一个都不是字符串的话,两个操作数会隐式转换成数字类型(如果无法成功转换成数字,则变成NaN,再往下操作),再进行加法算数操作
4. 当算数运算的操作符是+号以外的其他操作数时,两个操作数都会转成数字类型进行数字运算。
所以我们应该这样来判断:
1. 首先看该数据是否被操作符操作,如果被操作符操作了,遵循上面操作符对数据转换影响的原则来进行数据的转换
2. 如果该数据没有被操作符操作,那么就观察它所在具体程序环境之中,如果是alert()这样的参数环境中,如果改数据不是字符串,那就肯定要转换了
数据类型如何转换成string类型或者number类型
数据类型转换成字符串或者数字都会遵循一个原则:如果该数据是简单数据类型,则直接转换成字符串或者数字类型。如果该数据是复杂数据类型,那么先通过固定的方法将复杂值转换为简单数据,再转成字符串或者数字。
简单数据转换字符串对照表:
|
原始数据类型 |
转换之后的值 |
|
数字类型 |
数字类型的字符表示 |
|
字符串 |
不做任何改变 |
|
null |
‘null’ |
|
undefined |
‘undefined’ |
|
布尔类型 |
true变’true’,false变’false’ |
这样的转换调用了js引擎内部的TOString()操作,这个方法我们通过ES语言是无法访问调用的。
简单数据转换数字对照表:
|
原始数据类型 |
转换之后的值 |
|
数字类型 |
不做任何改变 |
|
空字符 ” |
0 |
|
非空字符串 |
将字符内的数据内容变为数据,如果还有其他符号中文等转为NaN |
|
true |
1 |
|
false |
0 |
|
null |
0 |
|
undefined |
NaN |
|
NaN |
NaN |
复杂对象如何转换为简单值
一个复杂对象在转为基础类型的时候会调用ToPrimitive(hint)方法来指定其目标类型。如果传入的hint值为number,那么就先调用对象的valueOf()方法,调用完valueOf()方法后,如果返回的是原始值,则结束ToPrimitive操作,如果返回的不是原始值,则继续调用对象的toString()方法,调用完toString()方法之后如果返回的是一个原始值,则结束ToPrimitive操作,如果返回的还是复杂值,则抛出异常。如果传入的hint值为string,则先调用toString()方法,再调用valueOf()方法,其余的过程一样。
那么复杂对象是以什么标准来判断ToPrimitive(hint)操作传入的hint值到底是number还是string呢?
1. 如果运行环境非常明确的需要将一个复杂对象转换为数字则传入number如 Number(value) 和 +value 则传入number
2. 如果运行环境非常明确的需要将一个复杂对象转换为字符串则传入string如String(value) 和 alert(value) 则传入string
3. 如果是用+号连接两个操作数,操作数在确定确定其中只要有一个为字符串的时候另外一个操作数会转为字符串,ToPrimitive()会传入string,但是如果两个操作数都不能确定是字符串的时候则默认传入number(Date对象是一个例外,它会默认传入string)进行数据类型转换。
js中的数据类型隐式转换的三种情况的更多相关文章
- js中的一些隐式转换和总结
js中的不同的数据类型之间的比较转换规则如下: 1. 对象和布尔值比较 对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字 [] == true; //false [] ...
- js数据类型隐式转换问题
js数据类型隐式转换 ![] == false //true 空数组和基本类型转换,会先[].toString() 再继续比较 ![] == [] //true ![] //false [] == [ ...
- SQL Server中提前找到隐式转换提升性能的办法
http://www.cnblogs.com/shanksgao/p/4254942.html 高兄这篇文章很好的谈论了由于数据隐式转换造成执行计划不准确,从而造成了死锁.那如果在事情出现之前 ...
- JavaScript复习之--javascript数据类型隐式转换
JavaScript数据类型隐式转换.一,函数类 isNaN() 该函数会对参数进行隐式的Number()转换,如果转换不成功则返回true. alert() 输出的内容隐式的 ...
- Oracle数据类型隐式转换小析
测试使用环境:oracle 11g r1 平常写sql语句时,大大咧咧,不太注意和数字有关的数据类型,有时例如 where c1=111 和 where c1='111'这样混用,却不曾想这里面另有蹊 ...
- SQL Server有意思的数据类型隐式转换问题
写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类.这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题.我们先构造测试数据,如下所示: CRE ...
- F#中的自定义隐式转换
我们知道隐式变换在可控情况下会使代码变得简洁.熟悉C#的都知道C#中可以自定义隐式变换,例如 public class A { private int data; public static impl ...
- Scala中的Implicit(隐式转换,隐式参数,隐式类)
文章来自:http://www.cnblogs.com/hark0623/p/4196452.html 转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...
- java中类型的隐式转换
byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double
随机推荐
- 14-vim-替换命令-01-替换
命令 英文 功能 工作模式 r replace 替换当前字符 命令模式 R replace 进入替换模式 替换模式 R命令进入替换模式,输入新字符替换当前光标所在位置的字符,替换完成后,按下ESC可以 ...
- BUUCTF RE部分题目wp
RE 1,easyre拖进ida,得到flag 2,helloworld 将文件拖入apk改之理,得到flag 3,xor拖进ida,就是简单异或,写脚本 glo=[0x66,0x0a,0x6b,0x ...
- CG-CTF web部分wp
bin不动了,学学webWEB1,签到1f12,得到flag2,签到2给了输入窗口和密码,但输入后却显示错误,查看源码,发现对输入长度进行了限制,改下长度,得到flag3,md5 collision给 ...
- servlet配置url-pattern的匹配规则
<servlet> <servlet-name>hello</servlet-name> <servlet-class>com.qf.servlet.H ...
- 2018-12-2-C#-Span-入门
title author date CreateTime categories C# Span 入门 lindexi 2018-12-02 11:32:46 +0800 2018-06-18 11:1 ...
- 第三章 k8s的node节点配置
一.修改主机名 hostnamectl set-hostname xxx 二.修改hosts文件vim /etc/hosts 三.将写好的hosts文件拷贝到其他节点 scp /etc/hosts r ...
- JavaScript性能优化之摇树
作者|Jeremy Wagner译者|薛命灯 现代 Web 应用程序可能会变得非常巨大,特别是它们的 JavaScript 部分.HTTP Archive 网站的数据显示,截至 2018 年中,传输到 ...
- Debug - SpringBoot - Error starting ApplicationContext. To display the auto-configuration report re-runyour application
Error log 2019-12-07 22:33:03.959 ERROR 3760 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : ** ...
- 高级运维(二):搭建Nginx服务器、用户认证、基于域名的虚拟主机、SSL虚拟主机、Nginx反向代理
一.搭建Nginx服务器 目标: 在IP地址为192.168.4.5的主机上安装部署Nginx服务,并可以将Nginx服务器,要求编译时启用如下功能: 1> SSL加密功能 2> 设置Ng ...
- DUBBO+Zookeeper在Centos7中本地搭建及小案例
环境: 1.centos7 2.jdk-7u76-linux-x64.tar.gz 2.tomcat:apache-tomcat-7.0.59.tar.gz 3.zookeeper-3.4.6.tar ...