JavaScript - 数据类型

295 阅读5分钟

数据类型

JavaScript规定了7种语言类型。根据最新的ECMAScript规范,这7种类型是:

  1. Undefined
  2. Null
  3. Boolean
  4. String
  5. Number
  6. Symbol
  7. Object

前6中数据类型属于简单数据类型(基本数据类型/原始数据类型),只有Object属于复杂数据类型。

typeof

我详情介绍数据类型之前,我们要了解一下typeof操作符,它可以用来检测数据类型。
typeof操作符返回一个字符串,表示操作数类型。

typeof 运行时类型
object Null
object Object
function Object
number Number
string String
boolean Boolean
undefined Undefined
symbol Symbol
typeof 123 // 'number'
typeof '123' // 'string'

Undefined

Undefined 类型表示未定义(已声明,未初始化),它只有一个值,即 undefined 。任意变量在未赋值之前都是 Undefined类型,值为 undefined 。

var a;
a === undefined; // true

typeof a === 'undefined'; // true

Null

Null 类型表示空值(已声明,初始化为null),它只有一个值,即 null 。
undefined 不同,null 是JavaScript的关键字。

var a = null;
a === null; // true
typeof a === 'object' // true

Boolean

Boolean类型表示逻辑意义上的真和假,它有两个值,true和false。

var a = true;
a === true; // true
typeof a === 'boolean'; // true

下表为各种数据类型转换为Boolean的规则

数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零数字值(包括无穷大) 0和NaN
Object 任何对象 null
Undefined n/a undefined
Symbol Symbol n/a

String

String类型表示文本数据。

String类型用于表示由16位Unicode字符组成的字符序列。 现行的字符集国际标准,字符是以Unicode的方式表示的,每一个Unicode的码点表示一个字符,理论上,Unicode的范围是无限的。UTF是Unicode的编码方式,规定了码点在计算机中表示方法,常见的有UTF16和UTF8。Unicode的码点通常是用 U+???来表示,其中???是十六进制的码点值。0-65536(U+0000 - U+FFFF)的码点被称为基本字符区域(BMP)。

字符字面量

String类型包含一些特殊的字符字面量,也叫转义序列。每个转义序列被作为一个字符来解析。

字面量 含义
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\ 斜杠
' 单引号('),在用单引号表示的字符串中使用。例如: 'He said, 'Hey''
" 双引号('),在用双引号表示的字符串中使用。例如: 'He said, 'Hey''
\x nn 以十六进制代码nn表示的一个字符(其中n为0~F)。例如:\x41 表示"A"
\u nnnn 以十六进制代码nnnn表示一个Unicode字符(其中n为0~F)。例如:\u03a3表示希腊字符∑。

字符编码笔记: ASCII,Unicode和UTF8

// 练习题
var text = "This is comma: \u002C.";
text.length;  // 17

var text = "This is comma: ,.";
text.length;  // ?

字符串的特点

JavaScript中的字符串是不可变的,一旦字符串被创建,就无法改变,所以字符串具有值类型的特征。

var lang = 'java';
lang = lang + 'script';

步骤如下:

  1. 声明lang变量,创建一个长度为4的字符串,然后把'java'赋值给lang
  2. 创建一个长度为10的字符串,然后把'javascript'赋值给lang,销毁 'java' 和 'script'

Number

Number类型表示数字,它使用IEEE754格式来表示整数和浮点数。

IEEE754: 二进制浮点数算术标准

整数

我们经常用到是十进制的整数,那么除了十进制外,还可以通过八进制、十六进制来表示整数。

var num10 = 10; // 十进制 10
var num8 = 012; // 八进制 10
var num16 = 0xA; // 十六进制 10

num10 + num8 + num16  // ?

在进行算术计算时,结果都会转换为十进制数值。

浮点数

浮点数即我们通常用到的小数。

0.1 + 0.2 === 0.3 // ?

这里输出的结果是false,说明两边不相等,这是浮点运算的特点,只要基于IEEE754格式实现的语言都会有这个毛病。

所以,正确比较的方式是使用JavaScript提供的最小精度值来比较

Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON;  // true

还可以使用第三方插件实现,比如: bignumber.js

var x = new BigNumber(0.1);
x.plus(0.2).toNumber() === 0.3 // true

数值范围

Number能够表示数值范围是,

Number.MIN_VALUE; // 5e-324
Number.MAX_VALUE; // 1.7976931348623157e+308

超出这个范围的值,将会自动转为特殊的 Infinity  值。Infinity为正无穷,-Infinity为负无穷。

1 / +0 // Infinity
1 / -0 // -Infinity

这里需要注意一点,在JavaScript中有 +0 和 -0,区分他们方式就是检测 1 / x 的结果是 Infinity 还是 -Infinity。

NaN

顾名思义,NaN 即 Not a Number,它是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛错误了)。

1 / 'qwe';  // NaN

任何涉及到NaN的操作都会返回NaN,而且NaN与任何值都不相等,包括它自己。

NaN / 10 // NaN
NaN === NaN  // false

JavaScript提供了一个方法 isNaN,它接受一个参数,可以检测这个参数是否“不是数值”。

isNaN(NaN) // true
isNaN(10) // false
isNaN('yweg') // true
isNaN('10') // false

Symbol

Symbol是ES6中引入的新类型,表示独一无二的值,它的出现使对象的属性名可以使用两种类型,一个是String,一个是Symbol。凡是属性名是Symbol类型的,可以保证与其它属性名不会产生冲突。

Object

Object是JavaScript中最复杂的类型,也是JavaScript的核心机制之一。Object表示对象的意思,既表示客观世界中的某个具体的事物,又表示软件系统中的基本元素。
在计算机科学中,对象是指内存中的可以被标识符引用的一块区域。

在JavaScript中,对象的定义是“属性的集合”。当你声明一个对象时,它会自动初始化一组属性。

image.png

这些属性还可以被增减,属性的值可以是任意类型,包括具有复杂结构的对象。属性用键来标识,它的键值可以使一个字符串或者Symbol。

var obj = { name: 'jack' };
delete obj.name;
'name' in obj // false

参考