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不同类型对象的比较规则的更多相关文章

  1. 深入js系列-类型(对象)

    开篇 值的传递方式 1.值传递 表示传递过程中复制了值 2.引用传递 表示传递过程中传递的是值的引用 js的传递方式 值传递 看下面的例子 // 这里值传递很容易理解 var a = 1 var b ...

  2. js中判断对象具体类型

    大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...

  3. js中推断对象详细类型

    大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...

  4. js基本类型存放和对象存放的区别(对象遍历)

    js的基本类型,对象类型的应用在初学的时候,需要自己加以明确,明确了数据类型,在使用过程中才能正确使用变量.如下两个例子是摘自初学时的笔记,为大家提供参考. 1.对象可以存放属性和方法,js基本类型不 ...

  5. 4月5日--课堂笔记--JS内置对象

    JavaScript 4.5 一.    JS内置对象 1.数组Array a)创建语法1:var arr=new Array(参数); i.       没有参数:创建一个初始容量为0的数组 ii. ...

  6. JS 强制类型转化

    在Js中, 强制类型转化分为两种情况: 一种是引用类型转化基本类型, 如数组转化成数字:一种是两种不同基本类型之间的转化,如字符串转化为数字.你不能将基本类型转化成引用类型,比如,不可能把数字转化为数 ...

  7. JS中的对象和方法简单剖析

    众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...

  8. JS的一些对象

    JS是基于对象的语言.当然此时都说是面向对象的语言. 类:模板,原型对象    对象:具体的实例 原型对象: var user = { name:"xiaoxiao", age:5 ...

  9. 浅解析js中的对象

    浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...

随机推荐

  1. C++中const简介及用法

    1.const简介 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰 ...

  2. 在OS X 10.10系统上安装Navicat Premium中文破解版11.0.16教程

    此链接是Navicat Premium中文破解版11.0.16安装包里面并带有中文汉化包 http://pan.baidu.com/s/1ntjz6HF#path=%252F 一.Navicat Pr ...

  3. Memcached基础

    1.实例化 MemcachedClient client = new XMemcachedClient(); public XMemcachedClient() public XMemcachedCl ...

  4. Mac OS X下Maven的安装与配置

    Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录.例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven cl ...

  5. 简析TCP的三次握手与四次挥手

    TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...

  6. JavaEE学习之设计模式

    转自:http://mp.weixin.qq.com/s?__biz=MjM5OTMxMzA4NQ==&mid=221913387&idx=2&sn=d5d006300722f ...

  7. win7 ie10输入网址显示无法显示此页问题的解决

    忽然又一天,非常奇怪,所有的浏览器都无法访问网页,直接输入IP也是不行. 本人试过各种方法,包括用360进行修复:清除%temp%下文件:看是否设错了dns, 升级和修复IE,重新注册ie相关的dll ...

  8. 关于Python网络爬虫实战笔记①

    python网络爬虫项目实战笔记①如何下载韩寒的博客文章 python网络爬虫项目实战笔记①如何下载韩寒的博客文章 1. 打开韩寒博客列表页面 http://blog.sina.com.cn/s/ar ...

  9. django学习之Model(五)MakingQuery

    接着上篇. 10-一次更新多个对象 有时想要对QuerySet中的所有对象的某一个field来设定一个值,这时候可以像下边这样用update(): # Update all the headlines ...

  10. VS2015如何另存解决方案文件-修改解决方案sln文件的路径

    原文:VS2005如何另存解决方案文件-修改解决方案sln文件的路径 修改解决方案sln文件的路径 方法一:工具→选项→项目和解决方案,可设置项目的默认保存位置.方法二:"解决方案资源管理器 ...