Vue 小知识点

时间:2024-03-24 22:08:41
1.2.1 基本数据类型

undefined型:声明了变量但未对其赋值

null型:赋值了但内容为空

1.2.2 存储位置
  • 基本数据类型存储在栈:这些数据占用空间小且大小固定可直接访问和修改,需要频繁使用
  • 引用类型地址存在栈区,值存在堆区 ,这些数据占用空间大且大小不固定,在堆中按优先级排序以免影响程序性能;堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用
1.2.3 数据类型检测方式
  • typeOf:typeof会直接返回一个变量的数据类型

    特殊结果:typeof null,null指针的标识符是000刚好与object相同;typeof NaN,NaN是一个警戒值但没有真实值可表示,指出数字类型中存在不是数值型的错误但它本身也是一个数值型

  • instanceof:用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上,即判断谋对象是否为某构造函数的实例,最后返回布尔值

    原理:顺着原型链去找,直到找到相同的原型对象,返回true,否则为false;以此判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位置

    缺点:可以更改原型链的指向,导致检测数据类型不准确;但不能判断基本数据类型

  • constructor:constructor是原型对象的属性指向构造函数,可以检查基本数据类型,但修改原型同样可能导致错误

  • Object.prototype.toString. call(thisArg):最准确的数据类型检测方式,Object.prototype.toString这个方法其实是返回当前实例所属类的信息,结构为:’[object 所属的类]’,让它里面的参数设为要检测的数据再调用call方法,即让参数执行Object.prototype.toString方法

1.2.4 深拷贝和浅拷贝

浅拷贝

  • 定义:对于引用数据类型只是复制了对象的引用地址,新旧对象还是共享同一块内存,修改其中一个对象的值另一个对象的值也会改变

  • 方法:Object.assign、Array.prototype.slice(),、Array.prototype.concat()

深拷贝

  • 定义:不但拷贝了指针而且还拷贝了数据即为拷贝的对象开辟了一片新内存空间,两个对象属性相同但对应两个不同地址,修改新对象不会影响原对象

  • 方法:构造一个深拷贝函数通过递归调用的方式拷贝每一层;借用JSON对象的stringify方法和parse方法来分别实现序列化和反序列化

区别

对于基本数据类型两者都是直接复制数据值,区别在于引用数据类型的复制

  • 浅拷贝两个变量的指向是同一个地址,当原对象或拷贝对象发生改变时另一对象的值也会跟着变化 ;深拷贝两个变量指向不同地址,在引用类型中改变复制对象的值也不会影响原对象
  • 深拷贝相比于浅拷贝速度较慢并且开销较大
  • 浅拷贝只复制对象的第一层属性、深拷贝可以对对象的属性进行深层次地递归复制

扩展运算符和object. assigh的拷贝分析:浅拷贝;只能拷贝一层数组或对象即里面只有基本数据类型元素//因为这种拷贝只能拷贝一层而刚好可以覆盖,如果包含多层元素即含有引用类型数组或对象时的元素时除第一层外都不能拷贝

1.2.5 为什么0.1+0.2≠0.3

浮点数精度造成的:十进制转二进制时只能存储52位的小数,在保留53位有效数字后产生了误差;由于十进制的0.1只能在二进制中用近似0.1的数表示,再从二进制转换为十进制数时这种误差便反映到了结果中

解决办法:用tofixed方法并保存两位小数点

1.2.6 Map和Set的区别

1.定义

Set是一种叫集合的数据结构,以[值]的形式存储元素且值是唯一的

Map是一种叫做字典的数据结构,以键值对的形式存储

2.增删改查

Set:

  • add()——添加某个值,返回Set结构本身
  • delete()——删除某个值,返回一个布尔值,表示删除是否成功
  • has()——返回一个布尔值,判断该值是否为Set的成员
  • clear()——清除所有成员,没有返回值

Map:

  • size返回map结构的大小
  • set() 设置键名key对应的键值为value,然后返回整个Map结构,如果key已经有值,则键值会被更新,否则就新生成该键
  • get方法读取key对应的键值,如果找不到key,返回undefined
  • has方法返回一个布尔值,表示某个键是否在当前Map对象之中
  • delete方法删除某个键,返回true。如果删除失败,返回false
  • clear方法清除所有成员,没有返回值
  1. 遍历
  • keys(): 返回键名的遍历器
  • values(): 返回键值的遍历器
  • entries(): 返回键值对的遍历器
  • forEach(): 使用回调函数遍历每个成员

特性:JS所有的对象都是Object的一个实例,对象可以用字面量的方法const obj = {}即可声明,Map是Object的一个子类,可以有序保存任意类型的数据,使用键值对去存储,其中值可以存储任意类型,const m = new Map();即可得到一个map实例。

访问:map:通过map.get(key)方法去访问属性,object:通过obj.a或者obj[‘a’]去访问一个属性

赋值:map通过map.set去设置一个值,object通过object.a或object[‘a’]=1去赋值

键:map的key可以是任意类型且是有序的,object的key只能是字符串,数字或symbol且无序的

大小:通过map.size即可快速获取内部键值对的个数,object:需要通过Object.keys的转换才能将其转换为数组,再通过数组的length方法去获取