资讯专栏INFORMATION COLUMN

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

Tychio / 2901人阅读

摘要:例子中,属于基本类型对象。基本数据类型和引用类型作方法入参时的差异通常,在函数调用时,如果入参为基本数据类型时,函数的参数将以值传递的方式传递。

前言:再次翻阅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!";         
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98511.html

相关文章

  • js基本类型引用类型包装类型

    摘要:每当读取这个基本类型时,后台会创建一个对应的基本包装类型的对象。类型判断主要是用来判断基本数据类型返回类型新增所以只能用来判断基本数据类型。引用类型基本包装类型都会返回。 最近重温JS高程设计以及与朋友的讨论。决定趁热打铁记录JS的各种类型,并做下深入总结。 js的几种类型 基本类型:Boolean、String、Number、Null、Undefined 引用类型: 2.1 O...

    liangzai_cool 评论0 收藏0
  • js 数据类型

    摘要:来自你不知道的对未初始化和未声明的变量执行操作符都返回了值类型是第二个只有一个值的数据类型,这个特殊的值是。 基本类型 主要有:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、Symbol undefined 在使用 var,let,const 声明变量但未对其加以初始化时,这个变量的值就是undefined 注意点: ...

    Jensen 评论0 收藏0
  • 你还认为JS万物皆对象?

    摘要:这也解答了我曾经的一个疑问同样的道理,在调用属性的瞬间,也是使用先来实例化一个对象,所以那一瞬间他们的构造函数以及原型对象是相同的,但也仅仅是那一瞬间。 经常在国内的各大网站博客上看到一句话,叫做JS中万物皆对象,那是否真是如此? 那么,我们先来捋一捋JS中的数据类型,JS中的数据类型有下面几种 Undefined Null Boolean Number String Symbol ...

    levinit 评论0 收藏0
  • 基本数据类型引用类型的区别详解

    摘要:前两天看到大神的关于基本数据类型和引用类型的区别的文章觉得写得非常不错,就想着在其基础上加上自己平时看到的一些知识点和理解,所以就有了以下的文章基本数据类型基本数据类型包括基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值基 前两天看到kraaas大神的关于基本数据类型和引用类型的区别的文章觉得写得非常不错,就想着在其基础上加上自己平时看到的一些知识点和理解,所以就有了...

    CoffeX 评论0 收藏0
  • JS数据类型、内置对象、包装类型对象、typeof关系

    摘要:平时在复习基础知识时,经常会遇到数据类型基础数据类型内置对象包装类型对象,检测数据类型时,用到的值,感觉都差不多,但是又有差异。值与数据类型关系对比下图,即可知值相较于基础数据类型少多 平时在复习JS基础知识时,经常会遇到JS数据类型、基础数据类型、内置对象、包装类型对象,检测数据类型时,用到的typeof值,感觉都差不多,但是又有差异。今天特地整理下,方便理解。 JS数据类型 基础数...

    OldPanda 评论0 收藏0

发表评论

0条评论

Tychio

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<