JavaScript成长之路程序员首页投稿(暂停使用,暂停投稿)

JavaScript的数据类型

2016-07-04  本文已影响282人  查查查查查查克
js数据类型.png

JavaScript中总共有6种数据类型。可分为两大类:简单数据类型复杂数据类型

说明一下:上面这句话现在来说应该是不对的,因为ES6中新增了数据类型。不过我们暂时不涉及ES6。

简单数据类型即基本数据类型,共有5种:UndefinedNullBooleanNumberString,其值分别对应undefinednull、布尔值truefalse数值字符串值。

复杂数据类型只有一种,就是Object——对象。JS中的对象就是一组无序键值对外面套一个大括号{}所构成。Object非常常用、非常强大、非常有意思,而且对于JS这门语言结构来说,Object意义不一般。这些,之后的文章再来讨论吧。

ECMAScript不支持任何创建自定义类型的机制,而所有值最终都将是上述6种数据类型之一。

上面这句话引用自《JavaScript高级程序设计(第3版)》(之后简称J3),其实不用多解释,这句话说的很明白了。这就是说,你“定义”的所有变量,它的类型都是唯一确定的,必定是上述6种之一。

这里的“定义”两个字,我加了引号,是想表示这个词广义上的意思。在一般的编程语言中,当你想“定义”一个变量时,不外乎3种情况:声明,定义,初始化。声明就如字面意思一样,仅仅是宣称一个命名;定义就是给这个命名分配内存空间;初始化则是给这个内存空间赋值。显然,他们3个是循序渐进的。在JS中,我们所说的初始化其实做的事是分配内存并赋值,也就是定义并初始化。所以在JS中,我们一般只说声明和初始化。看如下代码:

var value1;  //声明变量
value1 = 'Hello';  //(定义并)初始化
var value2 = 'Hello';    //声明并初始化

再摘录博客园的一句话,对于声明、定义与初始化大家应该就能完全理解了:

因为javascript为动态语言,其变量并没有固定的类型,其存储空间大小会随初始化与赋值而变化,所以其变量的“定义”就不像传统的静态语言一样了,其定义显得无关紧要。
http://www.cnblogs.com/silentjesse/p/4024536.html


接下来,让我们来具体看一看JavaScript的6种数据类型。

不过首先,必须先了解一个操作符—typeof。顾名思义,这个操作符的作用就是返回某个变量的数据类型。对某个值使用typeof操作符始终会返回以下6个字符串之一:'undefined''boolean''number''string''object''function'。你肯定发现了一个问题,就是这6个字符串为什么不和6种数据类型完全对应?没有'null'吗?'function'又是哪儿来的?请看下面的测试代码:

console.log(typeof null)    //'object'
var f = function(){};
console.log(typeof f);    //'function'

注意到,对Null类型的唯一值null使用typeof操作符返回的不是什么'null',而是'object',这是为什么呢?这是因为null这个值比较特殊,它是基本数据类型Null的唯一值,但同时,它又被认为是一个空的对象(Object)引用。

有些时候,typeof 操作符会返回一些令人迷惑但技术上却正确的值。比如,调用typeof null会返回"object",因为特殊值null 被认为是一个空的对象引用。——《J3》

对于typeof可以返回'function',这么理解吧:

从技术角度讲,函数在ECMAScript 中是对象,不是一种数据类型。然而,函数也确实有一些特殊的属性,因此通过typeof 操作符来区分函数和其他对象是有必要的。——《J3》

在JS中,FunctionObject的关系很微妙也很复杂,需要对原型构造、原型链等一些知识有所理解之后才能进一步理解这两者的关系。不过这并不影响我们现在的理解,站在数据类型的角度,我们可以明确地认为Function就是一类特殊的Object。至于对一个Function使用typeof操作符的返回结果是'function'而不是'object',原因就像书上说的,只是因为我们有必要知道它是一个函数而不是一般的对象。


介绍完typeof操作符这个实用的工具,下面就真的具体来看看JS的6种数据类型吧。

Undefined 类型

var a;
console.log(a);    //undefined(注意,这可不是字符串)

需要明白的是,undefined是一个明确的、合法的值,而不是一个错误。真正会导致错误的是如下的代码:

console.log(b);    //Uncaught ReferenceError: b is not defined

这行代码会报一个空引用异常的错误,因为变量b没有声明。这很好理解。

var a;
console.log(typeof a);    //'undefined'
console.log(typeof b);    //'undefined'

看起来,你可能会觉得对 b 执行typeof应该报错才对,但因为typeof必然会返回6个字符串之一,所以并不会报错。而且,无论是 a 还是 b,都无法执行真正的操作,那么就让 b 和 a 一样返回'undefined'好了。看一下书上的解释:

结果表明,对未初始化和未声明的变量执行typeof 操作符都返回了undefined 值;这个结果有其逻辑上的合理性。因为虽然这两种变量从技术角度看有本质区别,但实际上无论对哪种变量也不可能执行真正的操作。——《J3》

由此可知,当你使用typeof操作符检测变量的数据类型时,如果返回的是'undefined',那么这个变量可能是未初始化,也可能是未声明。因此,从规范性上来说,为了避免这种模糊,我们在定义变量时最好直接进行初始化。这样的话,如果还返回'undefined',那么我们立即就能知道是因为这个变量压根就没声明了。

Null 类型

Boolean 类型

var s = 'Hello';
console.log(Boolean(s));    //true

转换规则如下表:

Boolean()转型函数的转换规则
在流程控制语句中,比如在if语句的小括号内,会自动对操作数调用转型函数Boolean()再求最终的布尔值。如下:
var s = 'Hello';
if(s){
    //do something    //后台自动对s调用转型函数`Boolean()`,因为s不是空串,会返回true
}

Number 类型
数值类型。了解几个知识点即可。

var a = 0.1;
var b = 0.2;
console.log(a + b);    //0.30000000000000004 有误差,并不会是0.3

String 类型
字符串类型。在这里了解几个点即可,之后在引用类型等处会做详细介绍。

Object 类型
对象类型。Object是所有对象的基础,其所具有的属性和方法其他对象也必然拥有。这里只列几个Object的属性和方法:

上一篇下一篇

猜你喜欢

热点阅读