想不到的:js中加号操作符
研究js加号操作符的时候,无意中试验了一个
console.log({}+"str");//NaN
发现结果居然是NaN,这让我百思不得其解。
我查阅资料,js高级编程里是这样总结的:
如果两个操作符都是数字,执行常规的加法计算;(试验这句没毛病)
如果有一个操作数是字符串,那么就要应用如下规则:
如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;(试验这句没毛病)
如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。
如果有一个操作数是对象、数值或布尔值,则调用他们的toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于undefined和null,则分别调用String()函数并取得字符串"undefined"和"null"。
正如我前面的试验,有一个操作数是字符串,一个操作数是对象,按照这一规律理解,计算步骤:空对象{}.toString(),得到字符串"[object Object]",然后再与字符串"str"进行拼接,最后结果是字符串"[object Object]str",试验所得为NaN,显然摘抄自高级编程里的结论不适用。
console.log({}+1);//1
console.log({};+"str");//NaN
对象与数字,如果按照结论来,应该是字符串"[object Object]1",而试验结果是数字1;有没有觉得奇怪。这该如何理解。
当然我想到的这些都是比较特殊的,对于一般的字符串与数字相加,不需要特殊处理。
看一个比较正常的对象分别字符串和数字相加。
console.log(({})+"str");
console.log(({})+2);
这两个用上面的规律,没毛病,结果如你所想。
总结出的规律,可以任意做实验:
+ 遇到字符串是字符串拼接(由于加引用类型值,首先会转换为字符串,所以也是字符串拼接),如果遇不到字符串就是数学运算
{}+"str" 不是按照加法运算的,它是先把{}当做一个块级作用域(ES6中的语法),也就是浏览器是执行两个操作,一个操作是{这里可以写任何代码}的块级作用域,一个是+"str"的操作,注意这里的 + 并不是数学加,也不是字符串连接,而是正号,"str"转换为Number,为NaN
想不到的:js中加号操作符的更多相关文章
- js中的操作符
写在前面 js语法 DOM对象(把body,div,p等节点树看成一个对象) BOM对象(把浏览器的地址栏历史记录DOM等装在一个对象) 浏览器是宿主,但js的宿主不限于浏览器,也可以是服务器,如no ...
- JS 中 new 操作符
按照javascript语言精粹中所说,如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上.这个话很抽象,我想 ...
- JS中==与===操作符的比较
摘要: ===操作符: 要是两个值类型不同,返回false 要是两个值都是number类型,并且数值相同,返回true 要是两个值都是stirng,并且两个值的String内容相同,返回true 要是 ...
- JS中new操作符源码实现
首先我们来看一下实例化一个对象做了浏览器做了什么事情 new的四步操作: 1. 创建一个空对象 2. 设置空对象的__proto__属性继承构造函数的prototype属性,也就是继承构造函数的原型对 ...
- javascript中加号(+)操作符的作用
// 16进制转换:+”0xFF”; // -> 255 // 获取当前的时间戳,相当于`new Date().getTime()`:+new Date(); // 比 ...
- Javascript高级编程学习笔记(4)—— JS中的数据类型(2)
接着昨天的文章,今天这篇文章主要讲述JS中剩余的两种数据类型String,和Object String类型 对于该类型,书中给出的解释为:由0或多个16为Unicode字符组成的字符序列. 对于JS中 ...
- JS中同步显示并分割输入的数字字符串
题目比较晦涩,来张图来说明要表达的效果: 第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来.好像在建行的网上银行上面就有这种效果.第二个图 ...
- JS中的一元操作符
表达式 一元操作符 优先级 结合性 运算顺序 表达式是什么? 就是JS 中的一个短语,解释器遇到这个短语以后会把对它进行计算,得到一个结果参与运算,我们把这种要参与到运算中的各种各样的短语称为表达式. ...
- 【js实例】js中的5种基本数据类型和9种操作符
js中的5中基本数据类型 js标识符 第一个字符必须为字母,下划线,或美元符 其他字符可以是字母,下划线,美元符,数字 js标识符区分大小写 标识符不能使关键字和保留字 关键字: break do i ...
随机推荐
- hdu5860 Death Sequence
这题一开始写的线段数是从中间开始查找 k个 导致是nlogn 每次查找应该都是从头找每次找的个数不同就好了 还有一种递推的写法我放下面了 #include<bits/stdc++.h> u ...
- 求助:关于sql如何统计时间的问题
三.现在我们假设应用计时分为app应用和web应用,需要考虑如下几个方面: (1)多时间段(2)表中有冗杂数据 (3)用户是在web端和app端都登陆,这种类型的重复时间段只能取其一 存在数据: 存在 ...
- C#图解教程 第二十二章 异常
异常 什么是异常try语句 处理异常 异常类catch 子句使用特定catch子句的示例catch子句段finally块为异常寻找处理程序更进一步搜索 一般法则搜索调用栈的示例 抛出异常不带异常对象的 ...
- 用Mirror,搞定用户画像
Mirror产品概述 Mirror是专为金融行业设计的全面用户画像管理系统.该系统基于星环多年来为多个金融企业客户构建用户画像的经验,深入契合业务需求,实现对用户全方位全维度的刻画.Mirror内置银 ...
- canvas焰火特效
之前在抖音上看到了一个很漂亮的焰火效果.这会儿有时间就用canvas实现了一下. 演示地址:http://suohb.com/work/firework4.htm 先看效果:(静态图片看不太出效果,请 ...
- 使用storm分别进行计数和词频统计
计数 直接上代码 public class LocalStormSumTopology { public static void main(String[] agrs) { //Topology是通过 ...
- NOIP2011题解
NOIP2011其实早就做完了....一直懒得写.... Day1 T1铺地毯 我什么都不想说,不会做您就没必要接着看了.... #include<iostream> using name ...
- Spring【AOP模块】就是这么简单
前言 到目前为止,已经简单学习了Spring的Core模块.....于是我们就开启了Spring的AOP模块了...在讲解AOP模块之前,首先我们来讲解一下cglib代理.以及怎么手动实现AOP编程 ...
- 关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 为什么需要RPC,而不是简单的HTTP接口
转载自:http://www.oschina.net/question/271044_2155059?sort=default&p=1#answers 目前有很多Java的RPC框架,有基于J ...