1.常见的数据类型的不常见的操作| 8月更文挑战

127 阅读2分钟

1.基本数据类型

  • string
  • number
  • boolean
  • undefined
  • null
  • array
  • object
  • symbol
  • 区别 null 和 undefined 最简单方法: Number(null)--->0 ; Number(undefined)--->NAN

1.1 空数组([])和空对象({})

  • 特别注意的是,空数组([])和空对象({})对应的布尔值,都是true。

    if ([]) {
      console.log(true);
    }
    // true
    
    if ({}) {
      console.log(true);
    }
    // true
    
  • 判断数组

      Array.isArray();
      
      或者
      function isArrayFn (o) {
        return Object.prototype.toString.call(o) === '[object Array]';
      }
      #当然上面也可以用来判断对象 [object Object],字符串 [object String]等常见类型
    
    

1.2 null 和 undefined

  null == false
  // false
  null == undefined
  // true
  ~~undefined == false
  // true
  
  undefined == false
  // false
  ~~undefined == false, 这里~undefined 是 -1
  // true
  
  ```
  ~~NaN == false
  // true
  

  '' == false          ---> true
  '' == 0              ---> true
  /^\d*$/.test('')     ---> true


  '' === false         ---> false

  
  

~是取反操作符,~~undefined相当于~~Number(undefined)
~ 是JavaScript中的操作符,按位非,~~ 经常用来进行取整和类型转换,他和显示的用Number进行类型转换还是有区别的,比如处理 undefined 的时候。**

~~undefined
// 0

Number(undefined)
// NaN


~~false === 0  
~~true === 1
~~undefined === 0
~~!undefined === 1
~~null === 0
~~!null === 1  
~~"" === 0
~~!"" === 1

1.20 +

如果要取时间戳,很多时候我们这样写 new Date().getTime()new Date().valueOf(), 试试加号(+),是不是同样可以 ``` +new Date(); // 1627385156195 Number(new Date) // 1627386100775

  new Date()*1
  // 1627385336754
```
>`+new Date()` 相当于调用 `Date.prototype.valueOf()` 方法;
+: js在某个数据类型前使用‘+’,目的是为了将该数据类型转换为Number类型,如果转换失败,则返回 NaN;

1.3 隐式转换

在保存进位值的时候,用的并不是 1 和 0 ,而是true 和 false,这是因为隐式类型转换的时候,true会转为1,false会转为0。


1+true // 2

1+false // 1

1.4 小数转换

# 小数转成百分比

0.87 -----> 87%

0.87*1000/10 + '%'   87%  这种情况下是可以的

but:

'2.2'*100000/10     会出现 22000.000000000004
'2.3'*100000/10     会出现 22999.999999999996

1.5 0.1 + 0.2 !== 0.3

0.1 + 0.2 == 0.3     ---> false
0.1 + 0.2 - 0.3 == 0 ---> false
    
#这是因为js丢失精度问题,IEEE 754 规范:在JavaScript中,所有的Number都是以64-bit的双精度浮点数存储的
  • 双精度的浮点数在这64位上划分为3段,而这3段也就确定了一个浮点数的值,64bit的划分是“1-11-52”的模式,具体来说:

    • 1.就是1位最高位(最左边那一位)表示符号位,0表示正,1表示负
    • 接下去11位表示指数部分
    • 最后52位表示尾数部分,也就是有效域部分

JavaScript中0.1+0.2不等于0.3

这个是二进制浮点数最大的问题(不仅 JavaScript,所有遵循 IEEE 754 规范的语言都是如此)