精彩的javascript对象和数组混合相加
最近遇到一个让人困解的一个问题;一个简单的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对象和数组混合相加的更多相关文章
- 第一百零三节,JavaScript对象和数组
JavaScript对象和数组 学习要点: 1.Object类型 2.Array类型 3.对象中的方法 什么是对象,其实就是一种类型,即引用类型.而对象的值就是引用类型的实例.在ECMAScript中 ...
- JavaScript 对象与数组参考大全
http://www.cnblogs.com/meil/archive/2006/06/28/437527.html本文列举了各种JavaScript对象与数组,同时包括对上述每一对象或数组所完成工作 ...
- JavaScript对象和数组
1.JavaScript中有两个非常重要的数据类型是对象和数组. 通过"."或者"[]"来访问对象属性 举例:var book = { topic:" ...
- 简述JavaScript对象、数组对象与类数组对象
问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...
- javascript 对象和数组(花括号、方括号)
1. javascript对象定义 var a = {var a = "test", var b = "test"} 2. javascript数组定义 var ...
- JavaScript对象与数组
一.Object 类型到目前为止,我们使用的引用类型最多的可能就是 Object 类型了.虽然 Object 的实例不具备多少功能,但对于在应用程序中的存储和传输数据而言,它确实是非常理想的选择.创建 ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- 2.重学javascript 对象和数组
什么是对象,其实就是一种类型,即引用类型. 一.创建Object类型有两种. ①使用new运算符 <script type="text/javascript"> var ...
- javascript对象和数组之 深拷贝和浅拷贝
管是在面试中还是我们的项目中经常会用到数组或者对象的深拷贝,下面我就自己总结的分享给大家. 首先要知道什么是深拷贝?什么是浅拷贝? 深拷贝:源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外 ...
随机推荐
- 汇编基础知识之二debug的使用
DEBUG的使用 (要在win32位习题下进行,win7 64位需要安装DosBox和debug这2个软件): 1:win64位下debug的使用教程: 下载debug.exe,这里我把debug放在 ...
- java客户端调用c#的webservice服务
此处使用到了CXF框架,可以使用以下坐标从maven仓库中获取相关jar包: <dependency> <groupId>org.apache.cxf</groupId& ...
- VM配置一个待安装LUNIX系统的环境
IT技术和行业交流群 417691667
- jquery无法修改网页标题,无法修改网页标题
今天遇到一个问题,搜索时动态修改网页标题,用jquery的这段代码无效,无论FF还是IE $("title").html("new title"); 后来只好用 ...
- Cocos2d-x环境搭建
资源列表 官网上下载最新的cocos2d-x-3.3. 安装JDK,Eclipse,CDT插件,ADT插件. 下载Android SDK,更新.因为国内经常访问不了google,用vpn速度也有点慢. ...
- scala基础语法(变量,数据类型,函数)
一:常量与变量 1.常量 2.两种变量定义方式(严格与不严格) 3.Float注意点 3.注意点 变量名后加上: 类型首字母是大写 4.占位符_ 但是需要制定类型 5.scala数据类型 6.其他类型 ...
- java中获取日期和时间的方法总结
1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下: 要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...
- jquery中.attr('value')和.val()的区别
.val() 能够取到 针对text,hidden可输入的文本框的value值. 而 .attr('value') 可以取到html元素中所设置的属性 value的值,不能获取动态的如input ty ...
- Nodejs开发(1.Sublime Text 3配置)
本例使用Sublime Text 3开发 原因: 1. 有开发提示: 2. 非常easy的调试运行: 下载Sublime Text 3,官网地址:http://www.sublimetext.com/ ...
- QTreeWidget
#include "dialog.h" #include "ui_dialog.h" #include<QtCore> #include<Qt ...