详解JavaScript基本类型和引用类型

一、值的类型
       早在介绍JS的数据类型的时候就提到过基本类型和引用类型,不过在说两种类型之前,我们先来了解一下变量的值的类型。在ECMAScript中,变量可以存在两种类型的值,即原始值和引用值。
(1)原始值
       存储在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
(2)引用值
       存储在堆中的对象,也就是说,存储在变量处的值是一个指针,指向存储对象的内存处。
       为变量赋值时,ECMAScript的解释程序必须判断该值是原始类型,还是引用类型。要实现这一点,解释程序则需尝试判断该值是否为ECMAScript的基本类型之一,即Undefined类型、Null类型、Boolean类型、Number类型和String类型。由于这些基本类型占据的空间是固定的,所以可将他们存储在较小的内存区域 - 栈中。这样存储便于迅速查寻变量的值。
       在许多语言中,字符串都被看作引用类型,而非基本类型,因为字符串的长度是可变的。ECMAScript打破了这一
传统。
       如果一个值是引用类型的,那么它的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。如下图所示:

详解JavaScript基本类型和引用类型

二、基本类型
       ECMAScript有5种基本类型,即Undefined类型、Null类型、Boolean类型、Number类型和String类型。ECMA-262把术语类型定义为值的一个集合,每种基本类型定义了它包含的值的范围及其字面量表示形式。
       ECMAScript提供了typeof运算符来判断一个值是否在某种类型的范围内。可以用这种运算符判断一个值是否表示一种基本类型:如果它是基本类型,还可以判断它表示哪种基本类型。
       基本数据类型和操作符typeof我们在前面的博文中也经常使用到。详细了解的话可以参考这篇文章:详解JavaScript的变量和数据类型

三、类型转换
       所有程序设计语言最重要的特征之一是具有进行类型转换的能力。ECMAScript给开发者提供了大量简单的类型转换方法。大部分类型具有进行简单转换的方法,还有几个全局方法可以用于更复杂的转换。无论哪种情况,在ECMAScript中,类型转换都是简短的一步操作。
(1)转换成字符串
       ECMAScript的Boolean值、数字和字符串的原始值的有趣之处在于它们是伪对象,这意味着它们实际上具有属性和方法。
例如,要获得字符串的长度,可以采用下面的代码:

var sbox = "red"; document.write(sbox.length);//输出3

尽管 "red" 是基本类型的字符串,它仍然具有属性length,用于存放字符串的大小。总而言之,3 种主要的原始类型Boolean 值、数字和字符串都有 toString() 方法,可以把它们的值转换成字符串。您也许会问,“字符串还有toString()方法吗,这不是多余吗?”是的,的确如此,不过ECMAScript定义所有对象都有toString()方法,无论它是伪对象,还是真对象。因为String类型属于伪对象,所以它一定有toString()方法。
1)Boolean 类型的toString()方法只是输出 "true" 或 "false",结果由变量的值决定:

var bage=false; document.write(bage.toString());//输出"false"

2)Number类型的toString()方法比较特殊,它有两种模式,即默认模式和基模式。采用默认模式,toString()方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学计数法),在默认模式中,无论最初采用什么表示法声明数字,Number 类型的 toString() 方法返回的都是数字的十进制表示。因此,以八进制或十六进制字面量形式声明的数字输出的都是十进制形式的。如下所示:

var iNum1 = 10; var iNum2 = 10.0; document.write(iNum1.toString());//输出 "10" document.write(iNum2.toString());//输出 "10"

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgzwzw.html