JavaScript中的数据类型,看这一篇就够了

数据类型

ECMAScript中有5中简单的数据类型(也成为基本数据类型):Undefined、Null、Boolean、Number、String。还有一种复杂的数据类型——Object
注:Object本质上是有一组无序的键值对组成的

1 typeof操作符

鉴于ECMAScript是松散类型的,因此需要一个手段来检测给定的变量时什么类型,typeof就是负责这个功能的操作符。对一个值使用typeof操作符可能返回下列某个字符串:

  • “undefined”——如果这个值未定义
  • “boolean”——如果这个值是布尔值
  • “string”——如果这个值是字符串
  • “number”——如果这个值是数值
  • “object”——如果这个值是对象或null
  • “function”——如果这个值是函数
    下面举一些使用typeof操作符的例子:
var message = "some string";
alert(typeof message);		// "string"
alert(typeof (message));	// "string"
alert(typeof 95);			// "number"

2 Undefined类型

Undefined类型只有一个值,级特殊的undefined。在使用var声明变量,但未对其加以初始化时,这个变量就是undefined,例如:

var message;
alert(message == undefined);	// true

也可以将变量直接初始化为undefined:

var message = undefined;
alert(message == undefined);	// true

3 Null类型

Null类型是第二个只有一个值得数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,这也正是为什么用typeof检测null值会返回object的原因:

var car = null;
alert(typeof car);	//object

实际上undefined值是派生自null值得,如下例:

alert(null == undefined);	//true

但是两者还是有区别的,如果一个变量暂时不赋值,将来要使用。我们不会把一个变量显示的定义为undefined,而是会定义为null。

4 Boolean类型

Boolean类型是ECMAScript中使用得最多的一种类型,该类型有两个字面值:true和false。

var found = true;
var lost = false;

虽然Boolean类型的字面值只有两个,但ECMAScript中所有类型的值都有与这两个Boolean值等价的值。也就是说能够定义的所有值要么能转成true,要么能转成false,可以用转型函数Boolean()转化。

var message = "Hello world";
var messageAsBoolean = Boolean(message);
alert(messageAsBoolean);	//true

下表给出了各种数据类型及其对应的转换规则:

数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 “”(空字符串)
Number 任何非零数字值(包括无穷大) 0和NaN(参见本文后面有关NaN的内容)
Object 任何对象 null
Undefined n/a undefined

注:n/a(或N/A),是not applicable的缩写,意思是“不适用”。

在流程控制语句中,会自动执行Boolean转换,如下所示:

var message = "Hello world!";
if (message) { 			//这里执行了Boolean转换,将message转为true
	alert("Value is true");
}

5 Number类型

Number类型应该是ECMAScript中最令人关注的数据类型了,直接上例子:

var intNum = 55;		// 十进制的55
var octalNum = 070;		// 八进制的56
var hexNum = 0xA;		// 十六进制的10
1.浮点数值

所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有以为数字,浮点数值的例子:

var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; 	//有效,但不推荐

由于浮点数值占用的内存是整数值的两倍,所以ECMAScript会不失时机地将浮点数值转换为整数值,如下所示:

var floatNum1 = 1.;		//小数后面没有数字——解析为1
var floatNum2 = 10.0;	//整数——解析为10

还有一种可以表示极大或极小的浮点数值的方法——e表示法,如下所示:

var floatNum = 3.125e7;	

其含义是
3.125 1 0 7 3.125*10^7

var floatNum = 3e-7;	

其含义是
3 1 0 7 3*10^{-7}

2.数值范围

由于内存的限制,ECMAScript并不能保存世界上所有的数值。ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中,这个数值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中,这个数值是1.7976931348623157e+308。如果某次计算的结果超过这个范围,则会被转换成特殊的Infinity值。

var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result));    //false
3.NaN

NaN,即非数值(Not a Number),这个数值用于表示一个本来要返回数值的操作数未返回数值的情况,当计算错误的时候,不会抛出错误,而是返回一个NaN,这样就不会影响后面代码的执行。

  • 任何涉及NaN的操作(例如NaN/10)都会返回NaN
  • NaN与任何值都不相等,包括NaN本身
alert(NaN == NaN);	//false
alert(isNaN(NaN));	//true
4.数值转换

有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。

  • Number()——可以用于任何数值类型
  • parseInt()——用于字符串转数值
  • parseFloat()——用于字符串转数值

Number()函数的转换规则如下:

  • 如果是Boolean值,true和false将分别被转换为1和0
  • 如果是数字值,只是简单的传入和返回
  • 如果是null值,返回0
  • 如果是undefined,返回NaN
  • 如果是字符串,遵循以下规则:
    • 如果字符串中包含数字,则将其转换为十进制数值
    • 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值
    • 如果字符串中包含有效的十六进制格式,如"0xf",则将其转换为相同大小的十进制整数值
    • 如果字符串是空的,则将其转换为0
    • 如果字符串中包含除上述格式之外的字符,则将其转换为NaN
  • 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回值
    例如:
var num1 = Number("Hello world!");	//NaN
var num2 = Number("");				//0
var num3 = Number("000011");		//11
var num4 = Number(true);			//1

由于Number()在转换字符串时比较复杂而且不够合理,因此更常用的是parseInt()函数。parseInt()会从字符串第一个非空格字符开始扫描,如果第一个字符不是数字符号或者负号,parseInt()就会返回NaN。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,知道遇到一个非数字字符。例如,"1234blue"会被转换为1234。"22.5"会被解析成22。

var num1 = parseInt("1234blue");  // 1234
var num2 = parseInt("");          // NaN
var num3 = parseInt("0xA");       // 10(十六进制数)
var num4 = parseInt(22.5);        // 22
var num5 = parseInt("070");       // 56(八进制数)
var num6 = parseInt("70");        // 70(十进制数)
var num7 = parseInt("0xf");       // 15(十六进制数)
var num8 = parseInt("f",16);      // 15(十六进制数,另一种写法,推荐这么写)

parseFloat()与parseInt()类似,但有两点区别:

  • parseFloat()解析字符串中的第一个小数点是有效的,而第二个小数点无效
  • parseFloat()始终会忽略前导的零
  • 十六进制的字符串始终会被转换成0
  • 如果字符串可以解析为整数,那么parseFloat()会返回整数
 var num1 = parseFloat("1234blue");    // 1234(整数)
 var num2 = parseFloat("0xA");         // 0
 var num3 = parseFloat("22.5");        // 22.5
 var num4 = parseFloat("22.34.5");     // 22.34
 var num5 = parseFloat("0908.5");      // 908.5
 var num6 = parseFloat("3.125e7");     // 31250000

6 String类型

String类型用于表示有零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以用双引号(")或单引号(’)表示,因此下面的写法都是有效的:

var firstName = "Kobe";
var lastName = 'Bryant';
1.字符字面量

String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。这些字符字面量如下表所示:

字面量 含义
\n 换行
\t 制表
\b 退格
\r 回车
\f 进纸
\\ 斜杠
\’ 单引号(’),在用单引号表示的字符串中使用。例如:‘He said,\‘hey.\’’
\" 单引号("),在用双引号表示的字符串中使用。例如:“He said,\“hey.\””
\xnn 以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A"
\unnn 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。
2.字符串的特点

ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符,首先要销毁原来的字符串,然后在用另一个包含新值得字符串填充该变量,例如:

var lang = "Java";
lang = lang + "Script";

第二行的动作是,创建一个能容纳10个字符的新字符串,然后在这个字符串中填充"Java"和"Script",然后将原来的字符串"Java"和字符串"Script"销毁。

3.转换为字符串

要把一个值转换为一个字符串有两种方式。
a. toString()方法,该方法返回字符串的一个副本

var age = 11;
var ageAsString = age.toString();		// 字符串"11"
var found = true;
var foundAsString = found.toString();	// 字符串"true"

由于null和undefined值没有toString()方法,可以用下面的String()方法转换为字符串

b.String()方法,可以将任何类型的值转换为字符串。

  • 如果值有toString()方法,则电泳该方法并返回相应的结果
  • 如果值是null,则返回"null"
  • 如果值是undefined,则返回"undefined"
    下面看几个例子:
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
    
alert(String(value1));  // "10"
alert(String(value2));  // "true"
alert(String(value3));  // "null"
alert(String(value4));  // "undefined"

7 Object类型

ECMAScript中的对象其实就是一组数据和功能的集合。Object对象创建的方法如下:

var o = new Object();

Object的每个实例具有如下属性和方法:

  • constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数就是Object()
  • hasOwnProperty(propertyName):用于检查给定的属性在当前对象中是否存在
  • isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型
  • propertyIsEnumerablepropertyName():用于检查给定的属性能否能用for-in语句来枚举
  • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应
  • toString():返回对象的字符串表示
  • valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同

如果这篇博客对你有用,点个赞再走呗~

发布了35 篇原创文章 · 获赞 5 · 访问量 9512

猜你喜欢

转载自blog.csdn.net/iiiliuyang/article/details/104150626