各位好,我是一名前端的小菜鸟,从今天开始,会不定期去更新我当前对于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的数据类型的理解,在最后的类型判断中有说到原型链的问题,这个点在下一章中去讲到