参加公司技术嘉年华第一季(前端、服务端)的间隙,陈导问了我一个问题:{}+[] 和 []+{}两个表达式的值分别是什么?根据我的理解我觉得结果应该都是"[object Object]",但是结果却并不是这样子的({}+[] = 0  []+{} = '[object Object]'),我就想这不科学呀,一下子颠覆了我所学过的js知识了。于是我决定搞明白这究竟是是什么与原因导致的?

    通过查找资料,发现之所以结果不一样,是因为js解释器把{}当做了代码块语法解析,那么{}+[]就变成+[],这样的话很容易就解释了上面两个表达式的结果了~
    为什么{}在右边就没有被解释成代码块语法呢?这就要讲到+运算符的用法,+可以做数字的加法和字符串的链接,只要有一个是字符串,另外一个就会数据类型转换成字符串,然后进行拼接操作;都为对象的时候,这种情况下会通过valueOf获取对象的值,如果原始值还是对象的话,会通过toString()方法,转化成字符串。
    下面解释一下{}+[]和[]+{}的执行过程:
    {}+[],由+运算符的语法可以知道,会从左向右解析,遇到{}被认为是代码块(语法)被忽略,继续就变成了+[],此时+就不是加法运算符,也不是字符串连接符了,变成了转换数字的运算符了,数组通过valueOf方法获取值还是数组,执行toString方法后变成''空字符串,然后空字符串数据类型转化成数字,就变成了0,也解释了变种{}-[]=-0
    []+{},从左向右解析,[]被转化成''空字符串,{}通过valueOf方法获取原始值还是对象(注意不能通过{}.valurOf()获取,此时{}会被解析成代码块),通过toString方法结果是'[object Object]',接下来解释简单的字符串连接问题了,所以结果是'[object Object]'。注:对象的toString和valueOf都不一样,并且可以自定义。
    扩展:由上面的例子,进而讨论一下JS中数据类型转换的问题
    JS的取值特别灵活,会根据上下文语境,对数据进行隐式的转换(当然也可以通过显示的方法,对数据进行类型转换)。一般情况下,这种数据类型转换多用在运算符运算的时候.js的数据分成两大类,原始值和对象,原始值有:null undefined string number boolean,其他都是对象。js引擎提供三种数据类型转换操作:ToPrimitive(),ToNumber(),ToString()。
    toPrimitive()是将值转化成原始值,有两个参数,第一个需要转换的数据,第二个参数是prefferedType(number或者string),处理的顺序是:首先如果是原始值直接返回原始值,其次执行valueOf方法,如果返回原始值直接返回,如果不是,执行toString方法,转化成字符串。Date对象第二个参数是string(如果第二个参数是string的话,函数的处理顺序应该把toString方法提到第二步),其他对象都是number。
第一个参数 是否是原始值
valueOf
toString
备注
new Obeject()
否
Object
'[object Object]'
 
new Number(1)
否 1 '1' 隐式转换不是对象,可用Object.prototype.isPrototypeOf检测
new Blooean(1)
否 true 'true' 隐式转换不是对象,可用Object.prototype.isPrototypeOf检测
new Date()
否
1395985229639
‘Fri Mar 28 2014 13:40:29 GMT+0800 (中国标准时间)  ’
 
new Function('console.log(1);')
否
function anonymous() { console.log(1); }
'function anonymous() { console.log(1); }'
 
...
...
...
...
 
    toNumber将值转化成数字。原始值转换程数字如下表(对象参照toPrimitive ):
原始值 结果
null
+0
undefined
NAN
123
123
'123'
123
true/false
1/+0

toString将值转化成字符串,原始值转化成字符串如下表(对象参照toPrimitive ):

原始值 结果
null
'null'
undefined
'undefined'
123
'123'
'123a' '123a'
true/false
'true'/'false'

上面是对javascript数据类型转换的一点理解,在这里记录一下。

 
参考资料:
《javascript权威指南(第六版)》

{}+[] = ? 和 []+{} = ? 浅谈JS数据类型转换的更多相关文章

  1. 浅谈JS数据遍历的几种方式

    遍历对象(数组)是我们日常撸码的必不可少的部分,如何从性能上优化代码,提高运行效率?下文为你揭开真像: 第一种:普通的for循环 for(j = 0; j < arr.length; j++) ...

  2. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  3. 浅谈JS之AJAX

    0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...

  4. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  5. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

  6. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

  7. 浅谈js拖拽

    本文来自网易云社区 作者:刘凌阳 前言 本文依据半年前本人的分享<浅谈js拖拽>撰写,算是一篇迟到的文章. 基本思路 虽然现在关于拖拽的组件库到处都是,HTML5也把拖放纳入了标准.但考虑 ...

  8. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

  9. JS 数据类型转换

    JS 数据类型转换 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把 ...

随机推荐

  1. windows下批量杀死进程

    有时候因为病毒或其它原因,启动了一系列的进程,而且有时杀了这个,又多了那个.使用命令taskkill可将这些进程一下子所有杀光: C:\Users\NR>taskkill /F /im fron ...

  2. 改进的newlisp编译脚本,只需要配置

    前面有一篇Say bye to CMake and Makefile我开始用自己编写的newlisp脚本替代CMake,今天对前面的进行改进. 改进部分是: 1. newlisp armory模块的引 ...

  3. Android仿IOS回弹效果 ScrollView回弹 总结

    Android仿IOS回弹效果  ScrollView回弹 总结 应项目中的需求  须要仿IOS 下拉回弹的效果 , 我在网上搜了非常多 大多数都是拿scrollview 改吧改吧 试了一些  发现总 ...

  4. C-冒泡排序,选择排序,数组

    ——构造类型 ->数组      ->一维数组      ->相同类型的一组数据      ->类型修饰符--数组名—[数组的元素个数(必须是整型表达式或者是整型常量,不能是变 ...

  5. C#递归算法详解

    递归呢就是自己调用自己,在搜索文件夹下的文件和目录时也能用到,我这里就写一个简单的递归,代码如下: /// <summary> /// 递归算法 /// </summary> ...

  6. Code First 数据注释--DatabaseGenerated

    EF中可以使用DatabaseGenerated设置数据库字段的属性,它有三个枚举值:Computed.None.Identity Computed 表示这一列是计算所得 None 不做处理 Iden ...

  7. ASP.NET批量下载服务器端指定目录文件

    //遍历服务器指定文件夹下的所有文件 string path = "uploads/Image/"; string serverPath = Server.MapPath(path ...

  8. 《第一行代码》学习笔记28-内容提供器Content Provider(1)

    1.内容提供器:用于在不同的应用程序之间实现数据共享的功能,提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问 数据的安全性.使用内容提供器是Android实现跨程序共享数据 ...

  9. Windows命令行(DOS命令)教程-5 (转载)http://arch.pconline.com.cn//pcedu/rookie/basic/10111/15325_4.html

    5. copy copy在英文中是复制的意思 [功能] 复制一个或一组文件到指定的磁盘或目录中 [格式] copy [C:][path][filename.ext] [C:][path]filenam ...

  10. rsync数据同步配置

    环境配置 操作系统:centos6.4_64bit A服务器IP:192.168.6.128 B服务器IP:192.168.6.129 以A服务器为基准,将A服务器文件同步到B服务器. 步骤如下: 开 ...