上一篇文章提到了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. Hyper-V初涉:功能的添加与虚拟机的创建

    Hyper-V是微软提供的一款高效率的虚拟化管理软件,在早期的Windows服务器中配备Hyper-V组件,Windows 8是首次将企业用Hyper-V集成在个人系统中,可见虚拟化技术的发展之迅速. ...

  2. jdk1.6 webService 客户端代码生成和测试

    参数:测试webService的地址:http://10.113.11.1:9090/enocpService/buildingEngService?wsdl 1,eclipse中新建一个项目, 2, ...

  3. android 编译代码注意事项

    1 安装openjdk1.7 sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-apt update sudo apt-get install op ...

  4. NancyFx开发-Razor视图using外部Dll解决方案

    问题:NancyFx框架 Razor视图无法using 其他项目DLL   解决方案: Nancyfx框架Razor需要在web.config 中声明要引入的命名空间(包括system这些)   &l ...

  5. DataTables 控件使用和心得 (2) - 参数Options

    什么是DataTables参数(Options) 上篇我们说了,DataTables控件的加载函数dataTable()一般都有一个对象参数,这个对象参数就是整个DataTables控件的参数(Opt ...

  6. 从现在开始,使用简单优雅的validata.js

    表单验证,是后台开发中万年不变的话题,在经历许多实战之后发现 使用优雅便捷的validate.js实现验证实在是一件非常愉悦的事情 <form data-validate> Enter: ...

  7. AJAX原理总结

    AJAX全称 Asynchronous JavaScript and XML(异步的JavaScript 和XML) 同步和异步 异步传输是面向字符的传输,单位是字符 同步传输是面向比特,单位是帧,传 ...

  8. Python自动化测试(1)-自动化测试及基本技术手段概述

    生产力概述 在如今以google为首的互联网时代,软件的开发和生产模式都已经发生了变化, 在<参与感>一书提到:某位从微软出来的工程师很困惑,微软在google还有facebook这些公司 ...

  9. java提高篇(二四)-----HashSet

          在前篇博文中(java提高篇(二三)-----HashMap)详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素. ...

  10. java提高篇(十七)-----异常(二)

          承接上篇博文:java提高篇-----异常(一) 五.自定义异常 Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表 ...