JS中有哪些基本类型和引用类型?有什么区别?

1.背景介绍

ECMAScript与JavaScript的区别

ECMAScript:由ECMA-262制定的标准,用于实现通用的脚本语言。ECMAScript提供了脚本语言需要遵守的规则、细节和规范。

JavaScript:通用脚本编程语言,它遵循了ECMAScript标准。

换句话说,JavaScript是ECMAScript的方言。

通过阅读ECMAScript标准,你可以学会怎样实现一个脚本语言;而通过阅读JavaScript文档,你可以学会怎样使用脚本语言编程。

基本类型介绍

基本类型值指的是简单的数据段,ECMAScript中有5种基本数据类型(也成为基本类型):

Undefined、Null、Boolean、Number、String。

引用类型介绍

在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但着称呼并不妥当。引用类型有时候也被称为对象定义,因为他们描述的是一类对象所具有的属性和方法。

引用类型有:Object类型,Array类型,Date类型,RegExp类型(正则),function类型。还有基本包装类型,也是一种引用类型,ECMAScript还提供了 3个特殊的引用类型:Boolean、Number和String。


2.知识剖析

基本类型

ECMAScript基本数据类型:Undefined、Null、Boolean、Number、String。

Undefined

Undefined:只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。这个值表示变量不含有值,可以通过将变量的值设置为null 来清空变量。

Null

Null:第二个只有一个值的数据类型,null值表示一个空对象指针,所以使用typeof操作符检测null值会返回"object"。

Boolean

Boolean:该类型只有两个字面值:true和false。但这两个值与数字值不是一回事,true不一定等于1,false也不一定等于0。

Number

Number:该类型使用IEEE754格式来表示整数和浮点数值。特殊数值:NaN,表示一个本来要返回数值的操作数未返回数值的情况。

1.任何涉及NaN的操作都会返回NaN。

2.NaN与任何值都不相等,包括本身。比如:NaN == NaN,返回的布尔值是false;

 String

String:用于表示由零或者多个16位Unicode字符组成的字符序列,即字符串。字符串由双引号(" ")或单引号(' ')表示。

引用类型

ECMAScript引用类型:Object类型,Array类型,Date类型,RegExp类型,function类型。还有基本包装类型,也是一种引用类型:Boolean、Number、String。

Object类型:对创建对象的函数的引用。

Array类型:数组的处理。

Date类型:处理日期的。

RegExp类型:正则表达式的相关操作。

function类型:函数类型在JavaScript中也是对象。   

Boolean:和布尔值对应的引用类型。可以创建boolean对象。

Number:和基本数据类型的数值对应的引用类型。可以创建对象和调用本身的方法。  

String:字符串对象的引用类型。


3.常见问题

基本类型和引用类型有什么区别?


4.解决方案

1.声明变量时不同的内存分配(涉及堆和栈的问题)

2.不同的内存分配机制也带来了不同的访问机制

3.复制变量时的不同

4.参数传递的不同


5.代码实战

代码分割太多可以参考PPT


6.拓展思考

什么是按值传递和按引用传递?

按值传递:指的是在方法调用时,传递的参数是按值的拷贝传递。

按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。

按引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。

按引用传递的重要特点

传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。



7.参考文献

参考一:JavaScript高级程序设计

参考二:JavaScript数据类型

参考三:ECMAScript引用类型


8.更多讨论

1.基本类型的复制和引用类型的复制有什么区别?

基本类型:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已。

JS中有哪些基本类型和引用类型?有什么区别?

引用类型:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,

也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。

JS中有哪些基本类型和引用类型?有什么区别?

2.字符串转成number用哪种方式好?

转换函数:

js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行,对其他类型返回的都是NaN

parseInt() 函数

可解析一个字符串,并返回一个整数。

parseInt(string, radix)

radix 可选。表示要解析的数字的基数(进制)。该值介于 2 ~ 36 之间。

如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。

如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

返回值:返回解析后的数字。

如果字符串的第一个字符不能被转换为数字,那么 parseFloat() 会返回 NaN

如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。

如果 string 以 0 开头,那么允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。

如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基数是由parseInt()方法的第二个参数指定的

 如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。

 parseFloat() 函数可解析一个字符串,并返回一个浮点数。

该函数判断字符串中的首个字符是否是数字,如果是,则对字符串进行解析,然后以数字返回该数字,而不是作为字符串。

如果参数字符串的第一个字符不能被解析成为数字,则 parseFloat 返回 NaN。

可以通过调用 isNaN 函数来判断 parseFloat 的返回结果是否是 NaN。

开头和结尾的空格是允许的。

如果只想解析数字的整数部分,请使用 parseInt() 方法。

 parseFloat()方法与parseInt()方法相似,不同之处在于,parseFloat必须以十进制形式表示浮点数。

参考:http://blog.csdn.net/ShaLiWa/article/details/53282910

3.数组类型属于哪种类型?

var a = []; console.log(typeof a); //object

数组 array 通过typeof 返回的是object,是引用类型。它有自己的一写属性和方法。