JavaScirpt数据类型
JavaScript 是一种弱类型或者说动态语言。动态语言意味着两点:
- 不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。
- 可以使用同一个变量保存不同类型的数据。
这个特征的利弊非常明显,好处是降低了学习成本,弊端是增加了纠错成本。
查看变量类型
在JavaScript中,typeof
操作符能返回一个字符串,表示未经求值的操作数(unevaluated operand)的类型。也可以使用函数形式,两者得到的结果是一致的。
let a = 1;
console.log(typeof a);
console.log(typeof(a));
typeof null
会返回 "object"
—— 这是 JavaScript 编程语言的一个错误,实际上它并不是一个 object
。
基本类型
JavaScript中有三种基本数据类型:字符串、数字和布尔值。
String 字符串
字符串由多个字符构成,字符可以是字母、数字、标点符号或空格。在 JavaScript 中,有三种包含字符串的方式。
- 双引号:
"Hello"
. - 单引号:
'Hello'
. - 反引号:
Hello
.
双引号和单引号都是“简单”引用,在 JavaScript 中两者几乎没有什么差别。
例如:
let txt1 = "JavaScript";
反引号是 功能扩展 引号。它们允许我们通过将变量和表达式包装在 ${…}
中,来将它们嵌入到字符串中,例如:
let name = "John";
// 嵌入一个变量
console.log( `Hello, ${name}!` ); // Hello, John!
// 嵌入一个表达式
console.log( `the result is ${1 + 2}` ); // the result is 3
字面量\unnnn
用十六进制表示一个Unicode字符。
Number 数字
在 Javascript 中,数值型数据不区分整数和小数。例如:
let num1 = 54;
let num2 = 5.4;
let num2 = 5.0; // 会被转化为整数。
浮点数值
由于保存浮点数需要的内存空间是保存整数值的两倍,因此JavaScript会及时将浮点数值转化为整数。如上例中5.0
会按照5
来保存。另外JavaScript中的浮点数运算精确度远不如整数,如:
> 0.1 + 0.2 == 0.3
< false
在计算机中,数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的。而对于像0.1
这样的数值用二进制表示你就会发现无法整除,最后算下来会是 0.000110011...
由于存储空间有限,最后计算机会舍弃后面的数值,所以我们最后就只能得到一个近似值。在0.1 + 0.2
这个式子中,0.1
和0.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
的操作,都返回NaN
;NaN
与任何数值都不相等,包括它自己。
> NaN + 3
< NaN
> NaN === NaN
< false
可用isNaN()
函数判断一个值是否为NaN
。
最新的 ECMAScript 标准定义了 8 种数据类型:Boolean
、Null
、Undefined
、Number
、BigInt
、String
、Symbol
和Object
。
BigInt 大整数类型
在 JavaScript 中,“number” 类型无法表示大于‘253−1‘(即 9007199254740991
),或小于 ’−(253−1)‘ 的整数。这是其内部表示形式导致的技术限制。在大多数情况下,这个范围就足够了,但有时我们需要很大的数字,例如用于加密或微秒精度的时间戳。
BigInt
类型是最近被添加到 JavaScript 语言中的,用于表示任意长度的整数。 可以通过将 n
附加到整数字段的末尾来创建 BigInt
值。
// 尾部的 "n" 表示这是一个 BigInt 类型
const bigInt = 1234567890123456789012345678901234567890n;
目前 Firefox/Chrome/Edge/Safari 已经支持 BigInt
了,但 IE 还没有。
Boolean 布尔值
布尔型数据的取值只有两个:true
和false
。布尔型数据不能用引号括起来,否则就变成字符串了。
let a = false; //boolean类型
let b = 'false'; //字符串类型
可以调用转型函数Boolean()
,将其他值转换为布尔值。其中''
、0
、NaN
、null
、undefined
会被转化为false
,其他情况下都会被转化为true
。
其它类型
ECMAScript 标准定义了 8 种数据类型:Boolean、Null、Undefined、Number、BigInt、String、Symbol 和Object。
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
:
let x;
alert(typeof x);
对未初始化和未声明的变量执行 typeof
操作符,都会返回undefined
值。
Symbol 符号类型
符号类型在 ECMAScript 第 6 版中被引入 Javascript。 symbol
类型用于创建对象的唯一标识符。符号类型是唯一的并且是不可修改的。
Object 对象类型
在Javascript里,对象是非常重要的一种数据类型,对象可以被看作是由一些彼此相关的属性和方法集合在一起构成的数据实体,本质上是由一组无序的键值对组成。
其他所有的数据类型都被称为“原始类型”,因为它们的值只包含一个单独的内容(字符串、数字或者其他)。
JavaScript中内置了一些对象,如array
(数组)、函数、date
(日期)等等。
数据类型的转化
有时,我们需要强制转换数据类型,比如将用户输入的值转化为数字。或者将数字转化为字符串。
Number 类型内置了一些方法,其中toString()
方法返回指定 Number 对象的字符串表示形式。
let count = 10;
print( count.toString() ); // 输出 "10"
print( (17).toString() ); // 输出 "17"
let x = 6;
print( x.toString(2) ); // 输出 "110"
print( (254).toString(16) ); // 输出 "fe"
print( (-10).toString(2) ); // 输出 "-1010"
print( (-0xff).toString() ); // 输出 "-11111111"
有三个函数可以将其他值转化为数字:
Number()
可将任何数据类型转化为数值;parseInt()
可将字符串转化为整数;parseFloat()
可将字符串转化为浮点数;
除转化为数字外,还可以转为其他类型:
- Boolean() 强制内容转为布尔值;
- String() 强制内容转为字符串;