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

 +[]; //这里加上一个空数组得到什么???
答案:'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

精彩的javascript对象和数组混合相加的更多相关文章

  1. 第一百零三节,JavaScript对象和数组

    JavaScript对象和数组 学习要点: 1.Object类型 2.Array类型 3.对象中的方法 什么是对象,其实就是一种类型,即引用类型.而对象的值就是引用类型的实例.在ECMAScript中 ...

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

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

  3. JavaScript对象和数组

    1.JavaScript中有两个非常重要的数据类型是对象和数组. 通过"."或者"[]"来访问对象属性 举例:var book = { topic:" ...

  4. 简述JavaScript对象、数组对象与类数组对象

    问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...

  5. javascript 对象和数组(花括号、方括号)

    1. javascript对象定义 var a = {var a = "test", var b = "test"} 2. javascript数组定义 var ...

  6. JavaScript对象与数组

    一.Object 类型到目前为止,我们使用的引用类型最多的可能就是 Object 类型了.虽然 Object 的实例不具备多少功能,但对于在应用程序中的存储和传输数据而言,它确实是非常理想的选择.创建 ...

  7. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  8. 2.重学javascript 对象和数组

    什么是对象,其实就是一种类型,即引用类型. 一.创建Object类型有两种. ①使用new运算符 <script type="text/javascript"> var ...

  9. javascript对象和数组之 深拷贝和浅拷贝

    管是在面试中还是我们的项目中经常会用到数组或者对象的深拷贝,下面我就自己总结的分享给大家. 首先要知道什么是深拷贝?什么是浅拷贝? 深拷贝:源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外 ...

随机推荐

  1. java.lang.String

    1.String 是一个类,广泛应用于 Java 程序中,相当于一系列的字符串.在 Java 语言中 strings are objects.创建一个 strings 最直接的方式是 String g ...

  2. 如何在maven工程中加载oracle驱动

    maven中引入oracle驱动报错Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0 时间:2015年09月22日  浏览:9361次 在maven ...

  3. Eclipse序列号生成代码

    import java.io.*; public class MyEclipseGen { private static final String LL = "Decompiling thi ...

  4. ubuntu安装Python环境以及科学计算环境

    参考:http://blog.csdn.net/a1311543690/article/details/ 1.sudo apt-get install python-pip pip是Python的一个 ...

  5. 【转】CSRF攻击的应对之道

    CSRF 背景与介绍CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患,比如 ...

  6. sax解析原理与案例

    package itcast.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationExceptio ...

  7. C#winform调用外部程序,等待外部程序执行完毕才执行下面代码

    1.简单调用外部程序文件(exe文件,批处理等),只需下面一行代码即可 System.Diagnostics.Process.Start(“应用程序文件全路径”); 2.如果要等待调用外部程序执行完毕 ...

  8. iTunes.exe 在win7系统中运行出错解决办法

    重新安装了iTunes打开后就报错,然后直接退出 查windows日志提示错误应用程序名称: iTunes.exe 错误模块名称: KERNELBASE.dll 重新安装iTunes问题依旧,后来在G ...

  9. java 虚拟机--新生代与老年代GC

    Heap: JVM只有一个为所有线程所共享的堆,所有的类实例和数组都是在堆中创建的. Method area: JVM只有一个为所有的线程所共享的方法区.它存储类结构,例如运行时常量池,成员和方法数据 ...

  10. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...