上一篇文章提到了javascript中可变值与不可变值,如果你不知道什么是可变值和不可变值,可以先去看看那篇文章,再回来看这篇,因为这篇文章是基于可变值与不可变值讲解的。

那我就默认你知道什么是可变值与不可变值。

1.对于不可变值来说(也就是数字,字符串,布尔,null,undefined),它们是比较值是否相等,如果值是相等的那么它们就是相等的。

2.但对于可变值来说(对象,数组),它们显然比较值不太合适,因为它们的值是可以改变的,所以javascript为了避免这种情况的发生,把它们的比较规则修改成比较引用是否相同也就是说看它们是否是同一个东西创建出来的,如果是那么它们就相等。

 1 var a = [];
2 var b = a;
3 a[0]=2;
4 console.log(a); >>[2]
5 console.log(b); >>[2] 同时也把b的值也修改了,因为数组是可变的类型(也就是我们常说的引用类型)。
6 console.log(a==b); >>true
7 console.log(a===b); >>true

、、、、、、、、、、、、、、、、、、、、、、、、
1 var a = "11";
2 var b = a;
3 a = "22";
4 console.log(a); >>"22"
5 console.log(b); >>"11"
6 console.log(a==b); >>false
7 console.log(a===b); >>false

上面我们只是说了相同类型的值的比较,那么如果是对象与原始值那么它们是怎么样比较的呢?相当于上面的那些它们的比较要复杂一些,如果按照转换的次数来分的话,相同类型的数据比较只需要转换一次,而不同类型的比较则需要转换两次,当然不同类型的转换可能不只是两次,我只是说的大多数情况。

 1 var a = 1;
2 var b = [1];
3 console.log(a==b); >>true 1 var a = "1";
2 var b = [1];
3 console.log(a==b); >>true 1 var a = 1;
2 var b = [1];
3 var c = b.toString();
4 console.log(typeof b); >>object
5 console.log(typeof c); >>string
6 console.log(a==c); >>true
这里数组进行了隐式转换,调用了toString();为什么调用toString()因为数组也是对象,对象是调用这个进行转换成原始值的,如果不是对象那就是调用普通的String、Number方法;

转换过程如下:
  1.首先将调用toString转换b,转换后的b="1";
  2.现在b是一个普通的字符串也就是原始值,那么现在就可以调用Nubmer来转换了,最后就成了数字1;
  

更多关于toString方法的详细说明看对象、数组转换字符串的方法

关于js中值的比较规则问题的更多相关文章

  1. js中this的绑定规则及优先级

    一.   this绑定规则 函数调用位置决定了this的绑定对象,必须找到正确的调用位置判断需要应用下面四条规则中的哪一条. 1.1 默认绑定 看下面代码: function foo() { cons ...

  2. 关于JS中变量提升的规则和原理的一点理解

        关于变量提升,以前在一些教程和书籍上都听到过,平时开发中也知道有这个规律,但是今天突然在一个公开课中听到时,第一反应时一脸懵逼,然后一百度,瞬间觉得好熟悉啊,差点被这个概念给唬住了,不信我给你 ...

  3. 关于JS中变量提升的规则和原理的一点理解(二)

    上篇文章中讲到变量提升和函数提升的先后顺序时蒙了,后来去查了一下资料,特别整理一下. 在<你不知道的JavaScript(上卷)>一书的第40页中写到:函数会首先被提升,然后才是变量. 书 ...

  4. js中值的基本类型与引用类型,以及对象引用,对象的浅拷贝与深拷贝

    js有两种类型的值:栈:原始数据类型(undefinen,null,boolead,number,string)堆:引用数据类型(对象,函数和数组)两种类型的区别是:储存位置不同,原始数据类型直接存储 ...

  5. JS中值类型和引用类型

    一.值类型 例子: var a=10; var b=a; a=20; console.log(b); 例子中,将a的值赋给了b,b=10,然后改变a的值不会影响b的值,a和b是独立的两份,互不影响. ...

  6. js中判定this的规则

    判定this new绑定:新建对象; var bar = new foo(); 明确绑定(call.apply,bind):指定对象; var bar = foo.call(obj) 隐含绑定:环境对 ...

  7. js中对象转化成字符串、数字或布尔值的转化规则

    js中对象可以转化成 字符串.数字.布尔值 一.对象转化成字符串: 规则: 1.如果对象有toString方法,则调用该方法,并返回相应的结果:(代码通常会执行到这,因为在所有对象中都有toStrin ...

  8. JS中使用document.defaultView.getComputedStyle()、currentStyle()方法获取CSS属性值

    在对网页进行调试的过程中,经常会用到js来获取元素的CSS样式,方法有很多很多,现在仅把我经常用的方法总结如: 1. obj.style:这个方法只能JS只能获取写在html标签中的写在style属性 ...

  9. JS中给函数参数添加默认值

    最近在Codewars上面看到一道很好的题目,要求用JS写一个函数defaultArguments,用来给指定的函数的某些参数添加默认值.举例来说就是: // foo函数有一个参数,名为x var f ...

随机推荐

  1. JavaWeb 命名规则

    命名规范命名规范命名规范命名规范 本规范主要针对java开发制定的规范项目命名项目命名项目命名项目命名 项目创建,名称所有字母均小写,组合方式为:com.company.projectName.com ...

  2. 03、AngularJs的模块与控制器

    大部分的应用程序都有一个主方法(main)来组织,实例化,启动应用程序.而AngularJs应用是没有主方法的,它是通过模块来声明应用应该如何启动的.同时,模块允许声明来描述应用中依赖关系,以及如何进 ...

  3. Creating a ClickOnce application

    refer to http://www.youtube.com/watch?v=t4BTLdIMYEY

  4. idea小技巧

    1.不使用import *:Setting=>Editor=>Code Style=>Java=>Imports=>Class count to use/Names co ...

  5. <<数字是世界的>>读后感

    我对这本书的第一印象就是很多书评中提到的,这是一本无论是否有学习过计算机专业知识的人都可以读的书.我一开始不是很能理解这些评价,我是抱着对这个问题的疑惑进行通读的,以后我发现了,它全书中都很少出现计算 ...

  6. postfix启动失败

      [root@localhost pid]# /usr/sbin/postfix start postfix/postfix-script: warning: not owned by postfi ...

  7. 使用的组件:JQuery UI

    jQuery UI包含了许多维持状态的小部件(Widget),因此,它与典型的 jQuery 插件使用模式略有不同.所有的 jQuery UI 小部件(Widget)使用相同的模式,所以,只要您学会使 ...

  8. 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)

    解剖SQLSERVER 第十四篇    Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究 ...

  9. [你必须知道的NOSQL系列]专题一:MongoDB快速入门

    一.前言 现在越来越多的公司开始采用非关系数据库了,并且很多公司的面试都要求面试者有MongoDB的使用经验,至于非关系数据库与关系型数据库之间的区别大家可以自行百度.但是作为程序员的我们,既然大部分 ...

  10. 为什么我的新项目选择了Quick-cocos2d-x

    混Quick社区快一周了,还是决定分享一下我选择Quick的原因. 一是向大家介绍一下我自己,同时也希望给大家提供一个参考首先,向大家介绍一下我自己姓名,年龄,性别这些都不重要了.我是一名程序员,在游 ...