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
随机推荐
- Eureka 系列(05)消息广播(上):消息广播原理分析
Eureka 系列(05)消息广播(上):消息广播原理分析 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 首先回顾一下客户端服务发现的流程,在上一篇 Eureka 系列( ...
- Synchronized 与 ReentrantLock 的区别!
来源:cnblogs.com/baizhanshi/p/7211802.html 之前栈长分享了重入锁的概念:<到底什么是重入锁,拜托,一次搞清楚!>,今天现来深入了解下 Synchron ...
- Oracle上课学习笔记<1>
简单的select查询语句 1.select查询语句基本语法 使用两个关键字: select 指定要查询的字段和内容 from 从哪张表中查询 语法:select 字段名 from 表名; 三种不同的 ...
- ARC080E
倒着考虑 每次拿出的第一个必须是奇数位置,第二个必须是偶数位置.每次删数都不能跨过已被删去的位置. 事实上只要开个堆维护一下区间就行了.但是众所周知我zz,所以我写的线段树 #include<i ...
- Python之变量作用域
使用 global强制声明为全局变量
- 学习vim 从常用按键开始
ctrl+e 将屏幕下滚一行 ctrl+u 将屏幕上滚半页 ctrl+d 将屏幕下滚半页 ctrl+b 将屏幕上滚一页 ctrl+f 将屏幕下滚一页 撤销 u 前进 ctrl r 移动 下一个单词 ...
- Comet OJ - contest #3 C DP
题意:给你一个长度为n序列,和一个数m,问这个序列有多少个子序列,满足这个子序列的所有子序列的和是m的倍数?答案对1e9 + 7取模,n, m范围到5e3; 思路:容易发现,如果一个子序列的长度是n, ...
- bootstrap 标签页的使用(tab)
<!DOCTYPE html> <html> <head> <title></title> <link rel="style ...
- window.navigator.userAgent
只读属性 Window.navigator 会返回一个 Navigator 对象的引用,可以用于请求运行当前代码的应用程序的相关信息.window可以省略.来自navigator对象的信息具有误导性, ...
- JMeter生成性能报表-Windows环境和Linux环境
转载自https://www.cnblogs.com/imyalost/p/10239317.html