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. 一句代码美化你的下框之jquery.selectMM修复版(jquery.selectMM v0.9 beta 20141217)

    一句代码美化你的下框之jquery.selectMM修复版(jquery.selectMM v0.9 beta 20141217) 浏览效果: http://www.beyond630.com/jqu ...

  2. 表单元素的submit()方法和onsubmit事件(转)

    1.表单元素中出现了name="submit"的元素 2.elemForm.submit();不会触发表单的onsubmit事件 3.动态创建表单时遇到的问题 表单元素拥有subm ...

  3. laravel安装说明

    1.composer已安装.没安装可以看我上一篇 :http://www.cnblogs.com/seakt/p/4503249.html 2.配置环境变量,找到composer的位置,一般默认都在 ...

  4. break的使用for循环嵌套

    /* Name:break的使用for循环嵌套 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月21日 02:54:04 Description:以下代码 ...

  5. .NET(C#):觉察XML反序列化中的未知节点

    原文 www.cnblogs.com/mgen/archive/2011/12/12/2284554.html 众所周知XML是可以扩展的,XML的元素可以靠名称识别而不是只按照未知识别.在 XML反 ...

  6. tree(简单并差集)

    tree  Accepts: 156  Submissions: 807  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536/65 ...

  7. ajax异步通讯 遮罩滚动栏,防止并发及误操作

    加入滚动栏的遮罩,滚动栏图片须要自己调整路径 function loading() { var divloading = "<div id=\"loadingdiv\&quo ...

  8. 【LeetCode】Sum Root to Leaf Numbers

    题目 Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a num ...

  9. codeforces #261 C题 Pashmak and Buses(瞎搞)

    题目地址:http://codeforces.com/contest/459/problem/C C. Pashmak and Buses time limit per test 1 second m ...

  10. 在SSIS包中使用 Checkpoint从失败处重新启动包

    使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间. SSI ...