JS-数据类型

43 阅读3分钟

各位好,我是一名前端的小菜鸟,从今天开始,会不定期去更新我当前对于JS的理解,有什么不对的地方请指出

JS数据类型

分为两类:原始类型和引用类型

原始类型

  • string
  • number

有两个特殊的数字, NaN (not a number) 和 Infinity(无穷大)

这个 NaN 是一个非法数值, 是由无效计算的结果,通过 typeof 去判断结果是number,且NaN不会等于本身。

这个 Infintiy ,显而易见表示无穷大

  • bigint

是在ES6时加入,一般情况下很少用

  • null

一般来说系统是不会主动给你 null, 除非是你主动赋值。 但它有个诟病 typeof null 的结果是Object。这就是JS的历史原因了,因为在最开始存储变量是使用32位二进制数字存储,其中前三位表示标记类型 ,null 的二进制全0,而Object的二进制前三位000, 所以typeof 的时候就会显示为Object。由于发现时比较晚,由于修改会导致很多现有代码崩溃,所以没改

  • undefined
  • boolean
  • Symbol

ES6加入,表示永不重复的值

引用类型

  • Array

Array数组,拥有length,index属性,数组方法对数组去进行操作。

  • Object

Object 称为对象,是由一系列 无序 键值对的集合,内部会有重复的键,重复时后者会把前者覆盖,并且它的键只能是 string 或symbol 。并且它可以通过 [ ] 和 . 去访问,这是由于JS底层会把键转换成字符串

  • set

set集合,它的特点是每个值只能出现一次。 如果存放的是原始类型,存放的是值本身,而如果是存放对象或数组的话,则是引用指针。

这个时候就考察一下,上面的内容有没有掌握。

问:

在一个set中独立添加两次{name:'小明'},这个set中有几个小明?

在一个set中独立添加两次NaN ,这个set中有这个NaN?

答:

两个小明。set存放对象的话是存放对应的指针,而独立两次添加的话表明这两个指针是不同的。

一个NaN。虽然用 === 去判断两个NaN是不等的,但set的判断是否重复并不是用 === ,而用SameValueZero方法判断的,这个方法的对于NaN和 +0,-0 都是相等的。

剩下的就是set的方法可以去 [MDN](MDN Web Docs) 查看

  • map

map字典,它和Object一样,但它的键是可以任意类型的(可以用对象来当键,NaN也可以)。 剩下的就是一些方法在 [MDN](MDN Web Docs) 看

存储位置

原始类型参与运算时会放到栈中,而引用类型时在栈中存放一个指针,但实际数据存放在堆中

类型判断

常见的类型判断:

  • typof

只能判断除了null的基础类型

  • instanceof

原理是要判断的类型,去查询它的原型链上是否有该类型

  • Object.prototype.toString.call

比较全面且好用一点,大多数的类型可以判断,但当自定义一个类型时你没办法判断。要让Object.prototype.toString.call 能够判断自定义类型,要在定义时去声明一个属性叫Symbol.toStringTag即可

class Student{ 
    get [Sybol.toStringTae](){
    return "Student"
    }
  }

总结

以上呢就是我对于JS的数据类型的理解,在最后的类型判断中有说到原型链的问题,这个点在下一章中去讲到