想不到的: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 ...
随机推荐
- java 的几种引用
从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 本章前文介绍的引用实际上都是强引用, ...
- JS实现回到Top(顶部)--JavaScript
当我们浏览一段很长的网页时,已经看到底部了,想回到顶部看前面的内容,可是需要滚动好几转鼠标滑轮或者拉动滚动条走好长“一段路”.这对于用户来说,体验效果是不够好的.如果我们借助简单的一个按钮,点击一下就 ...
- windows保留关键字全
alert 警告 all全部 anchor锚 anchors下锚:集合 area地区 assign 分配指派 blur失去焦点 button按钮 checkbox多选按钮 clearInterval用 ...
- 【BZOJ4010】【HNOI2015】菜肴制作(拓扑排序)
[BZOJ4010][HNOI2015]菜肴制作(拓扑排序) 题面 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为 ...
- 清橙A1202&Bzoj2201:彩色圆环
因为Bzoj是权限题,所以可以去清橙做一下 Sol 突然考了一道这样的题,考场上强行\(yy\)出来了 win下评测Long double爆零TAT 首先肯定是破环为链变成序列问题辣 那么就要求第一个 ...
- C# Redis实战(六)
六.查询数据 在C# Redis实战(五)中介绍了如何删除Redis中数据,本篇将继续介绍Redis中查询的写法. 1.使用Linq匹配关键字查询 using (var redisClient = R ...
- Sharepoint Management Shell命令
1.普通WSP包,没有特殊激活内容 安装BBA.WebParts.wsp 1) Add-SPSolution -LiteralPath "c:\BBA.WebParts.wsp" ...
- C++中 Rand随机序列函数
标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数: 函数一:int rand(void): 从srand (seed ...
- cesium Animation显示系统时间
var d = new Date(); var hour = 0 - d.getTimezoneOffset(); viewer.animation.viewModel.timeFormatter = ...
- 前端水印图片及文字js教程
前端水印图片文字教程如下,复制代码修改图片地址即可看到效果,工作中遇到总结的,喜欢就关注下哦: <!DOCTYPE html><html> <head> <m ...