数据类型与数据储存方式

180 阅读4分钟

数据类型

基本类型

  • Null:只包含一个值:null
  • Undefined:只包含一个值:undefined
  • Boolean:包含两个值:truefalse
  • Number:整数或浮点数,还有一些特殊值(-Infinity+InfinityNaN
  • BigInt: 任意大的整数。
  • String:一串表示文本值的字符序列
  • Symbol:一种实例是唯一且不可改变的数据类型 内存空间
    内存分为栈内存与堆内存。
    栈内存特点:
  • 储存的值大小固定
  • 系统自动分配储存空间
  • 空间小
  • 可直接操作,效率高 JS基本类型值直接存在栈内存中,定义时就分配好了空间。
    改变基本类型变量实则为在新的地址储存新的值,然后将变量名对应到新的的值。

对象类型

  • Object:常用的ObjectArrayFunction等都属于特殊的对象 内存空间 储存于堆内存:
  • 储存的值大小不固定可调整
  • 空间大但效率低
  • 无法直接操作内部存储,使用指针读取,指针存在栈内存中。
  • 通过代码分配空间 这些特点决定了堆内存中储存的值可以轻易的改变 const与引用数据类型
    const定义一个对象后,变量的值为引用对象的指针,无法修改,但是可以修改堆内存中对象的属性值。
    const定于基本数据类型则完全不可改变因为定义的变量名直接指向不可改变的栈内存值。

变量复制

基本数据类型复制为创建新的对应空间,使得对应空间里的值相同。
引用类型的复制与基本数据类型逻辑相同,导致只复制了内存给新的变量名。
所以浅拷贝时两个变量名其实是指向了堆内存中的同一片储存区域,从而在操作时产生了互相影响。
变量比较:逻辑与复制相似,基本类型比较值,引用类型比较指针地址,即使深拷贝了一个对象但是指针不同返回false。
参数传递:函数参数传递本质是复制传递,引用对象的参数传递也是传递地址。

Symbol~

  • let mySymbol = Symbol('key')定义一个symbol。
  • key只用于描述这个值(name),而他实际的值是一个主键id,即使用了同样的name值也不同。
  • Symbol.for('key')可以寻找key值描述的symbol,找不到时会运行构造函数生成新的。
  • symbol作为对象属性时不可枚举,只能调用Object.getOwnPropertySymbols()这个专门获取symbol的方法。

number精度丢失

ES Number遵循IEEE754二进制标准,小数二进制一般是无限循环的,标准规定最后一位采用1进0舍造成了小数和超大数的精度丢失。
1符号位+11指数+52有效数字
最大精度为2^52

引用包装类型

  • Array 数组
  • Date 日期
  • RegExp 正则
  • Function 函数
  • Boolean/Number/String是obj包装的,可以new出对象的。

类型转换

if/逻辑语句

null /undefined /'' /NaN /0 /false之外全是true;

数学运算符

非加法会转为number后执行。
加法:如果有string类优先执行字符串拼接/number+基本类型执行转number/number+引用类型执行字符串拼接。

==

类型相同则与===返回一致。
类型不同进行隐式类型转换。

  • boolean进行比较最先被转为number。
  • string与number:转string为number
  • null与undefined:只有unll==undefined为true
  • 引用类型与原始类型:引用对象依照ToPrimitive转为原始类型。
  • !优先级高于==,[] == ![] // true。 ToPrimitive:原始值直接返回-valueOf原始值则返回-toString原始值则返回-抛出error

例题

让a == 1 && a == 2 && a == 3为true;

const a = {
   value:[3,2,1],
   valueOf: function () {return this.value.pop(); },
} 

判断数据类型

typeof

返回string字符串。

typeof 'ConardLi'  // string
typeof 123  // number
typeof true  // boolean
typeof Symbol()  // symbol
typeof undefined  // undefined
typeof function(){}  // function

obj原型构造全是obj很捞。

istanceof

判断一个原型是否在其原型链上出现。

[] instanceof Array // true
new Date() instanceof Date // true
new RegExp() instanceof RegExp // true

toString

返回[object type] type为对象的类型。
需要确定toString没有被重写,或者用call调用prototype上的tostring。

判断数组经典题

  • console.log(typeof []) // "object" 嘎了
  • console.log(arr instanceof Array) // true
  • console.log(arr._proto_.constructor === Array) //true
  • console.log(arr.constructor === Array) // true
  • Array.isArray(arr)
  • 终极Object.prototype.toString===[object Array]