关于js中值的比较规则问题
上一篇文章提到了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中值的比较规则问题的更多相关文章
- js中this的绑定规则及优先级
一. this绑定规则 函数调用位置决定了this的绑定对象,必须找到正确的调用位置判断需要应用下面四条规则中的哪一条. 1.1 默认绑定 看下面代码: function foo() { cons ...
- 关于JS中变量提升的规则和原理的一点理解
关于变量提升,以前在一些教程和书籍上都听到过,平时开发中也知道有这个规律,但是今天突然在一个公开课中听到时,第一反应时一脸懵逼,然后一百度,瞬间觉得好熟悉啊,差点被这个概念给唬住了,不信我给你 ...
- 关于JS中变量提升的规则和原理的一点理解(二)
上篇文章中讲到变量提升和函数提升的先后顺序时蒙了,后来去查了一下资料,特别整理一下. 在<你不知道的JavaScript(上卷)>一书的第40页中写到:函数会首先被提升,然后才是变量. 书 ...
- js中值的基本类型与引用类型,以及对象引用,对象的浅拷贝与深拷贝
js有两种类型的值:栈:原始数据类型(undefinen,null,boolead,number,string)堆:引用数据类型(对象,函数和数组)两种类型的区别是:储存位置不同,原始数据类型直接存储 ...
- JS中值类型和引用类型
一.值类型 例子: var a=10; var b=a; a=20; console.log(b); 例子中,将a的值赋给了b,b=10,然后改变a的值不会影响b的值,a和b是独立的两份,互不影响. ...
- js中判定this的规则
判定this new绑定:新建对象; var bar = new foo(); 明确绑定(call.apply,bind):指定对象; var bar = foo.call(obj) 隐含绑定:环境对 ...
- js中对象转化成字符串、数字或布尔值的转化规则
js中对象可以转化成 字符串.数字.布尔值 一.对象转化成字符串: 规则: 1.如果对象有toString方法,则调用该方法,并返回相应的结果:(代码通常会执行到这,因为在所有对象中都有toStrin ...
- JS中使用document.defaultView.getComputedStyle()、currentStyle()方法获取CSS属性值
在对网页进行调试的过程中,经常会用到js来获取元素的CSS样式,方法有很多很多,现在仅把我经常用的方法总结如: 1. obj.style:这个方法只能JS只能获取写在html标签中的写在style属性 ...
- JS中给函数参数添加默认值
最近在Codewars上面看到一道很好的题目,要求用JS写一个函数defaultArguments,用来给指定的函数的某些参数添加默认值.举例来说就是: // foo函数有一个参数,名为x var f ...
随机推荐
- 『TCP/IP详解——卷一:协议』读书笔记——16
2013-08-26 22:50:54 6.4 ICMP时间戳请求与应答 ICMP时间戳请求允许系统向另一个系统查询当前的时间.返回的建议值是自午夜开始计算的毫秒数(协调的统一时间,Coordinat ...
- 冒泡排序-java
排序-冒泡排序 基本思想:从一端开始,逐个比较相邻的两个元素,发现倒序即交换. 这里按从后往前(从下往上)逐个比较相邻元素. 平均时间:O(n2) 最好情况:O(n) 最坏情况:O(n2)(逆序) 辅 ...
- JavaScript 笔记
function (函数)document(文档 get获得文档中..) <script type="text/javascript"> function yz(){ ...
- No prohects are avaliable for deployment to this server
没有项目可用于部署到该服务器的项目或者所有项目都已部署到该服务器或没有发现项目 报错的就是这样的信息,网上看了很多解决方案,比如:http://ttov.blog.163.com/blog/stati ...
- typeid详解(转)
(http://www.cppblog.com/smagle/archive/2010/05/14/115286.html) 在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time ...
- oracle在impdp时报ORA-31655和ORA-39154
检查表空间大小设置的是否合理. 另外可以试试 grant IMP_FULL_DATABASE to user;增加导入权限. (转)
- sphinx的配置
## Sphinx configuration file sample## WARNING! While this sample file mentions all available options ...
- Linux之源码包安装软件
安装准备 安装c语言编辑器 gcc 压缩包 node-v6.2.0-linux-x64.tar.gz 源码包保存位置 /usr/local/src/ 源码包安装位置 /us ...
- SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好?
SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好? 今天遇到某人在我以前写的一篇文章里问到 如果统计信息没来得及更新的话,那岂不是统计出来的数据时错误的 ...
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...