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 属于弱类型 ...
随机推荐
- canvas动画:自由落体运动
经过前面的文章,我们已经能够在canvas画布上画出各种炫酷的图形和画面,但是这些画面都是禁止的,怎么样才能让他们动起来呢? 如何绘制基本图形可以参考:canvas基本图形绘制 如何对基本图形移动旋转 ...
- SDP(10):文本式大数据运算环境-MongoDB-Engine功能设计
为了让前面规划的互联网+数据平台能有效对电子商务数据进行管理及实现大数据统计功能,必须在平台上再增加一个MongDB-Engine:数据平台用户通过传入一种Context来指示MongoDB-Engi ...
- iOS - UIImageView 动画
1.UIImageView 动画 1.1 播放图片集 播放图片集 @property (nonatomic, strong) UIImageView *playImageView; self.play ...
- C#图解教程 第十章 结构
结构 什么是结构结构是值类型对结构赋值构造函数和析构函数 实例构造函数静态构造函数构造函数和析构函数小结 字段初始化语句是不允许的结构是密封的装箱和拆箱结构作为返回值和参数 关于结构的其他信息 结构 ...
- Java关键字——native
本篇博客我们将介绍Java中的一个关键字——native. native 关键字在 JDK 源码中很多类中都有,在 Object.java类中,其 getClass() 方法.hashCode()方法 ...
- 第九篇:Map/Reduce 工作机制分析 - 作业的执行流程
前言 从运行我们的 Map/Reduce 程序,到结果的提交,Hadoop 平台其实做了很多事情. 那么 Hadoop 平台到底做了什么事情,让 Map/Reduce 程序可以如此 "轻易& ...
- 【BZOJ4530】大融合(Link-Cut Tree)
[BZOJ4530]大融合(Link-Cut Tree) 题面 讨厌权限题!!! Loj链接 题目描述 小强要在 N个孤立的星球上建立起一套通信系统.这套通信系统就是连接 N个点的一个树.这个树的边是 ...
- 完全卸载hadoop安装的组件(hdp版本)
yum remove -y hadoop_* zookeeper* ranger* hbase_* ranger* hbase_* ambari-* hadoop_* zookeeper_* hbas ...
- Linux基础教程(一)——Linux系统简介
Linux的概述 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境.Linux是由Linus Torvalds(林纳斯·托瓦兹)起初开发的,由于 ...
- 微信小程序-布局
flex-direction 传送门 border 传送门 边框 粗细:thin(细线).medium(中粗线)和thick(粗线) 类型:九个确定值:none(无边框线). dotted(由点组成的 ...