Javascript的比较汇总


Posted in Javascript onJuly 25, 2016

在Javascript应用过程中会遇到各式各样的比较,今天给大家整理了三种情况,一起来学习下。

1.两个对象的比较

Javascript的比较中参杂了一些比较奇怪的特性,我们来看一些比较简单的比较。

// 原始值的比较
> var a = 12
undefined
> var b = 12
undefined
> a == b
true
> a === b
true
// 对象的比较
> var c = []
undefined
> var d = []
undefined
> c == d
false
> c === d
false

由上面的结果可以看出比较两个原始值跟比较对象规则似乎有点不同,比较两个对象值的话即便它们的值相同,但是最后的结果是不一样的。比较两个对象,应该比较的是两个对象的引用。

如果我们这样操作:

> var m = {}
undefined
> n = m
{}
> n === m
true

表示两个变量都指向同一个对象,所以它们就是相同的了。

2.不同类型的比较

还有下面这个比较特殊的情况

> 12 == "12"
true

> null == undefined
true
> undefined == false
false
> null == false
false
> null === undefined
false

为什么整型能够等于字符串?这是由于==(等于而非全等)并不比较类型,它比较之前会将需要比较的值进行类型转换,这里的话会将字符串转换成数值类型然后进行比较。为什么这么肯定? 我们做一下实验。

> 1 + 2
3
> 1 + "2"
'12'
> 2 < "12"
true
> "2" < "12"
false

从上面例子可以看出,数值2确实是比字符串12小的。如果比较之前是数值转换成字符串那结果应该是"2" > "12"才对。
还不相信?我再举个例子。

> "12d" > 12
false
> "12d" < 12
false
> "12d" == 12
false
> "12" < "12d"
true

这是为什么呢?如果是将12转换成字符串的话,那12d应该是大于12才对吧。为什么怎么比较都是false?我估计是由于下面这个特殊的家伙。

> NaN < 1
false
> NaN > 1
false

NaN无论跟什么进行比较,都会返回false。包括它自己。所以要判断一个变量是不是NaN最好的办法就是x != x如果返回的是true则表明x是NaN。那么这里应该就是当12d要转换成数值类型的时候由于带有特殊的字符,最后变成了NaN了,跟数值类型无论怎么比较结果都是false。

对于数字与字符串操作符来说,加号运算符跟比较运算符的行为有所不同。加号运算符更偏爱字符串,如果其中一个操作数是字符串的话则会转换成字符串。而比较运算符则比较偏爱数字,只有在两个数字都为字符串的时候才会进行字符串比较。
至于上面的null 跟 undefined。。。。。我暂时也不知道怎么解释它们的行为。我也只能姑且记住。因为它们比较特殊。

3.对象跟原始值的比较

如果两个需要比较的对象一个是javascript对象一个是字符串,则会进行某种程度上的类型转换。想办法把对象的值转换成原始值。一般来说就有valueOf, toString两种方法。下面是一个空对象的转换流程:

// 我直接明文写出来了
> a = {}
{}
// 1. valueOf 转换
> a.valueOf()
{}

// 2. 如果上面操作得到的不是一个原始值则进而用toString 转换。(反之亦然)
> a.toString()
'[object Object]'
> a == '[object Object]'
true

上面其实是一个内置对象的转换过程,也是javascript的机制。首先它会调用valueOf进行转换,如果得到的值并不是一个原始值,则会进而调用toString进行转换,最后得到的值是'[object Object]'一个很奇怪的值,不过它是原始值。如果把变量a跟这个值做相等判断(不是全等)则可以得出一个true的结果。(是不是被它搞崩溃了?)

然而权威指南给了如下原则,我们可以参考一下。

原始值的转换JavaScript语言核心内置类首先尝试使用ValueOf转换,然后使用toString进行转换。除了日期类,它只使用toString进行转换。那些不是JavaScript核心中的对象则通过各自的实现中定义的方式来转换为原始值。
根据上面的解释。我们的a={}与原始值进行比较的时候,会先调用valueOf函数,它的结果是{}显然不是一个原始值。则会使用toString进行转换。最后得出了那个很奇怪的结果。不过这个很奇怪的结果'[object Object]'确实是 {}的原始值。(它是字符串的字面量)。

以上就是Javascript中的比较汇总,希望本文所述对大家学习javascript时有所帮助。

Javascript 相关文章推荐
jquery选择器使用详解
Apr 08 Javascript
实例说明为什么不要行内使用javascript
Apr 18 Javascript
bootstrap布局中input输入框右侧图标点击功能
May 16 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
Feb 20 Javascript
关于vue.js过渡css类名的理解(推荐)
Apr 10 Javascript
Angular 作用域scope的具体使用
Dec 11 Javascript
jQuery中DOM操作原则实例分析
Aug 01 jQuery
layui字体图标 loading图标静止不旋转的解决方法
Sep 23 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
Nov 11 jQuery
vue中v-for循环选中点击的元素并对该元素添加样式操作
Jul 17 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
Aug 31 Javascript
Vue通过provide inject实现组件通信
Sep 03 Javascript
[原创]jQuery常用的4种加载方式分析
Jul 25 #Javascript
JS仿百度自动下拉框模糊匹配提示
Jul 25 #Javascript
JS本地刷新返回上一页代码
Jul 25 #Javascript
jQuery layui常用方法介绍
Jul 25 #Javascript
Bootstrap Validator 表单验证
Jul 25 #Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
Jul 25 #Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
Jul 25 #Javascript
You might like
PHP中Session的概念
2006/10/09 PHP
js下函数般调用正则的方法附代码
2008/06/22 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
根据当前时间在jsp页面上显示上午或下午
2014/08/18 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
python定时器使用示例分享
2014/02/16 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
毕业证委托书范文
2014/09/26 职场文书
给老婆的检讨书
2015/01/27 职场文书
情人节活动总结范文
2015/02/05 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
python实现的web监控系统
2021/04/27 Python
浅谈JS的原型和原型链
2021/06/04 Javascript
Python编解码问题及文本文件处理方法详解
2021/06/20 Python
【海涛教你打DOTA】虚空假面第一视角骨弓3房29杀
2022/04/01 DOTA
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android