数据类型的概念
数据类型即这条数据数据属哪个类型?而这些类型在编程语言中往往指的是:数字类型,字符串类型,布尔类型或对象等,当然不止这么简单,但我们可以这么简单的去理解!
JS的数据类型一共有8中:
其中,前7种类型为基础类型,这里需要强调的是undefined
与null
两种类型,推荐大家读下大佬的这篇《undefined与null的区别》文章,不做赘述!
而最后一种(Object)引用类型,是需要我们重点关注的对象,因为它在日常开发过程中使用的最为频繁,也是技术细节最多数据类型!
引用类型(Object)分为图上几种常见类型:
- Array - 数组对象
- RegExp - 正则对象
- Date - 日期对象
- Math - 数学函数
- Function - 函数对象
其中不同的数据类型在初始化后都会放在不同的内存中:
- 基础类型存储在栈内存,被引用或拷贝时,会创建一个完全相等的变量;
- 引用类型存储在堆内存,存储的是地址,多个引用指向同一个地址,这里会涉及一个“共享”的概念。
至于栈内存和堆内存的概念,不明白的同学可以搜索了解下,或者看下边这篇!
推荐阅读下大佬的这篇 《JS中的栈内存堆内存》文章,有详细解释!
关于引用类型的核心“共享”概念,我们通过以下两段代码来理解!
片段一:
let a = {
name: 'crmeb',
age: 18
}
let b = a;
console.log(a.name); //第一个console
b.name = 'son';
console.log(a.name); //第二个console
console.log(b.name); //第三个console
运行这个代码片段可以看出,第一个 console
打印 a.name
的值是 crmeb
,这是毋庸置疑的,但是,当执行完b.name='ceshi
之后,你会发现a和b的属性name都是'ceshi'
,第二个a.name
和第三个b.name
打印的结果是一样的,这里就体现了引用类型的“共享”特性,即这两个值的内存地址是一样的,所以他们的值是共享的,一个改变,另一个也会跟着改变!
片段二:
let a = {
name: 'Julia',
age: 20
}
function change(o) {
o.age = 24;
o = {
name: 'Kath',
age: 30
}
return o;
}
let b = change(a);
console.log(b.age); // 第一个console
console.log(a.age); // 第二个console
console.log(a)
console.log(b)
运行以上代码可以看出,第一个console打印b.age的值为30,第二个 console 的返回a.age的结果是 24,而最后分别打印了a和b的值,发现a最后返回的结果竟然是{name: “Julia”, age: 24}。
这里就是考验大家对栈内存和堆内存的理解了,函数中传递进来的参数o,在第七行return返回的时候对应了一个独立的内存地址,因此上b返回的就是参数o的值!
预告: 下一篇分享Js中数据类型的三种检测方法!
- 第一种判断方法:typeof
- 第二种判断方法:instanceof
- 第三种判断方法:Object.prototype.toString
欢迎大家点赞关注交流,给大家推荐个我们开源的优秀的开源公众号/小程序商城系统,欢迎Star,使用交流!
传送门:http://github.crmeb.net/u/xingfu
转载:https://blog.csdn.net/CRMEB/article/details/114639074