JavaScript之数据类型
javasscript有5种简单数据类型(也成为基本数据类型):
Undefined、Null、Boolean、Number、String
1种复杂数据类型:
Object
在javascript中所有值的数据类型就是上述6种之一了。那么我们需要一个方法来检测给定变量到底是那种数据类型,typeof操作符就可以帮助我们解决问题。
var msg="博客园"; alert(typeof msg); // "string" alert(typeof 110); // "number"
使用typeof 操作符,返回下列某个字符串:
"undefined" --该值未定义
"boolean"--布尔值
"string"--字符串
"number"--数值
"object"--对象或null
"function"--函数
看到这里我们对"object"--对象或null有些疑惑,为什么 typeof null 会返回object,这里我们需要记住的是null是一个特殊类型,他表示对一个空对象的引用,所以会返回object。
华丽的分割线 ----------------------------------------------------------------------------------------------------------------------------------------------------------------
1.Undefined类型
当我们声明一个变量时没有对其进行初始化,这个变量的值就是undefined:
var msg; alert(msg==undefined); // true
例子中声明变量msg,并没有对其进行初始化,所以会弹出undefined。
所以声明变量时我们也可以使用undefined来初始化变量:var msg=undefined,
但是未经初始化的值会默认取得undefined,这种写法也没必要了。
var msg; // 声明变量,默认取得undefined // 变量name没有声明 // var name alert(msg); // "undefined" alert(name); // 产生错误
上述代码name变量并没有被声明,传递给alert函数时产生一个错误。
这时我们用typeof检测一下我们的变量:
var msg; // 声明变量,默认取得undefined // 变量name没有声明 // var name alert(typeof msg); // "undefined" alert(typeof name); // "undefined"
结果是未初始化和未声明的变量执行typeof都返回了undefined,这个结果有其逻辑上的合理性。因为虽然这两种变量从技术上角度看有本质区别。
即便未初始化的变量会自动赋予undefined值,但养成显式初始化变量(即在声明变量的同时给变量赋值)的习惯。如果能够做到这一点,那么当typeof操作符返回undefined
时,我们就知道被检测的变量是有还是没有被声明的,而不是尚未初始化的了。
2.Null类型
前面说过null是一个特殊的类型,表示对一个空对象的引用。
但是undefined和null之间有什么关系呢?看下面的代码:
alert(null==undefined); // true
实际上,undefined值派生自null值,因此ECMA-262规定它们的相等测试要返回teue。
尽管有这样的关系,但他们的用途完全不同。前面也说过声明变量没有必要显示的初始化为undefined,会默认取得。对于null却不能这样了,也就是说声明一个变量来保存对象,只要
变量还没有保存,就应该让变量明确保存null值。这样既能体现null作为空对象指针的特性,又能区分null和undefined。
3.boolean类型
boolean类型只有两个值:true和false。这两个值与数值值不是一回事,因此true不一定等于1,false也不一定等于0。
boolean类型的字面值true和false是区分大小写的。像True和False都不是boolean值,而是标识符。
虽然boolean类型的值只有两个,但是其他类型的值都有与这两个boolean值等价的值。将一个值转换为其对应的boolean值,需要调用Boolean()函数。
var msg="博客园"; alert(Boolean(msg)); // true
在上述代码中字符串msg被转换成了一个boolean值。可以对任何数据类型的值调用Boolean()函数,而且总会返回一个boolean值。这个值是true还是false取决于被转换数值的数据类型和具体的值。
看如下各数据类型及对应的转换规则:
数据类型 转换为true的值 转换为false的值
boolean true false
string 非空字符串 ""空字符串
number 非零数值 0 和 NaN
objeact 任何对象 null
undefined ----不适用 undefined
通过这些转换规则,可以帮我们很好的理解控制流语句if自动执行相应的Boolean转换:
var msg="博客园"; if(msg) { alert("变量msg被转换为true"); }
运行上述代码,就会显示一个警告框。字符串msg被自动的转换为对应的Boolean值。明白这个原理,我们就能很好的在控制语句if中使用变量了。
4.number类型
3.1整数,最常用的就是十进制整数了。当然还有八进制、十六进制,这里不做讲解了。
需要注意的是在做算术计算时,所有以八进制和十六进制表示的数值最终都会被转换成十进制数值。
3.2浮点数值,就是该数值中必须包含一个小数点,小数点后面必须有一位数字。
var num1=1.1; var num2=1.2; var num3=.3; // 有效,但不推荐
由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会自动把相应的浮点数值转换为整数值。如果小数点后面没有跟数值(2.)或者后面跟了一个零(2.0),
这个值就会被作为整数值来保存:
var num1=2.; alert(num1); // 2,小数点后没有数值解析为2 var num2=2.0; alert(num2); // 2,本身就是一个整数解析为2
对于那些极大或者极小的数值,可以用e表示法(科学计数法)来表示浮点数值。
科学计数法的格式:整数/浮点数 + e/E + 10的幂中的指数
3.125 e 7 ==
var num1=3.125e7; // 31250000
3.3数值范围,由于内存的限制,并不能保存所有的数值。
能表示的最小值:Number.MIN_VALUE,这个值是5e-324。
能表示的最大值:Number.MAX_VALUE,这个值是1.7976931348623157e+308。
如果你的某次计算得到的值不在javascript最小和最大值这个范围内,那么你的值会被自动转换成特殊的Infinity值。
如果这个值是负数,会转换成-Infinity(负无穷);如果是正数,则是转成Infinity(正无穷)。
3.4 NaN:非数值。有两个特点:
一、任何涉及NaN的操作都会返回NaN(例如NaN/5).
二、NaN与任何值都不相等,包括本身。
alert(NaN==NaN); // false
针对NaN的这两个特点,javascript定义了isNaN()函数。这个函数接收一个参数,该参数可以是任何类型,函数会帮我们确定这个参数是否“不是数值”。
isNaN()在收到一个值后,会尝试将这个值转换为数值,某些不是数值的值会直接转换为数值,(字符串“10”或Boolean),任何不能被转换的都会返回true
alert(isNaN(NaN)); // true alert(isNaN(10)); // false 10是数值 alert(isNaN("10")); // false "10"可以被转换为数值10 alert(isNaN("博客园")); // true 不能转换为数值 alert(isNaN(false)); // false 可以被转换为0
5.String类型
字符串是 JavaScript 的一种基本的数据类型。
String 对象的 length 属性声明了该字符串中的字符数。
String 类定义了大量操作字符串的方法,例如从字符串中提取字符或子串,或者检索字符或子串。
6.object类型
一组数据和功能的集合,对象可以通过new操作符来创建对象。
var obj=new Object();
可以自定义对象的属性或方法:
var obj=new Object(); obj.name="张三"; obj.say=function(){ alert(this.name) }
还可以这么写:
var obj={ name:"张三", say:function(){ alert(this.name) } }
结果是一样的。
在javascript中object是所有对象的基础,因此所有的对象都具有object的属性和方法。