JavaScript学习笔记(一)之 数据类型详解

在 ECMAScript6 规范中,JavaScript中有

6种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number、Symbol和String;

1种复杂数据类型(也称为引用数据类型)——Object,Object本质上是由一组无序的名值对组成的。

下面详细介绍一下这 7 种数据类型的一些特性:

1. Undefined

该类型只有一个值,即 undefined。 undefined 意为 未定义,即当使用 var 声明了变量但未进行复制时,这个变量的值就是 undefined。undefined 产生的原因有两种:

  • 访问对象不存在的属性或方法
  • 声明了变量但从未赋值
1
2
3
4
5
6
var v1,obj = {};
console.log(v1); //undefined
console.log(obj.get); //undefined
typeof v1; // "undefined"
typeof v2; // "undefined"
typeof obj.get; // "undefined"

2. Null

Null 类型也只有一个值:null , 表示一个变量中没有包含有效数据。null 在这里意为空值空对象 的意思,更确切的说,一个被赋值为 null 的变量没有保存有效的数值、字符串、布尔、数组或对象等,可以通过给一个变量赋值为 null 来清空变量中的内容。产生 null 的原因只有一个:即对一个变量显式的赋值为 null 。

1
2
3
var p = null;
console.log(p); //null
typeof p ; // "object"

从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值会返回 “object” 的原因,但实际上是 JavaScript 最初实现的一个BUG,后来被ECMAScript沿用下来了,详情参考 The history of typeof null

另外,undefined 值也是派生自 null 值的, 因此 ECMA-262 规定对他们的相等测试要返回 true:

1
2
3
4
undefined == null; //true
undefined === null; //false 不是同一类型
undefined == 0; //false;
null == 0; //false

3. Boolean

Boolean类型只有两个字面值:true 和 false 。 但在 JavaScript 中,所有类型的值都可以转化为与 Boolean 等价的值,转化规则如下:

  • 所有对象都被当作 true,
  • 当字符串为空时,该字符串被当作 false
  • null 和 undefined 被当作 false
  • 当数字为 0 时,该数字被当作 false
1
2
3
4
5
6
7
8
typeof true; // "boolean"
typeof false; // "boolean"
Boolean(new Object()); //true
Boolean(undefined); //false
Boolean(null); //false
Boolean(''); //false
Boolean(0); //false
Boolean(100); // true

需要注意的是,平时我们看到的if(1) {…} ,实际上JS 引擎在内部也对这些值做了 Boolean 转化然后再进行运算的。

4. Number

在 Javascript 中,没有 int 和 float 数据类型,而是用 Number 来表示整数和浮点数值,除此之外,Number 还有一个特殊的数值,即NaN (Not a Number),NaN表示一个承诺返回数值类型数据但实际没有返回的情况。NaN有两个特点:一是任何涉及NaN的操作都会返回NaN,二是NaN不与任何数值相等,包括自己,但可以通过 isNaN() 方法来判断一个数值是否为 NaN :

1
2
3
4
5
6
7
typeof 123; // "number"
typeof 123.45 // "number"
typeof NaN; // "number"
NaN+1; // NaN
NaN == false; // false
NaN == NaN; //false
isNaN(NaN+1); //true

5. Symbol

Symbol 是 ES6 新增的一种原始数据类型,表示独一无二的值,Symbol 值通过函数生成,如下所示:

1
2
let s = Symbol(); //s是独一无二的值
typeof s ; // symbol

6. String

String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。JavaScript 的字符串类型用于表示文本数据。它是一组16位的无符号整数值的“元素”。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量。

不同于类 C 语言,JavaScript 字符串是不可更改的。这意味着字符串一旦被创建,就不能被修改。但是,可以基于对原始字符串的操作来创建新的字符串。例如:

  • 获取一个字符串的子串可通过选择个别字母或者使用 String.substr().
  • 两个字符串的连接使用连接操作符 (+) 或者 String.concat().

在 JavaScript 中,字符串是基本数据类型,本身不存任何操作方法,为了方便的对字符串进行操作,ECMAScript 提供了一个基本包装类型:String 。它是一种特殊的引用类型,每当读取一个字符串的时候,JS内部就会创建一个对应的 String 对象,这样就可以直接调用 String 上的方法来操作字符串 。

1
2
var s1 = "some text";
var s2 = s1.substr(2,1);

当第二行代码访问 s1 时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值。而在读取模式中访问字符串时,JS内部会自动完成下列处理:

  • 创建 String 类型的一个实例
  • 在实例上调用指定的方法
  • 销毁这个实例

用伪代码模拟以上三个步骤:

1
2
3
4
5
6
//创建 s1 的包装对象
var s1 = new String("some text");
//调用 s1 上的 substr 方法
var s2 = s1.substr(2,1);
//销毁 s1
s1 = null;

从中可以看出,基本包装类型 和 引用类型 有一个很重要的区别,即对象的生存期不同 。使用 new 操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。在 JavaScript 中,类似的基本包装类型还有 Number、Boolean 等。

7. Object

除过上面的 6 种基本数据类型外,剩下的就是引用类型了,统称为 Object 类型。细分的话,包括有:Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型 等,这些对象在JS中都属于引用类型,除 Function 之外,通过 typeof 检测其数据类型返回的都是 object,如果要判断对应的具体类型,则可以通过 Object.prototype.toString 来获取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var a = {};
var b = new Function();
var c = [];
var d = new Date();
var e = new RegExp();
typeof a; //object 有效
Object.prototype.toString.call(a); //[object Object]
typeof b; //function 有效
Object.prototype.toString.call(b); //[object Object]
typeof c; //object 无效
Object.prototype.toString.call(c);//[object Array]
typeof d; //object 无效
Object.prototype.toString.call(d);//[object Date]
typeof e; //object 无效
Object.prototype.toString.call(e);//[object RegExp]