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 属于弱类型 ...
随机推荐
- java,while循环的使用,接收用户的输入,进行不同的操作!
package cn.edu.nwpu.java; import java.util.Scanner; public class IsoscelesTriangle { public static v ...
- Angular21 动态绑定CSS样式
1 需求 在前端开发中通常需要动态对某些元素的样式进行动态设定,传统的CSS绑定分为CSS类绑定和Style样式绑定:在Angular中利用相关指令同样可以完成CSS类绑定和CSS样式绑定 2 内置指 ...
- iOS - Quartz 2D 第三方框架 Charts 绘制图表
1.Charts 简介 使用第三方框架 Charts 绘制 iOS 图表.GitHub 源码 Charts Charts 是一款用于绘制图表的框架,可以绘制柱状图.折线图.K线图.饼状图等.Chart ...
- 异常---ment.getElementById("searchForm").submit is not a function
今天在写代码的时候JS一直报上面这个错.搞了半天一直想不明白 .我看别的页面都是这样写了就是没有一点错.. 可能是写了一个晚上的代码..头有点晕..后来终于找到原因了..浪费我两个小时啊..杯具.. ...
- day9(Hash、字典)
一.Hash 简介: Hash,一般被翻译成"散列",也有直接音译"哈希"的,就是把任意长度的输入,通过哈希算法,变换成固定长度的输出,输出的结果就叫做哈希值, ...
- JS实现回到Top(顶部)--JavaScript
当我们浏览一段很长的网页时,已经看到底部了,想回到顶部看前面的内容,可是需要滚动好几转鼠标滑轮或者拉动滚动条走好长“一段路”.这对于用户来说,体验效果是不够好的.如果我们借助简单的一个按钮,点击一下就 ...
- 【BZOJ3993】星际战争(网络流,二分答案)
[BZOJ3993]星际战争(网络流,二分答案) 题面 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团 ...
- tomcat环境配置 Linux 与 Windows
Windows:例如tomcat安装在 E:\tomcat 需要在环境变量配置:CATALINA_HOME=E:\tomcat CATALINA_BASE= E:\tomcat Linux:例如tom ...
- Oracle删除控制文件恢复
控制文件被删除后,系统崩溃,下面介绍下如何恢复控制文件 SQL> conn / as sysdbaConnected to an idle instance.SQL> startup no ...
- 封装好的MD5加密
/** * 不可逆加密类 为密码提供不可逆的加密运算,使用MD5算法 * * 使用方法: MD5 encrypt = new MD5(); encrypt.getMD5ofStr(str); //返回 ...