前言:再次翻阅JS高程(第3版)过程当中,看到了“基本包装类型”,趁热留下此文,对JS的数据类型作个较为深刻的小结(2018-10-19)。json
虽然JS与其余强类型语言不同,声明中无需预设数据类型,可是JS也是有数据类型区分的。函数
基本数据类型(存储值):Undefined、Null、Boolean、Number、String引用类型(存储地址指针):对象测试
基本包装类型(临时性质的引用类型):alert("hello world!".split(" ").length); //2指针
基本数据类型
基本数据类型一般经过字面量进行赋值,基本数据类型变量存储的是具体的值:code
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也会跟着“改变”。string
基本包装类型
基本数据类型只是一个简单的,存储值的变量,它不是对象,它并无任何的方法。可是咱们却能够把它当成对象同样使用:it
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并无这个属性。io
【基本数据类型】和【引用类型】做方法入参时的差别
一般,在函数调用时,若是入参为【基本数据类型】时,函数的参数将以“值传递”的方式传递。此时修改函数内接收该值的局部变量,并不会对函数外的变量产生影响:
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!"; }