javascript 引用变量-JS基础笔记:JS中变量的区别(基本类型和引用类型的区别)和传递参数的区别

变量原始类型引用类型

原始类型:指简单的数据段

基本数据类型:Undefined、Null、Boolean、Number 和 String(5 种基本数据类型)

引用类型:指的是可能有多个值的对象

引用类型的值是存储在显存中的对象。 与其他语言不同的是,JavaScript 不允许直接访问显存中的位置,也就是说,它不能直接操作对象的显存空间。操作对象时,实际上是操作对象的引用而不是实际的对象。 object,因此,引用类型的值是通过引用来访问的

基本类型和引用类型的区别①动态属性

对于引用类型的的值,我们可以为其添加属性和方法,也可以改变和删除去属性方方法,如下所示
var person = new Object(); 
person.name = "Nicholas"; 
alert(person.name); //"Nicholas"   为对象添加了一个name的属性并赋值为"Nicholas"

对于基本类型的值,我们为其赋值属性则输出的结果是undefind
var name = "Nicholas"; 
name.age = 27; 
alert(name.age); //undefined

复制变量值

基本类型复制值:在变量对象上创建一个新值,然后将该值复制到为新变量分配的位置

var num1 = 5; 
var num2 = num1; 

这里,num1中存储的值为5。当用num1的值初始化num2时,num2中也存储值5。 但num2中的5与num1中的5完全独立,其值只是num1中5的副本。后续,这两个变量可以参与任何操作而不会互相影响

复制引用类型的值:将引用类型的值从一个变量复制到另一个变量时,变量对象中存储的值的副本也会放置在为新变量分配的空间中。 不同的是,这个值的副本实际上是一个指针,这个指针指向堆中存储的一个对象。 复制操作结束后,两个变量实际上都会引用同一个对象。因此,更改其中一个变量将影响另一个变量

var obj1 = new Object(); 
var obj2 = obj1; 
obj1.name = "Nicholas"; 
alert(obj2.name); //"Nicholas"

首先,变量 obj1 保存该对象的一个​​新实例。 然后,将该值复制到 obj2 中; 换句话说,obj1和obj2都指向同一个对象。 这样,当obj1添加name属性后,就可以通过obj2访问这个属性了,因为这两个变量引用的是同一个对象。

变量引用是什么_javascript 引用变量_变量引用错误

③传递参数

ECMAScript中的所有函数参数都是按值传递的

也就是说,将函数外部的值复制到函数内部的参数与将值从一个变量复制到另一个变量是一样的。基本类型值的传递类似于基本类型变量的复制,而引用的传递类型值就像引用类型变量的复制

当将基本类型的值传递给参数时,传递的值将被复制到局部变量(即命名参数,或者在 ECMAScript 的概念中,arguments 对象中的一个元素)arguments 表示参数的集合

当向参数传递引用类型的值时,该值在显存中的地址会被复制到一个局部变量中,因此这个局部变量的变化会反映在函数外部

传递参数相当于传入基本类型和引用类型的值的复制值。 基本类型被传递到复制的基本类型的变量中。 函数内改变参数不会影响原来的变量,传入的引用类型是引用类型的指针javascript 引用变量,改变函数内部的参数会影响参数外部引用类型的值

基本类型参​​数传递示例:

function addTen(num) { 		
 num += 10; 
 return num; 
}
var count = 20; 		
var result = addTen(count);  	
alert(count);	 //20,没有变化
alert(result); //30

这里的函数addTen()有一个参数num,该参数实际上是函数的局部变量。 调用该函数时,变量count作为参数传递给该函数,该变量的值为20。因此,值20被复制到参数num中,以便在addTen()中使用。 在函数内部,参数num的值增加10,但这个变化不会影响函数外部的count变量。 参数num和变量count彼此没有关系,只是具有相同的值。如果num是通过引用传递的,则变量count的值也会更改为30,从而反映函数内部的变化

通过引用类型传递参数的示例:

function setName(obj) { 
 obj.name = "Nicholas"; 
} 
var person = new Object(); 
setName(person); 
alert(person.name); //"Nicholas"

上面的代码创建了一个对象,并将其存储在变量 person 中。 然后,该变量被传递给 setName() 函数后被复制到 obj 中。 在这个函数中,obj 和 person 引用同一个对象。 换句话说,虽然这个变量是按值传递的,但 obj 也会通过引用访问同一个对象。 因此,当函数内部的obj添加name属性时,函数外部的person也会被体现出来; 因为堆内存中只有一个person指向的对象,而且是一个全局对象。很多开发者错误地认为:在局部作用域中改变的对象会在全局作用域中得到反映javascript 引用变量,也就是说参数是通过参考

function setName(obj) { 
 obj.name = "Nicholas"; 
 obj = new Object(); 
 obj.name = "Greg"; 
} 
var person = new Object(); 
setName(person); 
alert(person.name); //"Nicholas"

这个例子和前面的反例唯一的区别是在setName()函数中添加了两行代码:一行代码为obj重新定义了一个对象,另一行代码为obj定义了一个不同值的name属性。目的。 将 person 传递给 setName() 后,其 name 属性设置为“Nicholas”。 然后,将一个新对象分配给变量 obj,并将其 name 属性设置为“Greg”。 如果通过引用传递 person,则 person 将被手动更改为指向 name 属性值为“Greg”的新对象。 并且,当再次访问person.name时,显示的值仍然是“Nicholas”。 这意味着虽然函数内部参数的值发生了变化,但原来的引用保持不变。 事实上,当函数内部重绘obj时,这个变量引用的是一个局部对象。 而这个本地对象会在函数执行完毕后立即被销毁。也就是说,操作的是该对象的实际值。 如果你不明白这个概念,可以阅读我博客转载的《JavaScript变量访问方法(值&引用)解读》。 虽然我已经被这个问题困扰了很长时间

如果对你有帮助,可以给我点个赞支持一下,虽然整理起来不容易,谢谢! !