布尔操作符(!、&&、||)

当使用 条件判断语句(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.??
  1. true
  2. true
  3. error: Uncaught SyntaxError: Unexpected token ==
  4. false

根据相等操作符的规定,当一个操作数为对象另一个不是时,会调用对象的valueOf()

[] == 0;  --------->  [].valueOf()  ----->  ''  -----> Number('')  ----> 0

当两个操作数都为对象则会比较它们是否指向同一块区域,而[]和{}是两个独立的对象,所以为false。

JavaScript之隐式类型转换的更多相关文章

  1. javascript的隐式类型转换

    首先简单了解js的typeof,会返回六种类型 即 number string boolen function object undefined 也就是六种基本数据类型 显示类型转换大概有以下几种: ...

  2. javascript的隐式类型转换(使(a==1&&a==2&&a==3) 成立)

    一些团队规定禁用 == 运算符换用=== 严格相等.以工程标准衡量,== 带来的便利性抵不上其带来的成本,团队协作时候你看到别人代码中的 ==,有些时候需要判断清楚作者的代码意图是确实需要转型,还是无 ...

  3. 从 (a==1&&a==2&&a==3) 成立中看javascript的隐式类型转换

    下面代码中 a 在什么情况下会打印 1? var a = ?; if(a == 1 && a == 2 && a == 3){ console.log(1); } 这个 ...

  4. 「译」JavaScript 的怪癖 1:隐式类型转换

    原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 ...

  5. 有趣的JavaScript隐式类型转换

    JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加.之所以不同的数据类型之间可以做运算,是因为 ...

  6. JavaScript 隐式类型转换

    JavaScript 隐式类型转换 原文:https://blog.csdn.net/itcast_cn/article/details/82887895 · 1.1 隐式转换介绍 · 1.2 隐式转 ...

  7. JavaScript学习总结(二、隐式类型转换、eval())

    一.(避免)隐式类型转换 console.log(false == 0);   //logs true; console.log(false === 0);   //logs false; conso ...

  8. Javascript显示和隐式类型转换

    1.转换成字符串 多数的JavaScript宿主环境(比如Node.js和Chrome)都提供了全局函数toString: 与此同时Object.prototype也定义了toString方法,使得所 ...

  9. JavaScript显式类型转换与隐式类型转换

    隐式类型转换 四则运算 判断语句 toString 在 JavaScript 中声明变量不需指定类型,对变量赋值也没有类型检查,同时还允许隐式类型转换. 这些特征说明 JavaScript 属于弱类型 ...

随机推荐

  1. Django学习-17-CSRF

    CSRF(跨站请求伪造)         用户请求获取数据时,加入一段加密字符串,只有服务器能反解.         XSS(跨站脚本攻击),JS脚本在网站中运行,如果获取到用户Cookie,可以利用 ...

  2. bzoj 4026 dC Loves Number Theory

    把我写吐了 太弱了 首先按照欧拉函数性质 我只需要统计区间不同质数个数就好了 一眼主席树 其次我被卡了分解质因数这里 可以通过质数筛时就建边解决 不够灵性啊,不知道如何改 #include<bi ...

  3. Windows Developer Day Review

    北京时间 3 月 8 日凌晨 1 点钟,今年的第一次 Windows Developer Day 正式召开.    因为时间太晚看不了直播,我也是第二天早上在公司看的重播.整个会议过程有很多值得去研究 ...

  4. WebForm 生成并显示二维码

    Generate and display QRCode in WebForm. 项目引用 QRCoder生成并显示 QRCode 项目引用 QRCoder How to use QRCoder Via ...

  5. 用自定义注解实现fastjson序列化的扩展

    这篇文章起源于项目中一个特殊的需求.由于目前的开发方式是前后端分离的,基本上是通过接口提供各个服务. 而前两天前端fe在开发中遇到了一些问题:他们在处理字符串类型的时间时会出现精度丢失的情况,所以希望 ...

  6. 【BZOJ2005】【NOI2010】能量采集(莫比乌斯反演,容斥原理)

    [BZOJ2005][NOI2010]能量采集(莫比乌斯反演,容斥原理) 题面 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量 ...

  7. javascript 推箱子游戏介绍及问题

    最近没什么事情,我的一个亲戚在学校学习PHP,课程中老师让他们编写一个javascript版本的推箱子小游戏,他没什么头绪,就来问我,我当时很闲,就随口答应他包在我身上.结果真正写的时候还是花了点时间 ...

  8. 基于fitnesse浅析waferslim引擎

    最近在用fitnesse框架做自动化测试,简单总结一下,后边再补充内容. 1.fitnesse简介:后续补 略,见官网 http://www.fitnesse.org/ 2.waferslim引擎之p ...

  9. iOS刚进入后台接受推送、打开推送调转到相应的界面

    刚进入后台的时候消息处理时候我用了本地推送!可以看我前边写的博客,怎么处理刚进入后台接收推送的案例,链接 /** 注释:打开推送的三种方式:-peter 1.apns的时候,结束进程退出后台:启动的时 ...

  10. IPFS网络是如何运行的(p2p网络)

    IPFS是一个p2p网络,先来看看BitTorrent的p2p网络是如何工作的? 想要bt下载一个文件,首先你需要一个种子文件torrent,种子文件包含至少一个 Tracker(一台服务器地址)信息 ...