JS面试: 基本数据类型与引用类型间的使用区别
因为JavaScript变量是松散类型,这就决定了它只是在特定时间用于保存特定值得一个名字而已,所以在运行期间对基本数据类型和引用类型的变量使用时要注意,因为这是面试时长问道的地方,鉴于此,小编把相关知识点收集整理如下,以供参考
问:基本类型和引用类型的值及使用有什么区别?
此处主要考察ECMAScript变量包含的两种不同数据类型的值:
- 基本类型值, 指的是简单的数据段
- 引用类型值, 指的是那些可能由多个值构成的对象
解析过程有什么不同?
答:将一个值赋给变量时,解析器必须确定这个值是基本类型值(Undefined,Null,Boolean,String,Number),还是引用类型值。
基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值
引用类型的值是保存在内存中的对象,与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是操作对象的引用而不是实际的对象,为此,引用类型的值是按引用访问的。
注意JS中,S股他ring不是引用类型
问:基本类型与引用类型对动态属性的支持的区别有哪些?
答:定义基本类型值和引用类型值的方式是类似的:创建一个变量并为该变量赋值
当这个值保存到变量之后,对不同类型值可以执行的操作则大相径庭。对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法,例如:
var person = new Object();
person.name = "Jack";
console.log(person.name); // "Jack"
以上代码创建了一个对象并将其保存在了变量person中。
我们不能给基本类型的值添加属性,尽管这样做不会导致任何错误(严格模式下会报错)
var name = "Jack";
name.age = 27;
console.log(name.age); // undefined
通过上述例子,表明只能给引用类型值动态地添加属性
问:基本数据类型与引用数据类型在复制变量值及内存分配上的区别?
答:除保存方式不同外(一个在栈内存,一个在堆内存),在从一个变量复制基本类型值和引用类型值时,也存在着不同
另外在复制基本类型值时,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上,如下示例:
var num1 = 5;
var num2 = num1;
在此,num1中保存的值是5.当使用num1的值来初始化num2时,num2中也保存了值5,但两者中的5是完全独立的,num2中的值只是num1中5的一个副本。此后两个变量参与的任何操作都不会相互影响。

除此,当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象
复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量。
示例:
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Jack";
console.log(obj2.name); // "Jack"
首先,变量obj1保存了一个对象的新实例的引用
然后,这个值被复制到了obj2中,这样两者都指向同一对象
当为obj1天假name属性后,就可以通过obj2来访问这个属性了,因为两者指向同一对象。

问:基本数据类型与引用数据类型作为参数传递上的区别?
此处主要考察ECMAScript中所有函数的参数都是按值传递的原理!
答:ECMAScript中所有函数的参数都是按值传递,也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
在向参数传递基本类型值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScripot的概念来说,就是arguments对象中的一个元素)
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反应在函数的外部。
示例:
function setName(obj){
obj.name = "Jack";
}
var person = new Object();
setName(person);
console.log(person.name); //"Jack"
以上代码创建了一个对象,并将其引用保存在了变量person中,然后这个变量被传递到了setName()函数中之后就被复制给了obj。
在这个函数内部,obj和person引用的是同一个对象,于是在函数内部为obj添加name属性后,函数外部的person也将有所反应,因为person指向的对象在堆内存中只有一个
问: 基础数据类型与引用数据类型在使用检测类型符号上返回结果的区别?
主要考察typeof操作符与instanceof操作符在使用时的区别。
答案如下:
使用instanceof操作符来检测引用类型值。
使用typeof操作符来检测基本数据类型。
注意事项
知道就说知道,不知道就说不知道,技术讲究严谨, 切记无说八道!
文章标题和内容改的不精练了,原因是不停的审核不过