JS中数据类型中以及它们的区别

关于JS的数据类型这块,面试中经常被问到的有以下几个问题。

JS中有哪些数据类型,它们的区别分别是什么?

JS中有哪些数据类型?

基础数据类型和引用数据类型两大类,总共有7种类型。

基础数据类型:

string, number, boolean, null, undefined, symbol(代表创建之后独一无二并且不可变的数据类型)。

引用数据类型:

Object。

function, array, object, set, map…都可以归结为Object这个大类

JS中数据类型的区别是什么?

  1. 声明变量时的存储分配

    基础数据类型存储在栈中;

    引用数据类型存储在堆中。

  2. 不同的内存机制带来了不同的访问机制

    不可以直接访问或者是操作堆内存空间,只能操作栈内存中的引用地址。

    基本数据类型直接访问,而引用数据类型访问引用地址,根据引用地址找到堆中实体。

  3. 赋值变量时不同

    基础数据类类型-将原始值的副本赋值新的变量:

    var name1 ='aaa'; var name2 = name1

引用数据类型-将引用地址赋值给新的变量:

    var obj1 = {age: 90}; var obj2 = obj1

实例来深刻理解基础类型和引用类型

let obj = {    name: '前端晨话',    age: 8,    hobby: '旅游'}let objNew = objlet age = obj.ageconsole.log(objNew.name) // 前端晨话console.log(age) // 8
// 将其值改变objNew.name = '东方不败'age = 22console.log(obj.name) // 东方不败console.log(obj.age) // 8

由上述代码可以看出,因为引用类型赋值赋的是引用地址,所以修改了其中一个值后,不管是obj还是objNew的name都改变了。而age呢只是基础类类型的赋值,不会导致这种情况的发生。

实战解析

其实上面的问题属于很基础很基础的问题,基础到很多人都会忽略了它们的存在。然而在我们的开发中,却经常会遇到,如果忽略了此基础知识,很可能你项目中的问题不知其所以然。

我分享一下在项目中犯的一个错误,供大家参考一下,以免再犯错。

需求:

多个页面都用到了相同选项的下拉框,有的选项里有’全部’,有的选项里环需要’全部’这个选项,有的可能不是下拉框而是一个单选框或者多选框。反正就是内容一致,可能形式各个页面各有不同。

架构:

主管首先将调用选项的接口写在了vuex中,需要时直接从vuex里取。

本页面功能:

我所负责的页面是一个下拉框的形式,这个下拉框需要加一个’全部’。

我的做法:

computed: {    ...mapGetters(['options']),},created() {    // 下拉框的options    let options = this.options.OBJECT_TYPES    options.unshift({id: '', name: '全部'})    this.options = options}

之后测试一直发现如下问题,并且不断地打开此问题,而我的本地却一直未复现此问题。是不是测试那里有缓存造成的?当时没有引起注意。后来又有其它人发现此问题。我也感觉到 事出反常必有妖!

图片

直到后来才发现问题所在,因为这个对象在其它页面里也使用到,如果光看本页的话问题不好复现,但是多个页面来回切换,问题就出来了。那么这肯定是引用数据导致的。所以在每个页面里,都将其转换成深拷贝才修复了问题。解决代码如下:

created() {      let options = JSON.parse(JSON.stringify(this.options.OBJECT_TYPES))      options.unshift({id: '', name: '全部'})      this.options = options.concat()     }

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/88356.html

(0)
guozi's avatarguozi
上一篇 2024年6月3日 下午5:10
下一篇 2024年6月3日 下午5:14

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注