javaScript中的数据类型

对于编程语言来说,数据类型无非是非常基础却又很重要的存在,那么JavaScript语言中的数据类型有哪些呢?

基础数据类型:

1.boolean值

2.null

3.string

4.number

5.undefined

6.bigint

7.symbol

 

引用数据类型:

1.对象Object

2.函数Function

 

当中object又具体分为:

1.普通对象object

2.数组对象Array

3.日起对象Date

4.正则对象RegExp

5.数学函数对象Math

 

那么基础数据类型与引用数据类型有什么区别呢?

1.存储位置的分配机制不同:

由于基础数据的值简单且固定,因此将其声明的变量存放于栈中。

但是引用数据类型的值复杂度高且不固定,因此引用数据类型的值存在于堆中,而声明的变量存放于栈中,但是栈中的引用类型变量存放的只是一个指针,用来指向堆中具体存放该变量对应值的位置,也就是指向对应的引用数据类型的值。

2.变量的访问机制不同:

由于存储的分配机制不同,因此也就导致了访问机制也会不同。对于基础数据来说,由于存储位置是栈,因此可以直接访问。而引用数据类型不同,由于具体的值存放于堆中,变量存放于栈中,因此我们在访问引用类型时访问的其实是存放于栈中的指针,而非存放于堆中的具体的值。这就是所谓的“按引用访问”

3.复制变量时不同

由于上面两种不同,也就导致了在复制变量时产生了区别。

a.基础数据类型在复制变量时是直接将之前的值复制一份生成一个新的值,这两个基础类型的值相同且不会相互影响,即不会因为修改一个值而影响另一个值。

b.但是引用数据类型却又不同,复制引用数据类型时复制的是你所要复制的引用数据类型的指针,也就是存放于栈中的指针,而不是复制存放于堆中的具体的值,因此这也就导致了复制的引用数据类型与之前的引用数据类型相同但是两者之间会相互影响。也就是说我在修改一个引用数据类型的值,另一个引用数据类型在获取值时也会对应的发生改变。譬如:a={name:'熏悟空'}; a=b; b.name='猪八盖'; a.name='猪八盖';

4.传参时的不同

由于以上的不同,也会导致两种数据类型在作为函数的参数传递时也会产生区别。

a.基础数据类型直接将值进行传递,在函数内部对值进行操作不会影响到你所传递的参数存在位置之前的值。

b.引用数据类型传递的是引用数据类型存放于堆中的引用指针,而不是堆中的具体的值,因此你在函数内部对传递的参数进行修改时会对存放于堆中的值一并修改,因此也就导致了函数外其他地方引用该引用数据类型时也会对应的发生改变。这在具体的项目开发中若不注意会产生非常致命的影响。

具体可看如下代码:

function changeName(person) {
  person.name= "熏悟空"
  person = {
    name: 'hzj',
    age: 18
  }
  return person
}
const p1 = {
  name: '猪八盖'
}
const p2 = changeName(p1)
console.log(p1.name)
console.log(p2.name) 

上面的代码打印结果是什么呢?是的,p1.name是熏悟空,p2.name也是熏悟空,这就是上面总结的几点区别所产生的影响。

posted @ 2021-12-07 10:49  听寒以南  阅读(33)  评论(0编辑  收藏  举报