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

数据类型

ECMAScript中有5中简单的数据类型(也成为基本数据类型):Undefined、Null、Boolean、Number、String

。还有一种复杂的数据类型——Object

注:Object本质上是有一组无序的键值对组成的

1 typeof操作符

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

  • "undefined"——如果这个值未定义
  • "boolean"——如果这个值是布尔值
  • "string"——如果这个值是字符串
  • "number"——如果这个值是数值
  • "object"——如果这个值是对象或null
  • "function"——如果这个值是函数

下面举一些使用typeof操作符的例子:

<code>var message = "some string";
alert(typeof message);\t\t// "string"
alert(typeof (message));\t// "string"
alert(typeof 95);\t\t\t// "number"/<code>

2 Undefined类型

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

<code>var message;
alert(message == undefined);\t// true/<code>

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

<code>var message = undefined;
alert(message == undefined);\t// true/<code>

3 Null类型

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

<code>var car = null;
alert(typeof car);\t//object/<code>

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

<code>alert(null == undefined);\t//true/<code>

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

4 Boolean类型

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

<code>var found = true;
var lost = false;/<code>

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

<code>var message = "Hello world";
var messageAsBoolean = Boolean(message);
alert(messageAsBoolean);\t//true/<code>

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

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

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


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

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

5 Number类型

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

<code>var intNum = 55;\t\t// 十进制的55
var octalNum = 070;\t\t// 八进制的56
var hexNum = 0xA;\t\t// 十六进制的10/<code>

1.浮点数值

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

<code>var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; \t//有效,但不推荐/<code>

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

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

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

<code>var floatNum = 3.125e7;\t/<code>

其含义是3.125*10^7

<code>var floatNum = 3e-7;/<code>

其含义是3*10^(-7)

2.数值范围

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

<code>var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); //false/<code>

3.NaN

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

  • 任何涉及NaN的操作(例如NaN/10)都会返回NaN
  • NaN与任何值都不相等,包括NaN本身
<code>alert(NaN == NaN);\t//false
alert(isNaN(NaN));\t//true/<code>

4.数值转换

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

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

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

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

例如:

<code>var num1 = Number("Hello world!");\t//NaN
var num2 = Number("");\t\t\t\t//0
var num3 = Number("000011");\t\t//11
var num4 = Number(true);\t\t\t//1/<code>

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

<code>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(十六进制数,另一种写法,推荐这么写)/<code>

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

  • parseFloat()解析字符串中的第一个小数点是有效的,而第二个小数点无效
  • parseFloat()始终会忽略前导的零
  • 十六进制的字符串始终会被转换成0
  • 如果字符串可以解析为整数,那么parseFloat()会返回整数
<code> 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/<code>

6 String类型

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

<code>var firstName = "Kobe";
var lastName = 'Bryant';/<code>

1.字符字面量

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

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

2.字符串的特点

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

<code>var lang = "Java";
lang = lang + "Script";/<code>

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

3.转换为字符串

要把一个值转换为一个字符串有两种方式。

a. toString()方法,该方法返回字符串的一个副本

<code>var age = 11;
var ageAsString = age.toString();\t\t// 字符串"11"
var found = true;
var foundAsString = found.toString();\t// 字符串"true"/<code>

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

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

  • 如果值有toString()方法,则电泳该方法并返回相应的结果
  • 如果值是null,则返回"null"
  • 如果值是undefined,则返回"undefined"

下面看几个例子:

<code>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"/<code>

7 Object类型

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

<code>var o = new Object();/<code>

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

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


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


分享到:


相關文章: