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. SQL学习之空值(Null)检索

    在创建表表,我们可以指定其中的列包不包含值,在一列不包含值时,我们可以称其包含空值null. 确定值是否为null,不能简单的检查是否=null.select语句有一个特殊的where子句,可用来检查 ...

  2. vtp——vlan trunk protcal

    server模式——服务器模式,在该模式下可以建立vlan,删除vlan,该模式下的vlan可以下发到其他的交换机 client模式——客户端模式,被动模式.交换机可以接受从server模式下传来的v ...

  3. Ubuntu常用命令整理

    最近开始用Ubuntu系统了,各种命令很不熟练,想收集一下,以便以后查阅,用这个时常更新的随笔 1.Ubuntu设置与修改用户密码 设置ROOT密码方法:sudo passwd root ,然后输入密 ...

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

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

  5. python 常用模块及方法

    ******************** PY核心模块方法 ******************** os模块: os.remove()         删除文件 os.unlink()        ...

  6. python练习之list

    请用索引取出下面list的指定元素: # -*- coding: utf-8 -*- L = [ ['Apple', 'Google', 'Microsoft'], ['Java', 'Python' ...

  7. iOS 使用xib创建cell的两种初始化方式

    曾几何时,被自己坑过,为了防止下次继续被自己坑,我决定了!在每个我能看到的地方,都把问题写一遍!!! 方法一: ? 1 2 3 4 第一步: [self.collectionView register ...

  8. SQL Server Mysql 对null值理解的不同

    在说到对null值的理解主要是用unique来体现的.也是说null在unique约束看来是一个值还是多个值的问题. 还是开始实验吧. MYSQL create table t(x int ,cons ...

  9. android studio 实现代码混淆

    =======本文章属于转载==========原文章地址:http://my.oschina.net/aibenben/blog/370985 这篇文章等是跟大家分享一在Android studio ...

  10. Ubuntu 用 pptp 建立 vpn 服务

    1.下载pptp sudo apt-get install pptpd 2.配置pptp 须要改动配置下面的文件: pptpd.conf文件:配置链接后的主机ip和能够分配的内存范围 vi /etc/ ...