JavaScript进阶:深入理解数据类型
基本的数据类型
ECMAScript5中有5种基本数据类型:Undefined、Null、Number、String、Boolean,ECMAScript6中新增了symbol。另外还有一种复杂数据类型——Object,它的本质是由一组无序的名值对组成的。
typeof操作符
鉴于ES是弱类型,或者说是松散类型的,因此需要一种手段检测给定变量的类型。typeof因此而生。
语法:typeof 【变量】。这里要注意的是typeof是一个操作符而非函数
其返回值可为:
(1)undefined——这个值为undefined本身或者未定义。如typeof undefined或者如代码:
var a;//a未赋值
typeof a;
(2)number——这个值为数字。
(3)string——这个值为字符串。
(4)boolean——这个值为布尔值。
(5)object——这个值为对象或null。
(6)function——这个值为函数,事实上函数也是对象的一种,不过typeof把function“区别对待”。
理解undefined类型
undefined类型只有undefined这一特殊值。在使用var声明后的变量,在未赋值之前都默认为undefined。例如:
var apple;
console.log(typeof apple);//undefined
需要注意的是,已经定义且值为undefined的变量,和尚未定义的变量是不一样的。
var apple;
console.log(apple); //apple
console.log(orange);//报错
但是,未定义的变量使用typeof和delete是不会报错的,例如:
console.log(orange);//undefined
这里有个小技巧,即使未初始化的变量自动赋值undefined,但显式地初始化变量是更明智的选择。如果能这样做,那么当typeof操作符返回undefined时,这个变量肯定未声明,而不是未初始化。
理解Null类型
Null类只有null一个特殊值。它使用typeof操作符时,返回的是”object”,原因是null表示的是一个空指针(和C语言一样)。例如:
var apple = null;
console.log(typeof null); //object
因为undefined是null派生出来的,所以两者宽松相等。(事实上,null是位于原型链的顶端)。所以有undefined == null。
null还有管理内存的作用:需要知道一个事实,计算机系统分配给web浏览器的可用内存数量比桌面应用程序少,这样做是防止运行JavaScript的网页耗尽全部系统资源。
因此,我们需要优化内存,提高性能,而优化内存的最佳方式就是:执行中的代码只保存必要数据。一旦数据不再用可以将其设置为null来解除其引用。这一做法叫做“解除引用”。例如:
var fruit = new Object;
//使用完该对象后,并确定不再需要使用。
var fruit = null;
理解Number类型
Number类型的值为数字值。基本的数值字面量是十进制,当然还有二进制,八进制,十六进制等。
(1)十进制:var num = 1;
(2)八进制:var num = 070; //56
(3)十六进制:var num = 0xf; //15
1、浮点数值
浮点数值可有两种表示:0.1或者.1。
对于极大或者极小的值可以用e表示法(科学表示法)表示浮点数。
如var num = 0.2e5表示0.2*10^5。
ESMAScript会将小数点后面有6个0以上的浮点数,自动用e表示法表示。
2、数值范围
最小值Number.MIN_VALUE为5e-324,最大值Number.MAX_VALUE为1.7976931348623157e+308。
如果某次计算得到得结果超过JS数值的范围,那么它将被转换为Infinity,如果是负值则为-Infinity。想要确定一个数是否有穷,可以用isFinity()函数。
3、NaN
NaN,即非数值。表示一个本来要返回数值的变量未返回的情况(这样就不会报错了)。
它有两个非同寻常的特点:第一,所有涉及NaN的计算或者操作,都返回NaN;第二,NaN与任何值都不相等,包括其本身。即:NaN == NaN为错,NaN != NaN为对。
要确定一个变量是否为NaN,可以使用isNaN()函数检测。例如
isNaN(NaN); //true
isNaN(1); //false
isNaN(‘10’) //false, 数字字符串会转化为数字
isNaN(true) //false,布尔值会转化为数字
对于例子中转化的问题,再这里说一下。尽管不可思议,但isNaN()确实适用于对象,基于对象调用isNaN()时,首先调用对象的valueOf()方法,然后确定该方法返回的值是否能转化为数值。如果不能,再调用toString()方法再一次测试。
理解Boolean类型
该类型有两个值:true和false,大小写敏感。
可以对任何数据类型使用Boolean()函数转化为布尔值。
数据类型 | 转化为true值 | 转化为false值 |
Boolean | true | f |
Number | 任何非零数值()包括无穷大 | 0和NaN |
String | 非空字符串 | 空字符串 |
Object | 任何对象 | null |
Undefined | n/a | undefined |
理解String类型
该类型用于表示零或多个Unicode字符组成的字符序列,即字符串。
(1)字符串的特点:
ECMAScript中的字符串是不可变的,字符串一旦创建,它的值就不可改变。如果要改变,那就要把原来的字符串删除,再给变量赋值新的字符串。
例如:
var str = “Java”;
var str += “Script”; //JavaScript
在第二行代码,实际操作是:首先,创建一个能容纳10个字符的新字符串,然后在其中填充“Java”和“Script”,再将原来的字符串“Java”和“Script”。
(2)转换为字符串
将值转换为字符串,第一种方法是toString():
数值、布尔值、对象,甚至字符串值本身都有toString()方法,而null和undefined没有该方法。
toString()方法的参数是输出数值的基数。例如
var num = 10;
console.log( num.toString(10) ); //10(十进制)
console.log( num.toString(2) ); //1010(二进制)
console.log( num.toString(8) ); //12(八进制)
在不知到转换的值是不是null或者undefined的情况下,还可以使用String()方法,这个函数能够将任何值转换为字符串,得到得值是“null”和“undefined”。
理解Object类型
对象有两种创建方法:第一,var 对象 = new Oject();第二,对象字面量表示法:var 对象 = {};
Object每个实例都有下面的属性和方法:
constructor:保存着用于创建当前函数的对象。
hasOwnProperty(propertyName):检查该对象实例是否有这个参数(这里为对象的属性),属性名(propertyName),必须是字符串。
isPrototypeOf(object):检查传入的对象是否是当前对象的原型。
propertyIsEnumerable(protertyName):检查属性能否使用for-in语句来枚举。
toLocaleString():返回对象的字符串表示。
toString():返回对象的字符串表示。
valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()返回的值相同。