关于js中值的比较规则问题
2016-02-07 14:10
483 查看
上一篇文章提到了javascript中可变值与不可变值,如果你不知道什么是可变值和不可变值,可以先去看看那篇文章,再回来看这篇,因为这篇文章是基于可变值与不可变值讲解的。
那我就默认你知道什么是可变值与不可变值。
1.对于不可变值来说(也就是数字,字符串,布尔,null,undefined),它们是比较值是否相等,如果值是相等的那么它们就是相等的。
2.但对于可变值来说(对象,数组),它们显然比较值不太合适,因为它们的值是可以改变的,所以javascript为了避免这种情况的发生,把它们的比较规则修改成比较引用是否相同也就是说看它们是否是同一个东西创建出来的,如果是那么它们就相等。
上面我们只是说了相同类型的值的比较,那么如果是对象与原始值那么它们是怎么样比较的呢?相当于上面的那些它们的比较要复杂一些,如果按照转换的次数来分的话,相同类型的数据比较只需要转换一次,而不同类型的比较则需要转换两次,当然不同类型的转换可能不只是两次,我只是说的大多数情况。
更多关于toString方法的详细说明看对象、数组转换字符串的方法
那我就默认你知道什么是可变值与不可变值。
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方法的详细说明看对象、数组转换字符串的方法
相关文章推荐
- BZOJ 1014: [JSOI2008]火星人prefix Splay+二分
- javascript中可变值与不可变值(原始值)
- Intellij IDEA14 下添加ExtJS提示支持
- JavaScript模式 读书笔记四
- 10分钟掌握XML、JSON及其解析(下)
- 10分钟掌握XML、JSON及其解析(中)
- 10分钟掌握XML、JSON及其解析(上)
- javascript几个知识点
- js中如果省略分号那么它是如何运行的
- 让JS写的更接近OOP
- JSON解析
- js中的preventDefault与stopPropagation详解
- HYSBZ/BZOJ 1013 [JSOI2008] 球形空间产生器sphere - 高斯约当消元
- javascript面向对象编程
- ember.js的render过程分析
- ember.js提供的基础服务介绍
- 深入解读ember.js的对象体系
- 介绍javascript MVC框架:ember框架的基本概念
- 201602061615_《Javascript方法之map();filter();——以前一直很混》
- 深入浅析JavaScript面向对象和原型函数