最近遇到一个让人困解的一个问题;一个简单的js加法运算表达式:

1 +[]; //这里加上一个空数组得到什么???答案:'1';

为什么答案是1,一开始我也很困惑;后来我读了一篇文章才知道:在javascript中加法的规则很简单,只能数字与数字相加或字符串和字符串相加;所有其他类型的值都会自动转换成这两个类型的值。这里面其实有一个隐式转换的存在。这里就不得不说javascript的两种类型的值了;即原始值和对象值(或者说引用类型的值),原始值有undefined,null,boolean,number,String;而其他的值都是对象值包括数组(Array)和函数(function);判断一个值是否是原始类型的值的话可以使用typeof,判断是否是对象值的话可以使用instanceOf;这里要注意的是typeof null;//'object'得到的是object;这里w3School上的解释是javascript最初实现的一个错误,然后被ECMAScript沿用了。现在null被认为是对象的占位符,从而解释了这一矛盾。但从技术上来说null仍是原始值。

类型转换

javascript中加法会触发3种类型转换;即将值转换为原始值,转换为字符串,转换为数字。这刚好对应了javascript引擎内部的转换操作:ToPrimitive(),toString(),toNumber;

所以这里:1 + [] = '1';即[].toString() = ''; 然后1 + '' = '1';即把1转换成字符串,'1' + '' = '1' 最后就是两个字符串连接成的字符串;(详细可见w3School中的javascript加法运算http://www.w3school.com.cn/js/pro_js_operators_additive.asp)

明白了这个接下来的加法运算也就一目了然了:

+[] = 0; //其实就是Number([]),当Number作为一个函数调用(而不是作为构造函数调用时)会在引擎内部执行toNumber操作
+{} = NaN; // Number('[object,object]'); -->NaN 即String({})='[object,object]'; +'[object, object]' = NaN
1 + [1] = '11'; // String({}) = '1' --> '1' + '1' = '11'
1 + [1, 2] = '11,2'; // String([1,2]) = '1,2' ---> '1' + '1,2' = '11,2';
1+ {} = '1[object,object]'; String({}) = '[object, object]' ---> '1' + '[object, object]' = '1[object,object]';[]+[] = ''; // 其实就是String([]) = '';---> '' + '' = '';[]+{} = '[object,object]'; //同上String([]) = '', String({}) = '[object,object]' ---> '' + '[object, object]' = '[object, object]';{} + {} = NaN;//这里值得注意的是javascript会把第一个{}解释成一个空块并忽略了它所以这里等价于+{} 

参考:http://www.2ality.com/2011/03/javascript-values-not-everything-is.html

转载于:https://www.cnblogs.com/leungUwah/p/5452731.html

精彩的javascript对象和数组混合相加相关推荐

  1. JavaScript 对象与数组参考大全

    http://www.cnblogs.com/meil/archive/2006/06/28/437527.html本文列举了各种JavaScript对象与数组,同时包括对上述每一对象或数组所完成工作 ...

  2. JavaScript对象和数组

    在JavaScript中对象是一种数据结构,用于将数据和功能组织在一起,描述一类对象所具有的属性和方法. 对象是某个特定类型的实例.新对象是new操作符后跟一个关键字来实现的.构造函数本身就是一个函数 ...

  3. 3种JavaScript 对象转数组的方法

    来源 | https://www.fly63.com 我们在项目开发的时候,有时需要将js对象转换为数组,下面小编给大家具体演示一下怎么转换,主要是介绍一些常用.简洁的转换方法. 比如JavaScri ...

  4. javascript对象转数组

    转自javascript如何将object转为数组-js教程-PHP中文网 1.Array.from() 方法,用于数组的浅拷贝.就是将一个类数组对象或者可遍历对象转换成一个真正的数组. eg: 1 ...

  5. Javascript对象及数组用法笔记

    // 数组定义var arr = []; // 或 var arr = new Array(); // 添加数组元素arr.push(1); // 添加数字arr.push('okbase.net') ...

  6. JavaScript学习(七)——对象与数组、内部对象(1)

    目录 javascript对象与数组 javascript内部对象 object对象 1.创建object对象 2.object对象的属性 3.object对象的方法 String对象 1.创建Str ...

  7. 检查键是否存在于JavaScript对象中?

    如何检查JavaScript对象或数组中是否存在特定键? 如果密钥不存在,而我尝试访问它,它将返回false吗? 还是抛出错误? #1楼 它将返回undefined . var aa = {hello ...

  8. “空对象 {}” 与 “空数组 []” 的相加问题(详解)

    本文旨在让读者能更加清晰地了解 "空对象 {}" 与 "空数组 ()" 相加(eg:"[] + []" ."[] + {}&quo ...

  9. 通过属性值从对象数组中获取JavaScript对象[重复]

    本文翻译自:Get JavaScript object from array of objects by value of property [duplicate] This question alr ...

  10. 通过ID在JavaScript对象数组中查找对象

    本文翻译自:Find object by id in an array of JavaScript objects I've got an array: 我有一个数组: myArray = [{'id ...

最新文章

  1. VS2015 MFC属性页孙鑫笔记
  2. 从动力学角度看优化算法SGD:一些小启示
  3. 微信开发接口调用(前端+.net服务端)
  4. ffmpeg builds by zeranoe_FFmpeg
  5. spartan6不能直接把时钟连到IO上
  6. 成绩记录薄系统C语言,成绩记录簿C语言版.doc
  7. plsql表锁被占用_处理Oracle被锁住的进程
  8. 【深入理解JVM】运行时数据区域:java虚拟机栈
  9. tomcat多实例部署相关
  10. 在SQUIRREL中使用PHOENIX操作HBASE——创建表和视图
  11. 在delphi中调用chm帮助文件_delphi教程
  12. 虚拟机Oracle VM VirtualBox 共享文件夹放的文件打不开,找不到指定路径问题
  13. 杭电2079-选课时间(题目已修改,注意读题)
  14. 主机可以ping通虚拟机,虚拟机ping不通主机
  15. 实验项目三:基于A*搜索算法迷宫游戏开发
  16. springboot-cache + reds整合
  17. 找女朋友 SDUT(2109)
  18. 搜一下导航完整程序源码+亲测可用
  19. 大型 公益 节目 《和谐拯救危机》下载.在线视频.
  20. Faster_R_CNN源码详细解析

热门文章

  1. matlab中关于统计的函数
  2. 【OpenCV入门指南】第二篇 缩放图像
  3. Aiseesoft HEIC Converter如何在Mac上将HEIC转换为JPG/JPEG或PNG?
  4. TeamViewer 远程设备的画面黑屏怎么办?
  5. Java Mongodbjar包下载网址
  6. Pyhont 高阶函数
  7. SpreadJS 全面支持 Angular2,V10.2 版本即将发布
  8. C# 使用Log4Net记录程序日志
  9. poj 3660 Cow Contest floyd 传递闭包!!基础
  10. Illustrator中文版教程,如何在 Illustrator中设置图标项目?