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
随机推荐
- Android组件内核之Service内核原理(三)
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下三个内容来介绍Service内核原理: [startSe ...
- JQuery 全选 反选 获取Table 中指定td的元素值
//全选 function initTableCheckbox() { var $thr = $('table thead tr'); var $checkAllTh = $('<th>& ...
- ScrollView嵌套listview显示一行bug
首先看看修复bug之后的显示对比图,结果一目了然 显示一行之前 修改bug之后 主要就是ScrollView嵌套listview显示计算 直接上代码 一目了然 <com.wechaotou ...
- 关于KiCAD的一些插件
关于KiCAD的一些插件 https://gitee.com/KiCAD-CN/KiCad-CN-Forum/blob/master/KiCad_help_zh_CN.md#swapit-%E5%B7 ...
- grpc协议--客户端构造
由于服务端不在构造,已经构造完成不做构造 gRPC 接口名字为service,proto文件内有定义 1.本目录生成grpc文件 python -m grpc_tools.protoc -I. --p ...
- ansible如何用root用户运行普通用户授权
ansible默认以root用户进行授权,但是需要用普通用户执行一些命令操作: 如: 1. ansible 10.0.0.1 -m raw -a "date" -u www 但是会 ...
- css 垂直居中、水平居中
在父元素.子元素未知的情况下居中有两种方法: 第一种方法: .partent{ display:flex; justify-content:center; align-items:center; } ...
- asp.net core Mvc 增删改查
1.创建项目 创建Data文件夹 创建实体类Students/cs public class Students { public Guid Id { get; set; } public string ...
- 常见条码类型介绍(Code 39、Code 128、EAN-8、EAN-13、EAN-128、ISSN、TIF、TIF-14、UPC(A)、UPC(E))
常见条码类型,如下: 1.Code 39 Code 39,又称为"Code 3 of 9",是非零售市场中最常用的格式,用于盘存和跟踪.Code 39码编码规则简单,误码率低.所能 ...
- putty字体和颜色修改
来源:https://www.igvita.com/2008/04/14/custom-putty-color-themes/ 网站上有putty的注册表,可以修改putty显示的配色方案. 非常棒!