本质:二元操作符 + 规则

  • 如果操作数是对象,则对象会转换为原始值
  • 如果其中一个操作数是字符串的话,另一个操作上也会转换为字符串,进行字符串连接
  • 否则,两个操作数都将转换成数字或 NaN,进行加法操作

对象转为原始数据类型的值

与下面三个方法有关,且存在优先级;首先调用第一个,第二个与第三个优先级依情况而定

  • Symbol.ToPrimitive
  • Object.prototype.valueOf
  • Object.prototype.toString

[] 的原始值

typeof [][Symbol.ToPrimitive] // undefined,继续往下走
[].valueOf() // [],不是原始值,继续往下走
[].toString() // ''

{} 的原始值

typeof {}[Symbol.ToPrimitive] // undefined,继续往下走
({}).valueOf() // {},不是原始值,继续往下走
({}).toString() // '[object Object]'

[] + []

解题过程

  1. [].toString() + [].toString()
  2. ‘’ + ‘’
  3. ‘’

[] + {}

解题过程

  1. [].toString() + ({}).toString()
  2. ‘’ + ‘[object Object]’
  3. ‘[object Object]’

{} + [],易错

想当然的解题过程:

  1. ({}).toString() + [].toString()
  2. ‘[object Object]’ + ‘’
  3. ‘[object Object]’

可以在浏览器试一下,其实结果是 0
因为浏览器把 {} + [] 解析成这样了 {}; + [],也就是一个语句后面跟了一个 +[]+[]相当于 + '' ,结果为 0

{} + {},易错

想当然的解题过程:

  1. 语句后面跟上 +{}
  2. + '[object Object]'
  3. NaN

那么答案是 NaN 吗?
对了,又没有完全对{} + {} 在 IE 或 FireFox 等浏览器上的执行结果确实为 NaN,但是在 Chrome 浏览器上执行结果为 '[object Object][object Object]'

Chrome 浏览器会对这段代码进行特殊处理,处理后为 ({} + {})
那么解题过程就为:

  1. (({}).toString() + ({}).toString())
  2. ‘[object Object][object Object]’

JavaScript 中 [] + [],[] + {},{} + [],{} + {} 的结果分别是什么相关推荐

  1. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  2. 在Javascript中使用面向对象的编程

    by Mike Koss March 26th, 2003 这是一篇,我个人认为最好的,Javascript面向对象编程的文章.翻译不好的地方,还望大家指正,谢谢. 如果您需要,可以访问下面的地址取得 ...

  3. javascript中实例方法与类方法的区别

    在javascript中,类有静态属性和实例属性之分,也有静态方法和实例方法之分 类属性(静态属性):通过类直接访问,不需要声明类的实例来访问 类方法(静态方法):通过类直接访问,不需要声明类的实例来 ...

  4. regexp 好汉字符串_如何在JavaScript中使用RegExp确认字符串的结尾

    regexp 好汉字符串 by Catherine Vassant (aka Codingk8) 由凯瑟琳·瓦森(Catherine Vassant)(又名Codingk8) 如何在JavaScrip ...

  5. 让我们讨论一下变量,以及为什么要在JavaScript中使用它们。

    by Zell Liew 由Zell Liew 让我们讨论一下变量,以及为什么要在JavaScript中使用它们. (Let's talk about variables - and why you ...

  6. JavaScript中的普通函数与构造函数比较

    问题 什么是构造函数? 构造函数与普通函数区别是什么? 用new关键字的时候到底做了什么? 构造函数有返回值怎么办? 构造函数能当普通函数调用吗? this this永远指向当前正在被执行的函数或方法 ...

  7. django中的for循环_深入了解 JavaScript 中的 for 循环

    在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...

  8. JavaScript中 for、for in、for of、forEach等使用总结

    在JavaScript中,我们经常需要去循环迭代方法操作数组对象等,常见等循环方法有 for.for in.for of.forEach等. 1.for循环 for循环是最基础常见的一种循环,圆括号中 ...

  9. JavaScript中的面向对象程序设计

    本文内容目录顺序: 1.Object概念讲述: 2.面向对象程序设计特点: 3.JavaScript中类和实例对象的创建: 4.原型概念: 5.原型API: 6.原型对象的具体使用:7.深入理解使用原 ...

  10. JavaScript中的call、apply、bind深入理解

    一.函数的三种角色 首先要先了解在函数本身会有一些自己的属性,比如: length:形参的个数: name:函数名: prototype:类的原型,在原型上定义的方法都是当前这个类的实例的公有方法: ...

最新文章

  1. 正则表达式中^的用法
  2. iphone应用程序结构
  3. 天津财经计算机专业研究生分数线,天津财经大学各专业2015—2020年硕士研究生复试分数线汇总...
  4. 第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能
  5. win7电脑内存信息的查看方法
  6. EXCEL表格转换成json数据工具
  7. iconv 解决乱码问题
  8. JS截取字符串substr 和 substring方法的区别
  9. php网站https怎么做301,php网站如何增加https安全访问
  10. RequireJS模块化后JS压缩合并
  11. Dynamics CRM 2015/2016 Web API:Unbound Custom Action 和 Bound Custom Action
  12. 应用安全-浏览器安全-攻防
  13. 使用JavaScript创建Table时,用cellSpacing而不是cellspacing
  14. 行政界线类型代码_行政区划代码的代码表
  15. u大师u盘自定义ISO/IMG文件装机教程
  16. 电路滤波器——(一)RLC无源滤波器
  17. BPM与OA的简单了解
  18. linux shell获取同一网段存活主机的IP和MAC地址
  19. 彻底关闭WinRAR广告弹窗
  20. 内网渗透系列:内网隧道之ICMP隧道

热门文章

  1. 千万不要嫁给程序员,我是认真的
  2. Linux系统怎么打开pdb格式,linux环境下python的pdb调试方法
  3. extra加ing_必修四unit3动词-ing作表语、定语、补语练习题
  4. [LTE 协议]概述 LTE协议
  5. Python基础学习(七)--函数进阶,全局局部,global,nonlocal,enclosing,命名空间,作用域,重要函数,lambda,闭包
  6. 微信小程序毕业设计 基于微信校园助手新生报到小程序系统开题报告
  7. 计算机模拟泰勒公式,泰勒公式有什么实际性的应用?
  8. 中国智慧城市的真伪命题:何时才能告别“千城一面”?
  9. 【程序员2公务员】关于体制调研的一些常见问题总结
  10. 为什么,人总是无法控制自己“不胡思乱想”?