热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

理解JS中的加号运算符

基本运算规则+的使用有两种情况当+连接两个变量或值时即为二元运算符,比如a+b,当+在变量或值前面时,则为一元运算符,比如+12.1一元运算符直接转换为Number类型,相当于Nu

《理解JS中的加号运算符》

基本运算规则

+的使用有两种情况
+连接两个变量或值时即为二元运算符,比如a + b,当+在变量或值前面时,则为一元运算符,比如+'12.1'

一元运算符

直接转换为Number类型,相当于Number()
常用的还有!运算符,用来转为Boolean类型

二元运算符

加法,可以认为只有两种情况
1、数字 + 数字
2、字符串 + 字符串
其他类型的值相加最终都会隐式转换为上述两种类型相加。

JS中的基本数据类型(primitives)有6种,

String、Number、Boolean、undefined、null、Symbol

引用数据类型则是指除了上述基本数据类型以外的所有值,比如Array、Function

隐式类型转换

加法的隐式转换:

1、转换为原始值

当需要转换为原始值时,JS引擎内部会进行抽象操作ToPrimitive()

ToPrimitive(input,PreferredType?)
// 如果为原始值则直接返回
// 如果为引用数据类型则
// 1、先尝试调用valueOf()方法,如果返回值为原始值,则返回该值
// 2、否则,尝试调用toString()方法,如果返回值为原始值,则返回该值
// 3、否则,抛出异常
// 注:
// 1、如果第二个参数PreferedType为String,则2和3顺序调换,即先调用toString。
// 2、PreferedType默认为Number,但在遇到Date类型的值时为String

具体转换规则可以参考ECMA规范中9.1的ToPrimitive[[DefaultValue]]部分

2、转换为数字

规则为:

类型结果
undefinedNaN
null0
Booleantrue为1,false为0
Number/
String转数字,”” -> 0
Object先ToPrimitive转为原始值再转为数字

3、转换为字符串

直接转换,不做赘述,对象类型时参考数字的处理

相关面试题

[] + {} // 结果为 '[object Object]'
[] + [] // 结果为 ''
{} + {} // 结果为 NaN
{} + [] // 结果为 0,当语句开始为{时,会被JS解释器认为是代码块,所以实质上是 +[]
{} + {} // 结果为NaN,原因同上

注:第五道面试题在node.js环境下的运行结果却是'[object Object]',node和chrome同样使用了V8引擎,想来是对此做了特殊处理

参考

深入理解Javascript中Object类型的转换


推荐阅读
  • v8对象机制1.概述v8中每一个API对象都对应一个内部实现对象(堆对象)2.对象创建过程(1)v8::internal::Factory类: ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • 前言:原本纠结于Web 模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中eval函数。虽然eval函 ... [详细]
author-avatar
手机用户2602937913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有