java中包装类与引用类型,JS中,基本数据类型、引用类型与基本包装类型

前言:再次翻阅JS高程(第3版)过程中,看到了“基本包装类型”,趁热留下此文,对JS的数据类型做个较为深入的小结(2018-10-19)。

虽然JS与其他强类型语言不一样,声明中无需预设数据类型,但是JS也是有数据类型区分的。

基本数据类型(存储值):Undefined、Null、Boolean、Number、String

引用类型(存储地址指针):对象

基本包装类型(临时性质的引用类型):alert("hello world!".split(" ").length); //2

基本数据类型

基本数据类型通常通过字面量进行赋值,基本数据类型变量存储的是具体的值:

var strA = "stringA";

var strB = strA;

alert(strB); //stringA

strB = "stringB";

alert(strB); //stringB

将strA的赋值给strB,实际上只是将strA的值("stringA")赋值给变量strB。赋值完成,strA和strB并无任何关联关系,此时修改strB的值,strA不会有任何的影响。

引用类型

引用类型存储的值为地址指针。解释器会在内存堆中创建一个实际的对象,然后将该对象的地址赋值给变量。引用变量之间的赋值,实际上是指针赋值:

var jsonA = {"val":"stringA"};

var jsonB = jsonA;

alert(jsonB.val); // stringA

jsonB.val = "stringB";

alert(jsonA.val); // stringB

对象jsonA创建后,它保存的并不是具体的json对象,而是指向这个对象地址的指针。此时,将jsonA的值赋值给jsonB,只是将其保存的地址指针赋值给jsonB。赋值完成后,jsonA和jsonB同时指向内存中的同一个对象。当通过jsonB进行操作该对象,A也会跟着“改变”。

基本包装类型

基本数据类型只是一个简单的,存储值的变量,它不是对象,它并没有任何的方法。但是我们却可以把它当成对象一样使用:

var strA = "Hello-World!";

alert(strA.split("-").length); //2

alert(typeof strA); //string

strA.color = "yellow";

alert(strA.color); //undefined

var strB = new String("Hello-World!");

alert(strB.split("-").length); //2

alert(typeof strB); //object

strB.color = "red";

alert(strB.color); //red

var strC = strB;

strC.color = "blue";

alert(strB.color); //red

原因在于,当我们调用“基本数据类型”变量的方法时,后台为我们将变量包装成对应类型的临时对象,然后完成我们的调用方法并返回,然后销毁这个临时对象。例子中,strA属于基本类型对象。我们用typeof检测时返回了“string”。我们却可以直接调用该变量的split和length方法。我们将次变量当作对象一样,对属性“color”进行赋值,此时并不会报错。但是当我们去使用这个属性时,却提示了“ undefined”,这是是因为strA并没有这个属性。

【基本数据类型】和【引用类型】作方法入参时的差异

通常,在函数调用时,如果入参为【基本数据类型】时,函数的参数将以“值传递”的方式传递。此时修改函数内接收该值的局部变量,并不会对函数外的变量产生影响:

var strA = "out Function!";

changeStrVal(strA);

alert(strA); //out Function!

function changeStrVal(paraStr){

var strB = paraStr;

strB = "in Function!";

}

但是,如果入参为独享,即【引用类型】,则函数内的局部变量和函数外的变量均指向同一块内存地址。测试修改函数局部变量的属性,函数外变量属性也会随之而变:

var objA = {"val":"out Function!"};

changeObjVal(objA);

alert(objA.val); //in Function!

function changeObjVal(paraObj){

var objB = paraObj;

objB.val = "in Function!";

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值