手机版

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

时间:2021-09-20 来源:互联网 编辑:宝哥软件园 浏览:

1.值类型基本类型和引用类型早在JS数据类型的介绍中就已经提到了,但是在讨论这两种类型之前,我们先来了解一下变量的值类型。在ECMAScript中,变量可以有两种类型的值,即原始值和引用值。(1)原始值存储在堆栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。(2)引用其值存储在堆中的对象,即存储在变量中的值是指向存储该对象的内存的指针。当给变量赋值时,ECMAScript的解释器必须确定该值是原始类型还是引用类型。为了实现这一点,解释器应该尝试确定该值是否是ECMAScript的基本类型之一,即Undefined、Null、Boolean、Number和String。因为这些基本类型占用固定的空间,所以它们可以存储在较小的内存区域——堆栈中。这样,可以快速搜索变量值。在许多语言中,字符串被视为引用类型而不是基本类型,因为字符串的长度是可变的。ECMAScript打破了这一传统。如果一个值是引用类型,它的存储空间将从堆中分配。由于引用值的大小会发生变化,所以不能放在堆栈上,否则会降低变量搜索的速度。相反,放在变量堆栈空间中的值是对象在堆中存储的地址。的地址大小是固定的,因此将其存储在堆栈中对可变性能没有负面影响。如下图所示:

二、基本类型ECMAScript有五种基本类型,即Undefined类型、Null类型、Boolean类型、Number类型和String类型。ECMA-262将术语类型定义为值的集合,每个基本类型定义了它包含的值的范围及其文字表示。ECMAScript提供了类型运算符来确定一个值是否在某个类型的范围内。可以用这个运算符判断一个值是否代表基本类型;如果是基本类型,还可以判断它代表哪个基本类型。的基本数据类型和运算符类型在以前的博客文章中经常使用。如果您了解更多,请参考本文:详细解释JavaScript的变量和数据类型。

类型转换所有编程语言最重要的特性之一是执行类型转换的能力。ECMAScript为开发人员提供了大量简单的类型转换方法。大多数类型都有简单转换的方法,一些全局方法可以用于更复杂的转换。无论如何,在ECMAScript中,类型转换是一个简短的一步操作。(1)字符串的布尔值、数字和原始值转换成字符串ECMAScript有趣的是,它们是伪对象,这意味着它们实际上有属性和方法。例如,要获取字符串的长度,可以使用以下代码:

var sbox=' reddocument . write(sbox . length);//输出3虽然“红色”是字符串的基本类型,但它仍然有属性长度,用于存储字符串的大小。综上所述,三种主要的基元类型布尔值、数字和字符串都有toString()方法,可以将它们的值转换为字符串。你可能会问,“字符串有toString()方法吗?这不是多余的吗?”是的,这是真的,但是ECMAScript定义所有对象都有toString()方法,不管它们是假对象还是真对象。因为字符串类型是伪对象,所以它必须有一个toString()方法。1)1)布尔类型的toString()方法只输出“真”或“假”,结果由变量的值决定:

var bage=falsedocument . write(bage . tostring());//输出‘false’2)number类型的toString()方法比较特殊,它有两种模式,即默认模式和基模式。在默认模式下,toString()方法仅使用相应的字符串来输出数字值(无论是整数、浮点数还是科学计数方法)。在默认模式下,数字类型的toString()方法返回数字的十进制表示形式,而不管最初用什么符号来声明数字。因此,所有以八进制或十六进制文字形式声明的数字输出都是十进制形式。如下图所示:

var iNum1=10var iNum2=10.0document . write(Inum1 . tostring());//输出' 10 ' document . write(inum 2 . tostring());//输出‘10’采用Number类型的toString()方法的基数模式,可以输出不同基数的数字,比如二进制基数为2,八进制基数为8,十六进制基数为16。这只是基数的另一个加法,基数被转换成基数,基数是toString()方法的参数:

var iNum=10document . write(Inum . ToString(2));//输出' 1010 ' document . write(inum . tostring(8));//output ' 12 ' document . write(inum . tostring(16));//输出‘a’(2)转换为数字ECMAScript提供了两种将非数字原值转换为数字的方法,即parseInt()和parseFloat()。前者将值转换成整数,而后者将值转换成浮点数。只有在字符串类型上调用这些方法时,它们才能正确运行;对于其他类型,返回NaN。1)parsent()parsent()和parseFloat()在判断字符串是否为数值之前,会仔细分析字符串。ParseInt()方法首先查看位置0处的字符,并判断它是否为有效数字。否则,该方法将返回NaN,并且不会继续执行其他操作。但是,如果字符是有效的数字,该方法将查看位置1的字符并执行相同的测试。这个过程将继续,直到找到一个不是有效数字的字符,此时parseInt()会将该字符之前的字符串转换为数字。例如,如果您想将字符串“12345red”转换为整数,parseInt()将返回12345,因为当它检查字符r时,它将停止检测过程。字符串中包含的文字数字将被正确转换为数字,例如,“0xA”将被正确转换为数字10。但是,字符串“22.5”将被转换为22,因为小数点对于整数是无效字符。

var inum 1=parsent(' 12345 red ');var inum 2=parseInt('0xA ');var inum 3=parsent(' 56.9 ');var iNum4=parseInt('红色');document . write(' inum 1=' inum 1 ');//返回12345 document . write(' inum 2=' inum 2 ');//返回10 document . write(' inum 3=' inum 3 ');//返回56 document . write(' inum 3=' inum 4 ');NaN parseInt()方法也有基本模式,可以将二进制、八进制、十六进制或任何其他二进制字符串转换为整数。该基由parseInt()方法的第二个参数指定。

var in m1=parsent(' AF ',16);var inum 2=parsent(' 10 ',2);var inum 3=parsent(' 10 ',8);var in M4=parseInt(' 10 ',10);document . write(' inum 1=' inum 1 ');//返回175 document . write(' inum 2=' inum 2 ');//返回2 document . write(' inum 3=' inum 3 ');//返回8 document . write(' inum 4=' inum 4 ');//返回10 ^ 2)parseFloat()方法parseFloat()方法类似于parseInt()方法,从位置0开始查看每个字符,直到找到第一个无效字符,然后将该字符之前的字符串转换为整数。但是,对于此方法,第一个小数点是有效字符。如果有两个小数点,第二个小数点将被视为无效。ParseFloat()将小数点前的字符转换为数字。这意味着字符串“11.22.33”将被解析为11.22。使用parseFloat()方法的另一个区别是字符串必须以十进制形式表示浮点数,而不是八进制或十六进制。此方法忽略前导零,因此八进制数0102将解析为102。对于十六进制0xA,此方法将返回NaN,因为x不是浮点数中的有效字符。此外,parseFloat()方法没有基本架构。以下是使用parseFloat()方法的一些示例:

var fNum1=parseFloat(' 12345 red ');var fNum2=parseFloat('0xA ');var fNum3=parseFloat(' 11.2 ');var fNum4=parseFloat(' 11 . 22 . 33 ');var fNum5=parseFloat(' 0102 ');var fNum6=parseFloat('红色');document . write(' inum 1=' inum 1 ');//返回12345 document . write(' inum 2=' inum 2 ');//返回nandocument . write(' inum 3=' inum 3 ');//返回11.2 document . write(' inum 4=' inum 4 ');//返回11.22 document . write(' inum 5=' inum 5 ');//返回102 document . write(' inum 6=' inum 6 ');//返回NaN (3)强制类型转换。强制类型转换用于处理转换值的类型。使用强制转换来访问特定的值,即使它是另一种类型。ECMAScript中提供的三种强制类型如下:

1)布尔值(value)-将给定的值转换为布尔值;2)Number(值)-将给定值转换为数字(可以是整数或浮点数);3)String(值)-将给定值转换为字符串;这些应该很好理解,并且在学习高级编程语言时可以经常使用。4.引用类型引用类型通常被称为类,也就是说,当遇到引用值时,对象被处理。传统上,ECMAScript并没有真正的类。事实上,“类”这个词在ECMA-262中根本没有出现,除了没有类。ECMAScript定义了“对象定义”,在逻辑上等同于其他编程语言中的类。关于JS对象的详细解释也可以在之前的博文中找到。参考:轻松学习JavaScript IX: JavaScript对象和数组。让我们看一下判断引用类型的运算符实例。使用typeof运算符时,使用引用类型存储值时会出现问题。无论引用什么类型的对象,都会返回‘object’。ECMAScript引入了另一个Java操作符instanceof来解决这个问题。instanceof运算符类似于typeof运算符,用于标识正在处理的对象的类型。与typeof方法不同,instanceof方法要求开发人员明确确认对象属于特定类型。例如:

var ostringObject=new String(' hello world ');document . write(ostringobjectinstance of String);//输出‘true’这段代码询问“变量oStringObject是String对象的实例吗?”OStringObject确实是String对象的一个实例,所以结果是“真”。虽然不如typeof方法灵活,但当typeof方法返回“object”时,instanceof方法非常有用。此外,ECMAScript还包括伪对象,这是其他基本类型,在使用新的创建时也可以用作对象,例如字符串对象、布尔对象和数字对象。它们是基本类型的引用类型。了解更多关于reference: ECMAScript引用类型的信息。ECMAScript还包含许多对象、本地对象、内置对象和宿主对象。我们将在以后的面向对象的时间里了解更多关于这些的信息。五、复制变量值在变量复制中,基本类型和引用类型是不同的。基本类型复制值本身,而引用类型复制地址。让我们看看具体的例子:

var box=' Leevar box2=boxbox2=' Amy//重新赋值后,两个基本类型变量在操作时互不影响,或者保持各自的独立性文档. write(' box 2=' box 2 ' br/');document . write(' box=' box ');输出的结果是:淀粉。

var box=新对象();box.name=' Leevar box2=box//将引用地址值复制到box 2 box 2 . name=' Amy ';//重新赋值后,两种引用类型都指向同一个对象。每当名称属性改变时,它就会改变其原始值。document . write(' box 2 . name=' box 2 . name ' br/');document . write(' box . name=' box . name ');输出结果是:AmyAmy。

以上是关于JavaScript的基本类型和引用类型的详细介绍,希望对大家的学习有所帮助。

版权声明:详细讲解JavaScript基本类型和引用类型是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。