JavaScript数据类型----原始类型与引用类型(object)详谈

发布时间:2019-08-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了JavaScript数据类型----原始类型与引用类型(object)详谈脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

JavaScript中,有七种内置类型:6种原始类型和引用类型,他们分别是:

6种原始类型(基本类型):

  • 空值(null
  • 未定义(undefined)
  • 布尔值(boolean
  • 数字(number)
  • 字符串(string)
  • 符号(symbol,ES6中新增)

引用类型:

  • 对象(object)

类型判断

我们可以用typeof运算符来查看类型的值:

tyPEof(undefined)        //"undefined"
typeof('123')            //"string"
typeof(123)              //"number"
typeof(true)             //"boolean"
typeof Symbol()          //"symbol"
typeof({name:'oops'})    //"object"
typeof([1,2,3])          //"object"

我们注意到,null值并不在列,为什么呢?这里比较特殊:

typeof(null)              //"object" ,  这是js中的一个bug

我们应该使用正确的方法来判断null值的类型:

VAR a = null;
(!a && typeof a ==='object')  //true

现在让我们来看另一个问题:什么是undefined
答案是:变量在未持有值时,变量的类型为undefined
为什么我会在这里会单独提出这个问题?因为很多开发人员把undefined等同于undeclared(未声明),这是一个观念性的错误。已在作用域中声明的变量但未赋值的,称为undefined;相反,还未在作用域中声明的变量,称为undeclared(未声明)。
举个栗子:

var a;
a;   //undefined
c;   //Uncaught ReferenceError: c is not defined

是不是忽然明白了这两者的差别,BUT!!,请看这个栗子:

var a;
typeof a;     //"undefined"
typeof b;     //"undefined"  

奇怪,变量b未在作用域中声明,为什么不报错且typeof的值怎么还是undefined?那是因为typeof的一种特殊的安全机制利用这点,当我们用if条件语句判断某个变量是否有值时,可以用这种方法。举个栗子:

//变量a未声明,以下方式会报错
if(a){
  ...
}

//变量a未声明,以下方式就是安全的
if( typeof a !== "undefined"){
   ...
}

so ,通过typeof检查undeclared变量是个不错的方法。

基本类型(原始类型)

js中有六种基本类型,他们是:UndefinedNullBooleanNumberStringSymbol (new in ES 6),基本类型的储存方式为栈内存(Stack)储存,下图所示。

JavaScript数据类型----原始类型与引用类型(object)详谈

由此得出以下三点结论;

  1. 基本类型的值是不可变的
  2. 基本类型的比较是它们的值的比较
  3. 基本类型的变量是存放在栈内存(Stack)里的

举个栗子:

var a = "oops";
b = a;
b;               //"oops"
a = "哈哈";
a;               //"哈哈"
b;               //"oops" ,a值的改变不会影响b的值

引用类型

我们先来一个栗子看看引用类型是如何在计算机内存储的:

var a ={};
var b;
a.name = "oops";
a.age = 24;
b = a;
console.LOG( b.age );      //24
a.name = "hz";
b.age = 18;
console.log( a.age )       //18

JavaScript数据类型----原始类型与引用类型(object)详谈

从这个例子中可以看出,引用类型的值是保存在堆内存(Heap)中的对象,栈内存保存变量的指针,堆内存中保存具体的对象。

做个小小的延伸:

var a ={name:"hz"};
var b ={name:"hz"};

console.log( a == b );     //false
console.log( a === b );    //false

在这个栗子中,a,b两个对象都有一条相同的值,但这两个对象却不相等,为什么呢?因为
a ,b 两个对象分别引用的是存放在堆内存中的2个不同的对象,故变量 a和 b的值(引用地址)也是不一样的。

以上。
有错误的地方希望大家指出来,共同探讨。

参考资料:
文章 JavaScript 深入了解基本类型和引用类型的值
书籍 你不知道的javascript(中卷) 第一章:类型

脚本宝典总结

以上是脚本宝典为你收集整理的JavaScript数据类型----原始类型与引用类型(object)详谈全部内容,希望文章能够帮你解决JavaScript数据类型----原始类型与引用类型(object)详谈所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。