JS 数据类型的访问方式是什么?

本次内容主要说明的是基本数据类型与引用数据类型的访问方式是什么?
为什么要突然说JS里的数据类型呢?因为最近几个朋友面试的时候大公司都会问到的问题,比如:豆瓣,滴滴,新浪微博,京东,好未来都有问道,他说让我也看一下,我也就稍微研究了一下。
这篇文章会给大家详细介绍一下这两个数据类型。
肯定会有人问基本数据类型与引用数据类型则么简单东西还需要说吗?这不应该是基础吗?
  1. 数据类型的确是学前端的基础
  2. 但是两个数据类型的区别是什么?
  3. 两个数据类型的储存方式与访问方式分别是什么?
这一章主要负责说明的是基本数据类型与引用数据类型的区别和这两种数据类型的储存方式是什么

Javascript 中的基本数据类型与引用数据类型的区别

一、 基本数据类型和引用数据类型

a. ECMAScript 包括两个不同类型的值:基本数据类型和引用数据类型。
b. 基本数据类型指的是简单的数据段,引用数据类型值得是有多个值构成的队象。
c. 当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值。

二、常见的基本数据类型:

Number、String、Boolean、Null和Undefined。基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值。

实例:

  var a = 10;
  var b= a;
  b = 20;
  console.log(a); //10

上面,b获取的是a值得一份拷贝,虽然,两个变量的值相等,但是两个变量保存了两个不同的基本数据类型值。
b只是保存了a复制的一个副本。所以,b的改变,对a没有影响。
下图更直接演示了这种基本数据类型赋值的过程:

JS 数据类型的访问方式是什么?_第1张图片

三、引用类型数据:

也就是队象类型Object type,比如:Object、Array、Function、Data等。
JavaScript的引用数据类型是保存在堆内存中的队象
与其他语言不同的是,你不可以直接访问堆内存空间中的位置和操作堆内存空间。只能操作队象在栈内存中的引用地址。
所以,引用类型数据在栈内存中保存的实际上是队象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的队象。

 var obj1 = new Object();
var obj2 = obj1;
obj2.name = "My Name";
console.log(obj1.name); //My Name

说明这两个引用数据类型指向了同一个堆内存队象。obj1赋值给obj2,实际上这个堆内存对象在栈内存的引用地址复制了一份给obj2,
但是实际上他们共同指向了同一个堆内存队象。实际上改变的是堆内存队象。
下面我们来演示这个引用数据类型赋值过程:

JS 数据类型的访问方式是什么?_第2张图片
栈-堆
四、总结区别
a. 声明变量时不同的内存分配

1)原始值:内存在栈(stack)中的简单数据段,也就是说,他们的值直接存储在变量访问的位置。
这是因为这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 --- 栈中。这样存储便于迅速查询变量的值。
2)引用值: 存储在堆(heap)中的队象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存地址。
这是因为: 引用值的大小会改变,所以不能把他放在栈中,否则会降低变量查询的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。
地址的大小是固定的,所以把他存储在栈中对变量性能无任何负面影响

b. 不同的内存分配机制也带来了不同的访问机制

1)在JavaScript中是不允许直接访问保存在堆内存中的队象的,所以在访问一个对象时,首先得到的是这个队象在堆内存中的地址,然后再按照这个地址去获得这个队象中的值,这解释传说中的按引用访问
这里sign一下,下一章内容:JS是按值传递还是按引用传递?
2) 而原始类型的值则是可以直接访问到的

c. 复制变量时的不同

1)原始值:再将一个保存着原始值得变量复制给另一个变量时,会将原始值得副本赋值给新的变量此后这两个变量是完全独立的,他们只是拥有相同的value而已
2) 引用值:在将一个保存着队象内存地址的变量复制给另一个变量时,他会把这个内存地址赋值给新变量,
也就是说这两个变量都指向了堆内存中的同一个队象,他们任何一个作出的改变都会反映在另一个身上。
(这里要理解的一点就是,复制队象时并不会在堆内存中生成一个一模一样的队象,只是多了一个保存指向这个队象的指针的变量罢了)。多了一个指针

d.参数传递的不同(把实参复制给形参的过程)

首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。
但是为什么涉及到原始类型与引用类型的时仍然有区别呢?还不就是因为内存分配时的差别。
1)原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
2)引用值:队象变量它里面的值是这个队象在堆内存中的内存地址,这一点你要时刻铭记在心!
因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为他们都指向同一个队象。

下篇文章:JS是按值传递还是按引用传递?还有总结d的参数传递不同

泪水和汗水的化学成分相似,但前者只能为你换来同情,后者却可以为你赢的成功,我是前端X先生,让我们一起学习进步! 共 勉 !
JS 数据类型的访问方式是什么?_第3张图片
微信.png

你可能感兴趣的:(JS 数据类型的访问方式是什么?)