转:js不同类型对象的比较规则
| Type(x) | Type(y) | Result |
|---|---|---|
| type(x)==type(y) | x===y | |
| otherwise... | false | |
| null | undefined | true |
| undefined | null | true |
| Number | String | x==toNumber(y) |
| String | Number | toNumber(x)==y |
| Boolean | (any) | toNumber(x)==y |
| (any) | Boolean | x==toNumber(y) |
| String or Number | Object | x==toPrimitive(y) |
| Object | String or Number | toPrimitive(x)==y |
~~~1.总是转换为相同的原始类型再做判断,2.逻辑值总是转换为数值类型,3.数值类型和字符串类型比较,总是把字符串转为数值,4.对象(引用类型)总是转换为原始类型再比较( obj.valueOf(), arr.toString() )。
~~~这就是通常说的js复杂的隐式类型转换! 经过这样一整理,似乎也不是很复杂
例子一:
[0]==ture;
首先会把ture进行toNumber,结果为1,式子及转化为 [0]==1
然后[0]会被toString(),结果为“0”,式子转化为“0”==1
接着“0”会被toNumber(),结果为0,式子转化为0==1
最后根据type(x)==type(y),式子转化为0===1
所以[0]==true会得到false
例子二:
“potato”==true;
首先true会被toNumber,结果为1,式子转化为“potato”==1
然后“potato”会被toNumber,结果为NaN,式子转化为NaN==1
根据typeof(x)==typeof(y),式子转化为NaN===1
所以“potato”==true会得到false
例子三:
object with valueOf
str = new Number(1);
str.toString = function(){return "2"};
str==1;
这里typeof str == "object",所以对str进行toPrimitive,这里会对str进行valueOf取值得到1
所以式子转化为1==1
所以str==1得到true
例子四:
object with toString
var obj = {
toString : function(){return "2"}
};
obj==1
这里typeof obj == "object",对obj进行toPrimitive,首先进行valueOf得到object,继续进行toString()得到“2”,式子专为"2"==1
对“2”进行toNumber得到2,式子转为2==1
所以obj==1得到false
例子5:
[]==[]
左右是不同的对象,所以false
![]==[]
首先![]==false,这里[]是一个即存在的对象,若将其强制专为bool类型,通过!![]得到ture,所以![]==false,此时式子专为false==[]
然后false专为0,式子专为0==[]
然后[]专为"",式子专为0==“”
然后""转为0,式子专为0==0
所以![]==[]得到true
例子6:
!{}=={}
首先!{}专为false,规则和5一样,式子转为false=={}
false专为0,式子转为0=={}
对{}进行toPrimitive得到"[object Object]",式子专为0=="[object Object]"
对"[object Object]"进行toNumber得到NaN,式子专为0==NaN
所以!{}=={}得到 false
转:js不同类型对象的比较规则的更多相关文章
- 深入js系列-类型(对象)
开篇 值的传递方式 1.值传递 表示传递过程中复制了值 2.引用传递 表示传递过程中传递的是值的引用 js的传递方式 值传递 看下面的例子 // 这里值传递很容易理解 var a = 1 var b ...
- js中判断对象具体类型
大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...
- js中推断对象详细类型
大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...
- js基本类型存放和对象存放的区别(对象遍历)
js的基本类型,对象类型的应用在初学的时候,需要自己加以明确,明确了数据类型,在使用过程中才能正确使用变量.如下两个例子是摘自初学时的笔记,为大家提供参考. 1.对象可以存放属性和方法,js基本类型不 ...
- 4月5日--课堂笔记--JS内置对象
JavaScript 4.5 一. JS内置对象 1.数组Array a)创建语法1:var arr=new Array(参数); i. 没有参数:创建一个初始容量为0的数组 ii. ...
- JS 强制类型转化
在Js中, 强制类型转化分为两种情况: 一种是引用类型转化基本类型, 如数组转化成数字:一种是两种不同基本类型之间的转化,如字符串转化为数字.你不能将基本类型转化成引用类型,比如,不可能把数字转化为数 ...
- JS中的对象和方法简单剖析
众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...
- JS的一些对象
JS是基于对象的语言.当然此时都说是面向对象的语言. 类:模板,原型对象 对象:具体的实例 原型对象: var user = { name:"xiaoxiao", age:5 ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
随机推荐
- C++中const简介及用法
1.const简介 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰 ...
- 在OS X 10.10系统上安装Navicat Premium中文破解版11.0.16教程
此链接是Navicat Premium中文破解版11.0.16安装包里面并带有中文汉化包 http://pan.baidu.com/s/1ntjz6HF#path=%252F 一.Navicat Pr ...
- Memcached基础
1.实例化 MemcachedClient client = new XMemcachedClient(); public XMemcachedClient() public XMemcachedCl ...
- Mac OS X下Maven的安装与配置
Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录.例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven cl ...
- 简析TCP的三次握手与四次挥手
TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...
- JavaEE学习之设计模式
转自:http://mp.weixin.qq.com/s?__biz=MjM5OTMxMzA4NQ==&mid=221913387&idx=2&sn=d5d006300722f ...
- win7 ie10输入网址显示无法显示此页问题的解决
忽然又一天,非常奇怪,所有的浏览器都无法访问网页,直接输入IP也是不行. 本人试过各种方法,包括用360进行修复:清除%temp%下文件:看是否设错了dns, 升级和修复IE,重新注册ie相关的dll ...
- 关于Python网络爬虫实战笔记①
python网络爬虫项目实战笔记①如何下载韩寒的博客文章 python网络爬虫项目实战笔记①如何下载韩寒的博客文章 1. 打开韩寒博客列表页面 http://blog.sina.com.cn/s/ar ...
- django学习之Model(五)MakingQuery
接着上篇. 10-一次更新多个对象 有时想要对QuerySet中的所有对象的某一个field来设定一个值,这时候可以像下边这样用update(): # Update all the headlines ...
- VS2015如何另存解决方案文件-修改解决方案sln文件的路径
原文:VS2005如何另存解决方案文件-修改解决方案sln文件的路径 修改解决方案sln文件的路径 方法一:工具→选项→项目和解决方案,可设置项目的默认保存位置.方法二:"解决方案资源管理器 ...