Skip to content

JavaScript 变量类型

JavaScript 是一种弱类型或者说动态语言。这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。这也意味着你可以使用同一个变量保存不同类型的数据.

最新的 ECMAScript 标准定义了 7 种数据类型:BooleanNullUndefinedNumberStringSymbol1Object

Boolean布尔型

布尔型数据的取值只有两个:truefalse。布尔型数据不能用引号括起来,否则就变成字符串了。

var a = false; //boolean类型
var b = 'false'; //字符串类型

可以调用转型函数Boolean(),将其他值转换为布尔值。其中''0NaNnullundefined会被转化为false,其他情况下都会被转化为true

Null空类型

Null 是一个 JavaScript 字面量,表示空值(null or an “empty” value),即没有对象被呈现(no object value is present)。只有一个值,就是null

如果定义一个意在保存对象的变量,最好在初始化的时候,将其初始化为null,而不是其他类型的值。

Undefined未定义类型

Undefined 类型派生自 Null。按照 ECMA-262 的规定,应该让这两个值相等。

> undefined == null
< true

一个未初始化的变量的值为undefined,使用严格相等运算符(===)来判断一个值是否是undefined:

var x;
alert(typeof x);

对未初始化和未声明的变量执行 typeof 操作符,都会返回undefined值。

Number数值型

在 Javascript 中,数值型数据不区分整数和小数,数值型和字符型数据的区别是数值型数据不用引号括起来。例如:

var num1 = 54;
var num2 = 5.4;
var num2 = 5.0; // 会被转化为整数。

浮点数值

由于保存浮点数需要的内存空间是保存整数值的两倍,因此JavaScript会及时将浮点数值转化为整数。如上例中5.0会按照5来保存。另外JavaScript中的浮点数运算精确度远不如整数,如:

> 0.1 + 0.2 == 0.3
< false

在计算机中,数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的。而对于像0.1这样的数值用二进制表示你就会发现无法整除,最后算下来会是 0.000110011...由于存储空间有限,最后计算机会舍弃后面的数值,所以我们最后就只能得到一个近似值。在0.1 + 0.2这个式子中,0.10.2都是近似表示的,在他们相加的时候,两个近似值进行了计算,导致最后得到的值是0.30000000000000004,此时对于JS来说,其不够近似于0.3,于是就出现了0.1 + 0.2 != 0.3 这个现象。为了进行类似的运算的准确性,可使用整数进行:

> (1+2)/10 ==0.3
< true

数值范围

可使用Number.MIN_VALUE获取可表示的最小值,使用Number.MAX_VALUE获取可表示的最大值,可以使用isFinite()函数判断数值范围是否在这两个数之间。

NaN

NaN,即不是数值,用来表示一个本来要返回数值的操作,却未能返回数值的情况(这样不会抛出错误了,代码会继续运行)。NaN 本身有两个特点:任何涉及NaN的操作,都返回NaNNaN与任何数都不相等,包括它自己。

> NaN + 3
< NaN
> NaN === NaN
< false

可用isNaN()函数判断一个值是否为NaN

转化类型

Number 类型内置了一些方法,其中toString() 方法返回指定 Number 对象的字符串表示形式。

var count = 10;
print( count.toString() ); // 输出 "10"
print( (17).toString() ); // 输出 "17"
var x = 6;
print( x.toString(2) ); // 输出 "110"
print( (254).toString(16) ); // 输出 "fe"
print( (-10).toString(2) ); // 输出 "-1010"
print( (-0xff).toString() ); // 输出 "-11111111"

有三个函数可以将其他值转化为数字。

  1. Number()可将任何数据类型转化为数值;
  2. parseInt()可将字符串转化为整数;
  3. parseFloat()可将字符串转化为浮点数;

String 字符串

字符串由多个字符构成,字符可以是字母、数字、标点符号或空格。字符串必须放在单引号或者双引号中。例如:

var txt1 = "JavaScript";

字面量\unnnn用十六进制表示一个Unicode字符。

转换为字符串

  1. 使用toString()方法,但nullundefined值没有这个方法。
  2. String()函数,可将任何值转化为字符串。

Symbol 符号类型

符号类型在 ECMAScript 第 6 版中被引入 Javascript。 符号类型是唯一的并且是不可修改的。

Object 对象类型

在Javascript里,对象是非常重要的一种数据类型,对象可以被看作是由一些彼此相关的属性和方法集合在一起构成的数据实体,本质上是由一组无序的键值对组成。JavaScript中内置了一些对象,如array(数组)、date(日期)等等。

数组

字符串、数值型和布尔型变量在任意时刻只能存储一个值。如果要用一个变量存储多个值,就需要使用数组。数组是由名称相同的多个值构成的一个集合,集合中的值是数组的元素(element)。例如可以将一个班级的所有成员姓名存储在数组中。

在Javascript中,使用array关键字来定义数组,在定义中,可以声明数组的大小,也可以不声明数组中元素的个数。例如:

var country = new array(180); //定义了数组的大小
var mybooks = new array(); //没有定义数组的大小
mybooks[0] =HTML”; //为数组mybooks的第一个元素赋值
mybooks[1] =JavaScript”; //为数组mybooks的第二个元素赋值

数组中元素的索引默认从0开始,上例中的“mybooks[0]”表示数组中的第一个元素。

除了使用array关键字定义数组外,还可以直接使用方括号定义数组,数组中的元素要用逗号隔开,最后一个元素后没有逗号。如:

var site = [”腾讯”,”新浪”,”搜狐”,”网易”];

查看变量类型

在JavaScript中,typeof操作符能返回一个字符串,表示未经求值的操作数(unevaluated operand)的类型。

var a = 1;
alert(typeof a);

变量类型的转换

JavaScript 是一种弱类型或者说动态语言。开发者不用提前声明变量的类型,在程序运行过程中,类型会被自动确定,这也意味着我们可以使用同一个变量保存不同类型的数据:

var foo = 42; // foo is a Number now
var foo = "bar"; // foo is a String now
var foo = true; // foo is a Boolean now

除了让程序自动确定类型外,有时,我们也可以使用以下函数强制转换数据类型:

  1. Number() 强制内容转为数字;
  2. Boolean() 强制内容转为布尔值;
  3. String() 强制内容转为字符串;

如:

var t1 = Boolean(""); //返回false,空字符串
var t2 = Boolean("s"); //返回true,非空字符串

扩展阅读资料

  1. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object
  2. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function
  3. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

Footnotes

  1. symbol类型是ECMAScript6新增的数据类型,是一种唯一、不可变的变量。