JavaScript君,请您坦诚相待~~~
最近在学习的途中发现了javascript
中一些有趣又不理解的特性,于是乎就发出来和大家一起分享分享。这些看似不理解的东西其实和我们的基础相关,于是就好好的查找资料,本着加强基础的想法把这些东西弄得。当然这里面还有好多一知半解和一些根本不知道的,希望有大佬可以解释一下。
看着这些有没有一种被欺骗的感jio,为什么输入9999999999999999
得到的是10000000000000000
,为什么0.5+0.1==0.6
而0.1+0.2
就不等于0.3
了,还有最奇怪的是[] == ![]
。
不急~~~,让我们来冷静分析。
1、typeof NaN
其实这是一个很简单的题目,NaN是一种特殊的number。通常都是在计算失败时,作为 Math 的某个方法的返回值出现(例如:Math.sqrt(-10)),或尝试将一个字符串解析成数字但失败了的时候(例如:parseInt("aaa"))。并且注意NaN == NaN
是false
,但是我们可以用Object.is()
方法来判断两个值是否相等;
2、9999999999999999
在javascript
中只有一种数值类型(number
),javascript
没有真正意义上的整数,整数就是不带没有小数的十进制数,产生这种原因是因为javascript
在计算的时候会有浮点数误差。
3、0.1 + 0.2 !== 0.3
javascript
中的数字类型是基于IEEE 754
标准来实现的,该标准也通常被称为“浮点数”,由于在二进制浮点数中0.1
和0.2
并不是十分精确,所以0.1+0.2
不等于0.3
。但是我们可以使用Number.EPSILON()
,来判断两个数是否在机器精度的误差范围内。 点击这里了解更详细
4、Math.max()&Math.min()
Math.min()
返回了Infinity
,这个值对应了Number.POSITIVE_INFINITY
常量。Math.max()
返回了-Infinity
,这个值对应了Number.NEGATIVE_INFINITY
常量。
我真的也不知道为什么(脑壳痛),这两个方法在我们平常的使用中都会传入至少两个参数,但是如果不传参数就会返回这样的结果,真让人摸不着头脑,就算抛出个错误感觉也比这样要好一些。
5、[] !== [] but [] == ![]
[] !== []
,因为数组是引用值,当我们创建了两个数组的数组的时候,它们的指针指向堆中的内存空间不相同所以不相等。[] == ![]
,这看起来似乎有点疯狂,因为!
的优先级高于==
所以先进行![]
的转换,!
可将变量转换成布尔类型,null
、undefined
、NaN
以及空字符串('')取反都为true
,其余都为false
,所以[] == ![]
变为[] == false
,所以[] == ![]
。
6、[] + {} = "[object Object]"
这里的,{}
出现在+
运算符表达式中,{}
被当作一个空对象来处理,{}
会被强制转换为"[object Object]"
,[]
会被强制转换为""
,所+
执行字符串拼接操作结果为"[object Object]"
7、{} + [] = 0
这里的{}有些不同,它会被当作一个代码块来处理,所以最后的结果相当于执行+[]
,然后[]
被强制转换为0
; 最后转换的代码如下:
{}
+[]
复制代码
8、91 - '1' & 9 + '1'
- 91 - '1':这里
-
先将'1'
强制转换为1,然后再执行数值的相减操作 - 9 + '1':这里执行的是字符串拼接操作
9、parseInt(1/0, 19)
因为1/0
的结果是Infinity
,所以parseInt(1/0, 19)
相当于parseInt('Infinity', 19)
,因为第一个字符是'I'
,以19
为基数时值为18
。
10、typeof a
虽然这里的a
还没有被定义但是typeof a
的返回结果任然是undefined
,着也许是JavaScript
设计的一个缺陷,在ES6
之前typeo
f是一个绝对安全的操作,因为不会抛出错误,但是再ES6
之后意味着typeof
不是绝对安全的操作了:
可以看到在在在用声明该变量之前就使用该变量会抛出一个错误,因为let
声明的变量存在一个暂时性死区。
11、NaN !== NaN
这也许是javascript中唯一一个自身不等于自身的值了,但是可以通过Object.is(NaN,NaN),来判断,最后得到的结果是true。
12、.42 == 0.42
因为JavaScript中规定小数点前面的0可以省略。相信大家在CSS中也用过,transition: width .2s
。
13、[1][0] == 1
这里相当于把[1]看作一个数组,然后取它的第0项的值。 相当于:
let arr = [1]
arr[0]
复制代码
14、== & ===
==
允许在相等比较中进行强制类型转换,而===
不允许。所以true == 1
结果为true
true===1
结果为false
由于本人才疏学浅,肯定有表述不是很正确的地方,敬请各位斧正。
JavaScript君,请您坦诚相待~~~相关推荐
- python模拟访问js_python模拟http请求,返回“浏览器不支持javascript,请设置您的浏览器开启javascript支持”...
需求 写一个可以自动获取"腾讯微博开发平台"申请中的oauth_verifier参数值的脚本. 正常情况下,需要人工从浏览器地址栏复制oauth_verifier的值,这个可以模拟 ...
- 从点点点到年薪30W的心理历程--测试君请进,绝对让你不虚此行!
一.前言:人生感悟 人生,就是一个苏醒的过程,生命就是一次历练,从鲜衣怒马,到银碗里盛雪,从青葱岁月到白发染鬓,人总是会在经历中成长,在成长中懂得,在懂得里看透,看透而不说透,从而一步一步的走向成熟, ...
- 滴,这周的福利已掉落,镁客君请你免费骑摩拜
一起骑车去浪! 昨天周五,按惯例我们是要送福利的 但是,我们运营跑了. 然后,我就被临时拉来给大家送福利. 这次我们送的东西比较特殊. 它能让你在国庆节, 完全没有堵车烦恼, 享受飞一般自由. 比如在 ...
- JavaScript入门-第1章 请做好准备
JavaScript入门 1-1 为什么学习JavaScript 一.你知道,为什么JavaScript非常值得我们学习吗? 1. 所有主流浏览器都支持JavaScript. 2. 目前,全世界大部 ...
- 前端开发之JavaScript基础篇一
主要内容: 1.JavaScript介绍 2.JavaScript的引入方法和输出及注释 3.javaScript变量和命名规则 4.五种基本数据类型 5.运算符 6.字符串处理 7.数据类型转换 ...
- JavaScript基础,Cookies,Sessions
php和JavaScript,掌握JavaScript基础,自定义函数,流程控制语句,事件,调用JavaScript脚本,在PHP中使用JavaScript. JavaScript是网景公司开发的,是 ...
- 是否有标准函数检查JavaScript中的null,undefined或空白变量?
是否有通用的JavaScript函数可检查变量是否具有值并确保其undefined或为null ? 我有以下代码,但是不确定是否能涵盖所有情况: function isEmpty(val){retur ...
- ppk on JavaScript第二章:背景(完结篇)
无障碍规则 尽管无法预见可能损害一个有脚本网站的可用性的所有情形,但我已经总结出一些可以帮助您在基础上不犯错的规则.不要把它们当作JavaScript和无障碍的终极规则,这只是能防止一些常见低级错误的 ...
- 61计蒜客 动态规划基础 蒜头君的城堡之旅
题目: 蒜国地域是一个 n 行 m 列的矩阵,下标均从 1 开始.蒜国有个美丽的城堡,在坐标 (n,m) 上,蒜头君在坐标 (1,1) 的位置上.蒜头君打算出发去城堡游玩,游玩结束后返回到起点.在出发 ...
最新文章
- 一个简单的blog系统(九) 增加标签和标签页面
- mysql delete limit用法_你习惯delete语句后带上limit吗
- CF438E:The Child and Binary Tree(生成函数)
- async,await
- Java 按行读写文件(解决中文乱码)
- 【BZOJ4108】[Wf2015]Catering 有上下界费用流
- 逗号后面统一加空格_十分钟搞定字幕,教你做加字幕的“快手菜”
- git修改文件名大小写的方法。
- 机器学习实战之Logistic回归
- 我的Oracle 9i学习日志(11)--重做日志文件及练习
- c 语言编写个人所得税程序,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
- 程序员代码面试指南:IT名企算法与数据结构题目 PDF 版
- 啊哈算法(python)
- mysql打开数据库的sql语句_数据库MySQL——SQL语句(命令)
- 动态规划(一)——矩阵连乘
- 开帖记录每天工作学习日常
- 中国各个朝代的历史地图
- 一篇文章搞定Redis Stream
- 微信没有回车键怎么换行_微信打字怎么换行
- Linux下重启磁盘盘符会变,linux系统 重启盘符错乱问题