要成为一个优秀的前端工程师,系统的学习Javascript,有夯实的Javascript基础,以及对语言本身的深刻的理解,是基本功。从Javascript数据类型开始,我将对Javascript知识体系进行系统的梳理。
今天的主题是Javascript数据类型。
ECMAScript中有5中简单的数据类型,也即基本数据类型:Undefined、Null、Boolean、Number和String。还有一种复杂数据类型:Object,Object本质上是由一组无序的名值对组成的。
1、typeof操作符首先要介绍的是typeof操作符,因为ECMAScript是松散类型的,所以需要一种方式来检测给定变量的数据类型,就是typeof了。对一个值使用typeof操作符可能返回以下某个字符串。
"undefined"——如果这个值未定义,后面会详细说明
"boolean"——如果这个值是布尔值
"string"——如果这个值是字符串
"number"——如果这个值是数值
"object"——如果这个值是对象或者null
"function"——如果这个值是函数
下面是几个使用typeof操作符的例子:
var typeText = "Javascript"; alert(typeof typeText); //"string" alert(typeof (typeText)); //"string" alert(typeof 123); //"number"
一定注意,typeof是操作符,不是函数,所以上面第三行的代码中的括号,虽然可以使用,但不是必需的,加上括号反而会让人误解。
2、Undefined类型这是第一个一定要详细说明的Javascript数据类型。Undefined类型只有一个值,也即undefined。
在使用var声明变量但是未对其进行初始化的时候,这个变量的值就是undefined。例如:
var text; alert(text == undefined); //true
这里声明了text变量,但是并未对其进行初始化,所以比较这个变量和undefined字面量,结果表明它们是相等的。其实上面的语句与下面的例子是等价的:
var text = undefined; alert(text == undefined); //true
但是,实际上我们并没有必要在声明变量的时候显式的将其初始化为undefined。
令人困惑的是,对未初始化的变量执行typeof操作,会返回undefined值,而对未声明的变量执行typeof操作符同样也会返回undefined值。
var text; //这个变量声明后默认获得undefined值 //下面这个变量没有声明 //var message; alert(typeof text); //"undefined" alert(typeof message); //"undefined"
3、Null类型Null类型是要和undefined类型对比说明的。首先,Null类型也是只有一个值的数据类型。如其他语言一样,null只表示一个空对象指针,这也正是下面代码中用typeof才做服检测null值时会返回“object”的原因。如下所示:
var text = null; alert(typeof text); //"object"
如果声明的一个变量明确的是要在将来保存一个对象,显式的将其初始化为null是一个好习惯,到时候只要直接检查该变量的值是不是null值就可以判定该变量是不是已经保存了一个对象的引用了。
实际上,undefined值是派生自null值的,所以它们的相等行测试返回都是true:
alert(null == undefined); //true
在介绍其他数据类型之前,我先比较这两个数据类型的深层次的不同点。
学习了《Javascript高级程序设计》和阮一峰大神的博客之后,我对这两者的区别有了更深刻的认识:
null表示"没有对象",即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
Object.getPrototypeOf(Object.prototype); // null
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
var i; i // undefined function f(x){console.log(x)} f() // undefined var o = new Object(); o.p // undefined var x = f(); x // undefined
4、Boolean类型Boolean类型只有两个字面值:true和false。这两个值是区分大小写的,并且这两个值与数字值1和0是两回事。
虽然Boolean类型只有两个字面值,但是ECMAScript所有类型都可以转换为与Boolean中的这两个字面值等价的值,只需要调用Boolean()函数即可:
var val = "Hi"; var valAsBoolean = Boolean(val);