JavaScript中“+”的陷阱深刻理解


Posted in Javascript onDecember 04, 2012

一、两个中括号相加
[] + []
中括号没有语句块的作用,因此这里的两个中括号就是一个数组。两个数组(对象类型)相加先要将其转换成值类型(基本类型)。
1,转成值类型调用valueOf,[]的valueOf()还是自己

var arr = []; 
arr.valueOf() === arr; // true

2,转成字符串,[]的toString是空字符串
[].toString(); // "" 
String([]) // ""

结果出来了。两个空字符串相加,结果仍然是空字符串。即这里的“+”指字符串连接而非数字相加。

二、大括号和中括号的相加

{} + []

注意这里的大括号仍然不是对象直接量,而是空语句块。因此可以去掉它,即相当于
+ []

注意,这时由之前看似的两个运算数变成了实际的单运算数。而“+”运算符当只有一个运算数时只代表一个意思:算术加运算。即这里没有字符串连接的意思了。
中括号的toString()是空字符串,又相当于
+ ""

“+”代表算术加运算,字符串非数字,因此将其转换成数字类型。空字符串转成数字类型在上一篇提到过,为0。
那么最后的结果就是0。

三、中括号和大括号相加

[] + {}

与上面的对比,只是中括号和小括号交换了顺序。结果却不相同。大括号放到右边后,与上面讨论的大括号的意义不同了。这里的大括号就是一个对象直接量而非语句块。
“+” 两边的运算数转成值类型分别是:"" 和 "[object Object]"。这时 "+" 表示字符串连接。即
"" + "[object Object]"

结果是 “[object Object]”。

四、小括号也和它们相加试试
突发奇想!好吧,小括号虽然有多义性,但它不能作为运算数。

Javascript 相关文章推荐
一个可以显示阴历的JS代码
Mar 05 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
Apr 02 Javascript
JQuery 图片滚动轮播示例代码
Mar 24 Javascript
jquery使用经验小结
May 20 Javascript
JS实现的左侧竖向滑动菜单效果代码
Oct 19 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
Feb 16 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
Feb 26 Javascript
vue基础之模板和过滤器用法实例分析
Mar 12 Javascript
AngularJs中$cookies简单用法分析
May 30 Javascript
layui实现左侧菜单点击右侧内容区显示
Jul 26 Javascript
Vue中qs插件的使用详解
Feb 07 Javascript
vue setInterval 定时器失效的解决方式
Jul 30 Javascript
将光标定位于输入框最右侧实现代码
Dec 04 #Javascript
JavaScript中__proto__与prototype的关系深入理解
Dec 04 #Javascript
js 限制数字 js限制输入实现代码
Dec 04 #Javascript
JSON语法五大要素图文介绍
Dec 04 #Javascript
js关闭子窗体刷新父窗体实现方法
Dec 04 #Javascript
cument.execCommand()用法深入理解
Dec 04 #Javascript
页面只能打开一次Cooike如何实现
Dec 04 #Javascript
You might like
php 变量定义方法
2009/06/14 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
YII中assets的使用示例
2014/07/31 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
Cookie 小记
2010/04/01 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
JavaScript判断IE版本型号
2015/07/27 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
使用Python绘制图表大全总结
2017/02/11 Python
Python自动发邮件脚本
2017/03/31 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
美国在线宠物商店:Chewy
2019/01/12 全球购物
个人求职信范文分享
2013/12/13 职场文书
合作投资意向书
2014/04/01 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
庆七一宣传标语
2014/10/08 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
大班上学期个人总结
2015/02/13 职场文书
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js