JavaScript之隐式类型转换
布尔操作符(!、&&、||)
当使用 条件判断语句(if...else) 以及 布尔操作符(!、&&、||) 时,会调用Boolean()进行隐式类型转换
- 转换为false的有:0, null, undefined, NaN, '', false
- 其余都为true([], {}为true)
![]; // !Boolean([]); ------------> false
!2; // false !null; // !Boolean(null); ------------> true
!undefined; // true
!0; // true if([]) consolo.log('true'); // if(Boolean([])) ... -----------> true
乘/除法操作符(*、/)
- 若有一个操作数为NaN,则结果为NaN
- 若其中一个操作数不为数字,则调用Number()将其转换为数值
2 * '5'; //
2 * '5a'; // 2 * Number('5a') --------> 2 * NaN ------------> NaN
加法操作符(+)
- 若有一个操作数为NaN,结果为NaN
- 若有一个操作数为字符串,则将另一个数转换为字符串然后拼接
- 若有一个操作数为对象,则调用对象的toString方法再执行上一步
// num: 数值操作数 str: 字符串 obj: 对象
num + 非字符串操作数(NaN/undefined/null/false/true) = num + Number(非字符串操作数)
num + str = 'numstr'; // 1 + 2 + '3' = '33' str + NaN = 'strNaN'; // '1' + NaN = '1NaN'
str + null = 'strnull'; // '1' + null = '1null'
str + true = 'strture'; obj + num = obj.toString() + num; // Math + 123 = '[object Math]123'
obj + str = obj.toString() + str; // Math + '123' = '[object Math]123'
减法操作符(-)
- 若一个操作数为字符串、null、undefined、布尔值,就调用Number()将其转换为数值再运算
- 若一个操作数为对象则调用该对象valueOf(),没有valueOf()则调用toString()
1 - '2' = -1;
1 - '123a' = NaN; // 1 - Numer('123a')
1 - Math = NaN; // 1 - Math.valueOf()
1 - true = 0;
关系操作符(>、<、>=、<=)
- 与NaN比较都会返回false
- 若两个操作数都为字符串,则比较字符串的编码值
- 若有一个操作数为数值,则对另一个操作数用Number()转换
- 若有一个操作数为对象,则调用该对象valueOf(),没有valueOf()则调用toString()
4 > '2'; // true
4 > '2a'; // false
4 > Math; // false
4 > true; // true 'ab' > 'a' // true
相等操作符(==、!=)
- 字符串、布尔类型和数值比较,现将前者用Number()转换为数值
- 若一个操作数是对象另一个不是,则调用该对象valueOf(),没有valueOf()则调用toString()
- 若两个操作数都是对象,则比较它们是不是同一个对象(地址是否相同)
- null和undefined是相等的
- null和undefined不会转换成任何值
- 任何数都不等于NaN,包括NaN自己
// true
123 == '123';
1 == true;
'123' == new String(123);
123 == new String(123);
null == undefined; // false
null == 0;
2 == true;
new String(123) == new String(123);
全等操作符(===、!==)
全等操作符不会转换操作数
123 === '123'; // false
null === undefined; // false
总结
你能说说下面结果是什么以及原因吗?
[] == 0; // 1.??
{} == 0; // 2.??
0 == {}; // 3.??
[] == {}; // 4.??
- true
- true
- error: Uncaught SyntaxError: Unexpected token ==
- false
根据相等操作符的规定,当一个操作数为对象另一个不是时,会调用对象的valueOf()
[] == 0; ---------> [].valueOf() -----> '' -----> Number('') ----> 0
当两个操作数都为对象则会比较它们是否指向同一块区域,而[]和{}是两个独立的对象,所以为false。
JavaScript之隐式类型转换的更多相关文章
- javascript的隐式类型转换
首先简单了解js的typeof,会返回六种类型 即 number string boolen function object undefined 也就是六种基本数据类型 显示类型转换大概有以下几种: ...
- javascript的隐式类型转换(使(a==1&&a==2&&a==3) 成立)
一些团队规定禁用 == 运算符换用=== 严格相等.以工程标准衡量,== 带来的便利性抵不上其带来的成本,团队协作时候你看到别人代码中的 ==,有些时候需要判断清楚作者的代码意图是确实需要转型,还是无 ...
- 从 (a==1&&a==2&&a==3) 成立中看javascript的隐式类型转换
下面代码中 a 在什么情况下会打印 1? var a = ?; if(a == 1 && a == 2 && a == 3){ console.log(1); } 这个 ...
- 「译」JavaScript 的怪癖 1:隐式类型转换
原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 ...
- 有趣的JavaScript隐式类型转换
JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加.之所以不同的数据类型之间可以做运算,是因为 ...
- JavaScript 隐式类型转换
JavaScript 隐式类型转换 原文:https://blog.csdn.net/itcast_cn/article/details/82887895 · 1.1 隐式转换介绍 · 1.2 隐式转 ...
- JavaScript学习总结(二、隐式类型转换、eval())
一.(避免)隐式类型转换 console.log(false == 0); //logs true; console.log(false === 0); //logs false; conso ...
- Javascript显示和隐式类型转换
1.转换成字符串 多数的JavaScript宿主环境(比如Node.js和Chrome)都提供了全局函数toString: 与此同时Object.prototype也定义了toString方法,使得所 ...
- JavaScript显式类型转换与隐式类型转换
隐式类型转换 四则运算 判断语句 toString 在 JavaScript 中声明变量不需指定类型,对变量赋值也没有类型检查,同时还允许隐式类型转换. 这些特征说明 JavaScript 属于弱类型 ...
随机推荐
- 从零一起学Spring Boot之LayIM项目长成记(四) Spring Boot JPA 深入了解
前言 本篇内容主要是一些关于JPA的常用的一些用法等.内容也是很多是看其他博客学来的,顺道在本系列博客里抽出一篇作为总结.下面让我们来看看吧. 不过我更推荐大家读本篇:https://lufficc. ...
- jQuery UI Autocomplete Combobox 配 ASP.NET DropDownList
0.引言 1.起因 一开始使用Autocomplete做了一个自动补全的文本框,如上图.后来因业务需要希望能在这个文本框的边上做个下拉列表按钮,一按就展开所有支持 ...
- 【BZOJ5093】图的价值(第二类斯特林数,组合数学,NTT)
[BZOJ5093]图的价值(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 单独考虑每一个点的贡献: 因为不知道它连了几条边,所以枚举一下 \[\sum_{i=0}^{n-1}C_{n-1 ...
- UWP 使用Telerik Chart控件
Telerik开发的chart功能异常强大 用户可以自行在商店搜索"UI for uwp demos". 下面我就结合以下我的软件,来说明一下饼状图的实现. 看看效果: 先看一下X ...
- Hive数据仓库笔记(三)
Joins: Inner joins: hive> SELECT * FROM sales; Joe 2 Hank 4 Ali 0 Eve 3 Hank 2 hive> SELECT * ...
- 属性动画 ValueAnimator 运行原理全解析
最近下班时间都用来健身还有看书了,博客被晾了一段时间了,原谅我~~~~ 提问环节 好,废话不多说,之前我们已经分析过 View 动画 Animation 运行原理解析,那么这次就来学习下属性动画的运行 ...
- DIY福音:Firefox菜单及右键菜单ID大全
每一个折腾Firefox的Diyer都是上辈子折翼的天使,致自己! 打磨Firefox界面的时候最多的就隐藏一些平常根本用不上的一些菜单,常规的做法就是安装DOM Inspector扩展右键查找大法寻 ...
- Ameba读写分离_mycat分库分表_redis缓存
1 数据库的读写分离 1.1 Amoeba实现读写分离 1.1.1 定义 Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy 优点: 配置读写分离时较为简单.配置 ...
- IPFS开发团队是如何工作的?
小编不是一个很八卦的人,连当红明星都认不全.不过,今天还是带领大家来扒一扒ipfs开发团队是如何工作的. 工作方式: 全体会议:每周一有一个全体会议,这个会议是提前安排好的一个日程 任务讨论:把大任务 ...
- 剑指Offer-删除链表中重复的结点
package LinkedList; /** * 删除链表中重复的结点 * 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. * 例如,链表1-> ...