![655f8818117645c4dd5b068601173b3c.png](https://i-blog.csdnimg.cn/blog_migrate/134017097f742cb6fa2787c566a0903b.jpeg)
前言
近期在复习前端相关知识点,接触到很多平时业务涉及不到的东西(你可以理解是些偏语言本身方向的)。
以前一直错误的以为我是个“经验丰富”的前端开发,其实从纵向发展的深度上看,我依旧语言能力不过关,借这个机会继续沉淀自己,让自己未来能走的更远。
同时希望在读的各位多少能有些收获。
如下示例均摘自《你不知道的 javascript 》
数组
稀松数组(sparse array)
数组内部含有空白未定义的元素
![de9f05a1fa9994deb890c8de7c0a9551.png](https://i-blog.csdnimg.cn/blog_migrate/bf7685fc357adda98578db7b5c9a694d.jpeg)
注意 [1] 元素没有定义,在输出整个数组时,结果为:[ 1, <1 empty item>, 3 ]
要明白这和 显式的定义 [1] 元素 是有区别的:
![1aa4391f13acb784708fb00e6c450c13.png](https://i-blog.csdnimg.cn/blog_migrate/9c4997d633e181ac9a9aba2440cc9890.jpeg)
类数组(array-like)
拥有一个 length 属性和若干索引属性的任意对象
最常见的就是我们 function 中的 arguments 参数列表;或者是 document 中获取 nodes 节点一系列方法得到的数组。
![bd9da67c259fc9dd41752ab242edb070.png](https://i-blog.csdnimg.cn/blog_migrate/04cd26a7cf4d194522bce5e849dbe699.jpeg)
我们可以通过 Array.prototype.slice 来将类数组转成真正的数组格式,或者是 ES6 的 Array.from 方法。
上图中,你能看到类数组和数组的区别。
字符串
字符串相信都很熟悉,但在字符串上,我们可以使用数组的方法。就是因为这两者很相似,都拥有 length 之类的属性,字符串又称为 类数组 。
![6994dfcbbbb2fcadf66a5a97337f5ec7.png](https://i-blog.csdnimg.cn/blog_migrate/f6b34a5a2132bfe720b89891795e142d.jpeg)
图上列举了: length 、 indexOf 、concat 之类的方法。
同时我们可以通过 借用 方式,使用数组的 api 来简化字符串的操作。
下面示范了 join 和 map 在字符串的应用:
![a673d30fff65392c10a81b62fb8be613.png](https://i-blog.csdnimg.cn/blog_migrate/b6cf2a44036aa60587820a293872b9bd.jpeg)
需要注意,这两者还是有不同的。
和真正数组的区别
数组是可变的(会根据引用改变),而字符串不可变(不会改变原始值)
比如,我们不能对字符串进行“反转”操作:
![d6b7f484b5ba2a9e8f222036db18da44.png](https://i-blog.csdnimg.cn/blog_migrate/ae5a62835262b0487a28511c1ee7cc98.jpeg)
因为当前字符串的本事不可能被修改。但在数组中,我们却很正常的在使用。
当然可以通过如下方式来实现类似的功能:
![0ee2429022e2471444383022005a9100.png](https://i-blog.csdnimg.cn/blog_migrate/18dc26330f794bf9a7c1a0133a397936.jpeg)
数字
常见的语法
示例了,转指数格式、保留小数:
![4f345b7138b39c522283f672ff046e1c.png](https://i-blog.csdnimg.cn/blog_migrate/ef8fe88ba088dd1373186db9a17052d0.jpeg)
当然还有 toPrecision (显示有效数位)之类 api ,这里不做展开。
值得注意的是,关于 toFixed 一些细节:
你是否遇见过这样的错误?
![e9fae81ab53de3a256f9f93c45c66652.png](https://i-blog.csdnimg.cn/blog_migrate/3ce0090f6af9b5ff0ab6ad4f206e9c48.jpeg)
但改成如下方式,又正常了:
![d9caa4b4d726f79144aa2e9bcfa93f37.png](https://i-blog.csdnimg.cn/blog_migrate/8272ae54f679269df1afc293bd7df246.jpeg)
其原因是:会把 123.(有个点) 当成一个完整的数字来解析,所以 123. 被解析后,无法调用 toFixed 方法。
精度,最小数
js 是采用双精度(64位二进制)的浮点数,IEEE 754 标准。
![72b414f7707a8b5e3259a661c332ea7e.png](https://i-blog.csdnimg.cn/blog_migrate/fd3c72ca67d6abdc44db76cd482db104.jpeg)
当然我们这里不会深入,你只要知道 0.1 + 0.2 不等于 0.3 就算入门了。
![88f71e57233aaae1fb66889648381819.png](https://i-blog.csdnimg.cn/blog_migrate/08040daac4601b570adfebd34c5cf0e4.jpeg)
那怎么才能使其相等呢?相信你也看过网上他人的解决方案,我直至看到书上如下的 polyfill 才恍然大悟:
![39687def700d9813efee52f42260fe00.png](https://i-blog.csdnimg.cn/blog_migrate/402419b85dad4b50f8983baef1fdb948.jpeg)
我们可以利用 Number.EPSILON 最小数来确定一个精度范围,甚至可以直接利用 Math.pow(2, -52) 。因为 IEEE 754 规范上定义的小数位就是 52 位。
安全的整数
同样,我们也可以利用 Number.MAX_SAFE_INTEGER 来确定最大整数的范围。
结合 Number.isInteger 来定义一个安全的整数判断方式:
![8699d5c7e55d3515bf205c2d8ade9411.png](https://i-blog.csdnimg.cn/blog_migrate/985e0c4810784b546e87b097ac576015.jpeg)
特别的值
void
![430bc60a7614379d21d1beb86fd17e16.png](https://i-blog.csdnimg.cn/blog_migrate/a4b505c228a18b2e9ff96fe09147085d.jpeg)
你可以想象如下方式是否有某些场景的运用?
![21842c0326061d83f631fe02e6ed6cd5.png](https://i-blog.csdnimg.cn/blog_migrate/2cbf29afdb3d65e834eb9d2e5e5d916c.jpeg)
或者某些第三方库利用 void 来避免对 undefined 的覆写这样的误操作。
自反 reflexive (我不是我)
说道自反,就是 NaN 和 0 值(你可以在 vue 的源码中也看到类似的工具方法)
![c1c1aefc94fed3e40c80c49de2164ada.png](https://i-blog.csdnimg.cn/blog_migrate/6e344cb88de8e6afcf078525d7bac8a1.jpeg)
很神奇: NaN 不等于 NaN
那怎么判断 NaN 呢?相信你一定知道 isNaN ,来判断一个值是否是 NaN ,但是在 window 又有个坑:
![338ccb07a14bbcc5a9982ba9c52fc4bc.png](https://i-blog.csdnimg.cn/blog_migrate/57420309a4c984548d71dc28972b1a4e.jpeg)
很明显,这里判断的 f 值只是个字符串,而不是 NaN ,这就是一个历史 bug 。但我们可以通过如下方法避免:
![9c822f3697d353237bb52e87c517cce3.png](https://i-blog.csdnimg.cn/blog_migrate/a0c54754140a9100599054b9e0093394.jpeg)
零值
首先 js 存在 0 和 -0 ,在数字的乘数法之类运算会出现负数的 0 。
并且按照前面说的自反特性,你想看到如下情况:
![6f39a7e347ee31d65803fe1dd9aac81f.png](https://i-blog.csdnimg.cn/blog_migrate/849fe20ac9ffa54ebe1c94b202694601.jpeg)
这里就简单说下 -0 的判断方式:
![f2016df081da1c72f545e86f4b1fa606.png](https://i-blog.csdnimg.cn/blog_migrate/dfde22c5c4f971eb9c4be58cdecab2dc.jpeg)
扩展
针对 -0 和上面 NaN 判断如此“困难”, ES6 提供了 Object.is 来方便我们的判断:
![74d3cf5fa73b8b9557a3bae939cefbbb.png](https://i-blog.csdnimg.cn/blog_migrate/f02fdf7311fa6ed488e5a3b45f6ebfde.jpeg)
用来判断两个值是否“绝对”相等,我们也就不必关心一些“难以下咽”的 polyfill 。
总结
以上这些“值”的细节只是一小部分。
除了基本类型的值外,还有复杂类型的引用值,不过那些随着开发的阅历掌握的会比这些容易许多,起码我是看了书后才略知一二。
如有错误之处,望各位评论指出。