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
随机推荐
- c# 盖尔-沙普利算法的改进
盖尔-沙普利算法 “盖尔-沙普利算法”(the Gale-Shapley algorithm),也被称为“延迟接受算法”(deferred-acceptance algorithm),简称“GS算法” ...
- Spring Boot,Spring Data JPA多数据源支持配置
1 配置文件 wisely.primary.datasource.driverClassName=oracle.jdbc.OracleDriver wisely.primary.datasource. ...
- Centos安装mysql5.6.33
下载安装包 百度网盘地址: 链接:https://pan.baidu.com/s/15xaHIqvjggS_rFP_jL-BVA 提取码:mh48 上传到服务器 mkdir mysql #在/us ...
- 小白的第一篇python博客
学习python课程三天,先了解了计算机的历史及各种发展史,python的历史及部分语法,python主要学习内容有"hello world",int常量.str字符串,print ...
- python小项目(-)图片转字符画
# -*- coding: utf-8 -*- from PIL import Image codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrj ...
- Java中的Set集合以及HashSet
Set集合: Set继承自Collection,所以没有什么特别的方法. 需要注意的是,Set集合不包含重复元素,我们重点了解Set集合如何保证不包含多余元素. HashSet: HashSet如何保 ...
- 关于ps前端工程师简单配置
1.创建Web网页设计稿的预设参数 1920*1080 72 透明 2.定位组或定位图层 可以在ps选项栏中,勾选“自动选择”+组/图层 或者 ctrl键+组/图层: 3.视图 ...
- C/C++ 16进制转字符串,字符串转16进制 EX
{ int Encryption::HexToStr(char *Hex) { ; ; ] = { }; ] >= ] <= ') { buf[] = Hex[]; _0 = atoi(b ...
- 基于Flink和规则引擎的实时风控解决方案
案例与解决方案汇总页:阿里云实时计算产品案例&解决方案汇总 对一个互联网产品来说,典型的风控场景包括:注册风控.登陆风控.交易风控.活动风控等,而风控的最佳效果是防患于未然,所以事前事中和事后 ...
- 【LeetCode 20】有效的括号
题目链接 [题解] 一道傻逼括号匹配题 [代码] class Solution { public: bool isValid(string s) { vector<char> v; int ...