关于JS的数据类型这块,面试中经常被问到的有以下几个问题。
JS中有哪些数据类型,它们的区别分别是什么?
JS中有哪些数据类型?
基础数据类型和引用数据类型两大类,总共有7种类型。
基础数据类型:
string, number, boolean, null, undefined, symbol(代表创建之后独一无二并且不可变的数据类型)。
引用数据类型:
Object。
function, array, object, set, map…都可以归结为Object这个大类
JS中数据类型的区别是什么?
- 声明变量时的存储分配
基础数据类型存储在栈中;
引用数据类型存储在堆中。
- 不同的内存机制带来了不同的访问机制
不可以直接访问或者是操作堆内存空间,只能操作栈内存中的引用地址。
基本数据类型直接访问,而引用数据类型访问引用地址,根据引用地址找到堆中实体。
- 赋值变量时不同
基础数据类类型-将原始值的副本赋值新的变量:
var name1 ='aaa';
var name2 = name1
引用数据类型-将引用地址赋值给新的变量:
-
var obj1 = {age: 90};
var obj2 = obj1
实例来深刻理解基础类型和引用类型
let obj = {
name: '前端晨话',
age: 8,
hobby: '旅游'
}
let objNew = obj
let age = obj.age
console.log(objNew.name) // 前端晨话
console.log(age) // 8
// 将其值改变
objNew.name = '东方不败'
age = 22
console.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