Javascript中3个需要注意的运算符


Posted in Javascript onApril 02, 2015

平时写惯了C#,所以会觉得什么样的运算符就应该做什么样的运算,但是有一天你的习惯被其他语言颠覆了,不知道是不是有一股强大的好奇

心,刚好在js中,我的这种习惯就被颠覆了,下面就看看哪些运算符颠覆了我的三观。

一:==运算符

==运算符之所以可以颠覆,可以从下面几个例子中看出来。

<1> "10"==10 ?

如果这要是放在C#里面,编译器会毫不客气的告诉你,王八羔子,类型都不同,你比个毛线啊。。。但是在JS里面又会是怎样呢?

Javascript中3个需要注意的运算符

从上图中,你可以看到,不管你好奇不好奇,答案就在那里,可能有人就要问,到底是10转化成了“10”,还是“10”被转化成了10,所以这个也

是我一直吐槽的地方,如果是C#,你还可以看看IL里面到底怎么处理的,而JS里面你什么都看不到,只能听教科书上的一面之词,无法眼见为实。

所以除了记住就是记住了,我只能说是字符串”10“转换成了10,然后进行整形比较的。

<2>true==1 ?

这个问题稍微想想还能理解,其实在C#的IL中,也是将true和false相应的转化为1和0,所以js在判断时会将true转化为1,再进行整形比较,这

个现象我觉得不怎么稀奇,记住就好。

Javascript中3个需要注意的运算符 

<3> {valueOf:function(){return "10"}}==10?

这个问题也是蛮奇葩的,对象居然还可以和int类型相比较?但是在JS中却真的可以做到,原理是这样的,如果一个对象和int/string比较的话,

js内部会优先调用valueOf方法,也就是将对象数值化,其实这里好玩的地方就是我们自定义的valueOf重写了父类的valueOf方法,所以上面

的例子就是判断“10”==10?。

Javascript中3个需要注意的运算符

这里还要PS一下,如果你的类中没有定义valueOf方法的话,js内部引擎还会再去找toString()方法,如果有则执行。

Javascript中3个需要注意的运算符

不知道当你接触到这些新用法的时候,是不是觉得有点慌乱,好像有种乱七八糟的感觉?如果你很怕程序有潜在的bug,那么为了保险起见,

转化为同一数据类型来比较吧,当然在js里面还有一个===运算符可以说跟C#里面的逻辑运算符算是最接近的,这个多出来的“=”就是在

“==”的基础上再判断类型是否相等?就比如:

Javascript中3个需要注意的运算符

二:&&和||运算符

 这两个运算符也是蛮奇葩的,在我们的思维习惯里面,这两个运算符两边就应该都是bool类型,但是在JS里面这些定义会被彻底颠覆,正是这些新规则,所以我们可以完成很多新花样,比如在jquery的源码中,可以到处都能找到这样的痕迹。

Javascript中3个需要注意的运算符

从图中我们看到了这么一句,bup=b && b.parentNode,你能理解这句话的意思吗?其实它的意思是先判断b是否存在,如果b不存在,那

可能b就是undefined,null,0 或者NaN,如果b存在,那么就返回m.parentNode,就这么好玩,如果你用C#的话,就少不了几个if条件了,

也算是简化代码吧,然后再看看||操作,这个简直在源码里面可以用泛滥来形容了,不过乍一看,特别像是C#中的可空运算符,所以亲切感倍

增,下面就拿ret=results||[]来说,如果results有值,那么ret=results,如果results为null,undefined,NaN或者0,那么result=[],就

这样的任性,省去了程序员很多if判断,最后要补充一句,其实就像C#的IL中一样,只是JS底层给我们做了if判断。

Javascript中3个需要注意的运算符

Javascript 相关文章推荐
自己动手制作jquery插件之自动添加删除行的实现
Oct 13 Javascript
Javascript中Event属性搜集整理
Sep 17 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
Oct 17 Javascript
jQuery中bind与live的用法及区别小结
Jan 27 Javascript
JavaScript学习笔记之ES6数组方法
Mar 25 Javascript
JavaScript编程中实现对象封装特性的实例讲解
Jun 24 Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
Aug 02 Javascript
React创建组件的三种方式及其区别
Jan 12 Javascript
JavaScript获取中英文混合字符串长度的方法示例
Feb 04 Javascript
Vue实现自定义下拉菜单功能
Jul 16 Javascript
vue项目持久化存储数据的实现代码
Oct 01 Javascript
10个最受欢迎的 JavaScript框架(推荐)
Apr 24 Javascript
原生JS实现响应式瀑布流布局
Apr 02 #Javascript
Javascript变量的作用域和作用域链详解
Apr 02 #Javascript
JavaScript中连接操作Oracle数据库实例
Apr 02 #Javascript
JavaScript中操作Mysql数据库实例
Apr 02 #Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 #Javascript
JavaScript实现重置表单(reset)的方法
Apr 02 #Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
Apr 02 #Javascript
You might like
如何分别全角和半角以避免乱码
2006/10/09 PHP
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
网页中CDATA标记的说明
2010/09/12 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
微信小程序中顶部导航栏的实现代码
2017/03/30 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
Python字符串和文件操作常用函数分析
2015/04/08 Python
python生成式的send()方法(详解)
2017/05/08 Python
python中Switch/Case实现的示例代码
2017/11/09 Python
Django如何自定义分页
2018/09/25 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
师范生实习的个人自我鉴定
2013/10/20 职场文书
给老婆的保证书
2015/01/16 职场文书
工程部经理岗位职责
2015/02/02 职场文书
高一语文教学反思
2016/02/16 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
详解php中流行的rpc框架
2021/05/29 PHP