欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript中的基本类型值和引用类型值区别

程序员文章站 2022-05-06 09:09:25
...
ECMAScript变量可包含两种不同数据类型的值:**基本类型值和引用类型值.**
    基本类型值指的是简单的数据段,引用类型值指的是那些可能有多个值构成的对象.5中基本数据类型有Number,Boolean,String,Undefined,Null,这五种基本数据类型是按值访问的,因为可以操作存储在变量中的实际的值..与其它语言不同,Javascript不允许直接访问内存中的位置,即不能直接操作对象的内存空间.在操作对象时实际上是在操作对象的引用而不是实际的对象.因此,引用类型的值是按引用访问的.
    定义基本类型值和引用类型值的方式类似:创建一个变量并为该变量赋值.但当值保存到变量中后,对不同类型值可以执行的操作则大相径庭.对于引用类型值,可以为其添加属性和方法,也可以改变和删除其属性和方法.
    例子:
     var person=new Object();
        person.name="Nicholas";
        alert(person.name);//"Nicholas"

以上代码我们创建了一个对象并将其保存在理变量person中,然后我们为该对象添加了一个名为name的属性,并将字符串“Nicholas”赋给了这个属性。之后通过alert()函数访问了这个新属性。如果对象不被销毁或者这个属性不被删除,则这个属性会一直存在。但我们不能给基本类型的值添加属性,尽管这样不会导致任何错误,例如

 var name="wyuif";
   name.age=27;
   alert(name.age);//undefined

复制变量值:
对于基本类型值:会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置,eg
var num1=5;
var num2=num1;
在此,num1中保存的值是5,当使用num1初始化num2时,num2也保存了5,但num1与num2中的5是完全独立的,该值只是num1中5的一个副本。此后这两个变量可以参与任何操作而互不影响。如下图所示JavaScript中的基本类型值和引用类型值区别
对于引用类型的值:同样将存储在变量对象中的值复制一份放到为新变量分配的空间中,不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此改变其中一个变量,就会影响另一个变量。例如

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

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

ECMAScript中的所有函数的参数都是按值传递的。即把函数外部的值赋给函数内部的数,就是把值从一个变量复制到另一个变量一样。

检测类型用typeof操作符。typeof操作符是确定一个变量是字符串、数字、布尔值、undefined的最佳工具。如果变量的值是一个对象或者null,则typeof操作符会返回“object”。
若想知道某个值是什么类型的对象,使用instanceof操作符,语法如下:

result=variable instanceof constructor

若变量是给定引用类型的实例(根据他的原型链来识别),则instanceof操作符会返回true。

alert(person instanceof Object);//变量person是Object吗?
alert(colors instanceof Array);//变量colors是Array吗?
alert(pattern instanceof RegExp);//变量爬pattern是RegExp吗?

根据规定所有引用类型的值都是Object的实例。因此在检测一个引用类型值和Object构造函数时,instanceof操作符始终会返回true