记录JS一些小技巧

296 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

获得无穷大、无穷小的方法

  1. 通过js常量Number.POSITIVE_INFINITY和Number.NEGATIVE_INFINITY
  2. 用不为0的数除以0得到
     // 正无穷大
     console.log(10 / 0); // Infinity 
    
     // 对应的,负数有负无穷大。
    
     console.log(-10 / 0); // -Infinity
    
    
  3. 声明一个超过js的Number允许表示的范围的值,也是会得到Infinity。
     let a = 1e1000
     console.log(a); // Infinity
    

JS有效整数范围

```
整数可以被精确表示的范围是从 -2 ** 53 + 1 到 2 ** 53 - 1,即 -9007199254740991 到 9007199254740991。超过这个数值的整数,都不能被精确表示。

常量Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER分别对应9007199254740991和 -9007199254740991。
```

Infinity运算的一些现象

```javascript
console.log(Infinity + Infinity); // Infinity
console.log(Infinity - Infinity); // NaN
console.log(Infinity * Infinity); // Infinity
console.log(Infinity / Infinity); // NaN
console.log(Infinity * 0);        // NaN
```

使a === a - 1

通过js整数可表示的范围在去越界实现,比如```Infinity+1 = Infinity```,```Infinity-1 = Infinity```
Number.MAX_SAFE_INTEGER+1也会出现越界现象,Number.MAX_SAFE_INTEGER+1其实就是等于Infinity
Number.MIN_SAFE_INTEGER-1也会出现越界现象,Number.MIN_SAFE_INTEGER-1其实就是等于-Infinity

记录一个数据length小技巧

```.length```是获取数组长度的一个属性,但可以通过修改这个属性该变数组的长度,那么,就这个其实是可以时间对数组的截取的
```javascript
    let a = [1, 2, 3, 4, 5]
    console.log(a.length) // 5
    a.length = 3
    console.log(a, a.length) // [1, 2, 3], 3
    a.length = 5
    console.log(a) // [1, 2, 3, , ,]
    // 重新修改length大于数组现有的长度无法恢复之前被删掉的元素,只会在数组后面增加两个空元素,此时这个数组是一个稀疏数组了
```

数组是对象的一种特殊形式,那么可以对数组增加属性吗?

```
    答案是可以的。
    let a = [1, 2, 3]
    a['name'] = 'liming'
    console.log(a,a.length) // [1, 2, 3, name: 'liming'] 3
    // 这会在数组上创建一个属性,但是并不会该变数组的length属性
```

for()的注意小细节

```
    // 使用for循环遍历一个数组的时候可以这样写
    let a = [1, 2, 3, 4, 5]
    for(let i = 0; i < a.length; i++){
        console.log(a[i]) // 依次输出1,2,3,4,5
    }
    // 但是上面的循环中重复获取了5次数组a的长度,可以优化一下
    for(let i = 0, len = a.length; i < len; i++){
        console.log(a[i]) // 依次输出1,2,3,4,5
    }
    // 下面这种更简洁
    for (let i = a.length; i--;)
    // 经测试,在一个长度较小的数组中,上面的两种写法时间上差别不明显,甚至优化后的方法耗时更长,但是在一个长达10000的数组中,优化后的方法比为优化的快(第一中写法:519.3271484375ms,第二种写法:474.511962890625)
```