javascript小结之数据类型、运算符、流程控制语句

(一)数据类型

javascript中有5种简单数据类型:Undefined、Null、Boolean、Number、String,还有1种复杂数据类型:Object。javascript不支持任何创建自定义类型的机制,所有值都成为以上6种数据类型之一。

1、typeof操作符

typeof操作符是用来检测变量的数据类型,对于值或变量使用typeof操作符会返回如下字符串结果。

字符串
描述
undefined
未定义
boolean
布尔值
string
字符串
number
数值
object
对象或null
function
函数(注意这里返回的function不是数据类型)

看下面的代码:

<script>
	var a = "yedward";
	var b = null;
	alert(typeof a); // 返回string
	alert(typeof(b)); // 返回object,不建议这样写
</script>

typeof操作符可以操作变量,也可以操作字面量。虽然也可以使用typeof(b)这种写法,但是typeof是操作符而不是内置函数,函数在javascript中是对象,不是一种数据类型,因此使用typeof来区分函数(function)和对象(object)是很有必要的。

2、Undefined类型

Undefined类型只有一个值undefined,在使用var关键字声明变量,但是没有对变量进行初始化时,这个变量的值就是undefined。可以理解为:当我们用var声明一个变量,然后没有显式的给这个变量赋值,那么这个变量就会自动的被赋值为undefined。Undefined的引入,可以用来区分空对象与未经初始化的变量。

<script>
	var a;
	alert(a); // 弹出窗口显示:undefined
	alert(b); // 不弹出窗口,报错信息中显示:b is not defined
	alert(typeof a); // 弹出窗口显示:undefined
	alert(typeof b); // 弹出窗口显示:undefined
</script>

注意,未初始化的变量与未声明的变量,如上代码所示,它们的值,一个是undefined,一个报错;但是它们的类型,却都是undefined。所以,在定义变量的时候,尽可能的不要只声明,不赋值。

3、Null类型

Null类型是一个只有一个值的数据类型,值为null。它表示的是一个空对象的引用(可以理解为:你想要创建一个变量用来表示对象,但是现在并没有给它初始化一个对象,这个时候加上null表示默认初始化为null对象),而typeof操作符检测null会返回object。如果定义的变量是准备将来用于保存对象的,那么最好将该变量初始化为null。这样,当检查null值就知道该变量是否已经分配了对象引用了。

<script>
	var a = null;
	if (a != null) {
		alert("a对象已经存在");
	}
	var b;
	if ( a == b) {
		alert("null和undefined相等性检测为true");
	}
	alert(typeof a); // 返回object
	alert(typeof b); // 返回undefined
</script>

注意,undefined的是派生自null的,所以javascript对它们的相等性检测返回true。由于undefined和null两个值的比较是相等的,这时,可以采用typeof操作符检测的类型进行比较。

4、Boolean类型

Boolean类型有两个值:true、false。javascript是区分大小写的,True和False或者其他都不是Boolean类型的值。虽然Boolean类型的字面量只有true和false两种,但是javascript中所有类型的值都有与这两个Boolean值相等价的值。要将一个值转换为其对应的Boolean值,可以使用转型函数Boolean()。

<script>
	var a = "yedward";
	var b = Boolean(a);
	alert(typeof a); // 返回string
	alert(typeof b); // 返回boolean
	alert(b); // 返回true
	// 显式转换
	if (b == true) {
		alert("显式转换成功");
	}
	// 隐式转换
	if (a) {
		alert("隐式转换成功");
	}
	alert(a == true);
	// 下面的这两段代码都不会输出
	if (a == true) {
		alert("看看能不能输出true");
	}
	if (a == false) {
		alert("看看能不能输出false");
	}
</script>

上面的代码中显式转换和隐式转换都有用到。

其他类型转换为Boolean类型的规则
数据类型
转换为true的值
转换为false值
Boolean
true
false
String
任何非空字符串
空字符串
Number
任何非零数字值(包括无穷大)
0和NaN(not a number)
Object
任何对象
null
Undefined
undefined(所有的Undefined类型都是false)

5、Number类型

Number类型包括两种数值:整型和浮点型。为了支持各种数值类型,javascript定义了不同的数值字面量格式,如十进制、八进制、十六进制、二进制,有关进制及进制运算的本文不总结,可以参考下《位运算小结(按位与、按位或、按位异或、取反、左移、右移)》。

对于一些过大或过小的值,可以用科学计数法来表示(e),用e表示该数值的前面10的指数次幂。

<script>
	var a = 3.14e5;
	var b = 10000e-4;
	alert(a); // 314000
	alert(b); // 1
</script>

虽然浮点数值的最高精度是17位小数,但算术运算中可能会出现不精确。由于这个因素,做判断的时候要考虑到这个问题,比如可以考虑使用整型判断。

<script type="text/javascript">
	alert(0.1 + 0.2); // 返回值:0.30000000000000004
</script>

数值型的取值范围在Number.MIN_VALUE~Number.MAX_VALUE之间,超过Number.MAX_VALUE则表示正无穷(Infinity),小于Number.MIN_VALUE则表示负无穷(-Infinity),也可以通过Number.POSITIVE_INFINITY、Number.NEGATIVE_INFINITY得到正、负无穷的值。

<script>
	alert(Number.MAX_VALUE); // 最大值
	alert(Number.MIN_VALUE); // 最小值
	alert(Number.NaN); // NaN表示本来应该返回数值,但是却没有返回数值。
	alert(Number.NEGATIVE_INFINITY); // 负无穷,-Infinity
	alert(Number.POSITIVE_INFINITY); // 正无穷,Infinity
</script>

要想确定一个数值是否超过了取值范围,可以使用isFinite()函数,如果没有超过,则返回true,超过,则返回false。

NaN:是一个特殊的值,用于表示本来要返回数值的操作数未返回数值的情况(这样就不会抛错误异常了)。比如,在其他语言中,任何数值除以0都会导致错误而终止程序执行,但是在javascript中,会返回特殊的值,因此不会影响程序执行。

<script type="text/javascript">
	alert(0 / 0); // NaN
	alert(1 / 0); // Infinity
	alert(12 / 0 * 0); // NaN
</script>

可以通过Number.NaN得到NaN的值,任何与NaN进行运算的结果均为NaN,NaN不与任何值相等,包括NaN自身。

<script type="text/javascript">
	alert(Number.NaN); // NaN
	alert(Number.NaN + 1); // NaN
	alert(Number.NaN = Number.NaN); // false
</script>

javascript中还提供了一个isNaN()函数,用来判断这个值到底是不是NaN,即判断一个值是不是不是一个数值,有点绕,通俗的说,就是如果这个值是数值就返回false,不是数值就返回true。注意,isNaN()函数在接收到一个值以后,会首先尝试着对这个值进行转换为数值,然后再进行上面的判断。

<script type="text/javascript">
	alert(isNaN(NaN)); // true
	alert(isNaN(10)); // false
	alert(isNaN("10")); // false,字符串数值"10"可以转为数值10
	alert(isNaN("yedward")); // true,该字符串不能转为数值
	alert(isNaN(true)); // false, true能转为1
</script>

isNaN()函数也适用于对象,在调用isNaN()函数时,首先会调用valueOf()方法,然后确定返回值是否能够转换成数值。如果不能,则基于这个返回值再调用toString方法,再测试返回值。如下面的代码所示: 

<script type="text/javascript">
	var box = {
		// 加上valueOf方法,发现alert调用时返回false
		valueOf : function() {
			return "123";
		},
		// 不加上valueOf方法,只有toString方法,发现alert调用时返回true
		toString : function() {
			return "yedward";
		}
	};
	alert(isNaN(box));
</script>

有3个函数可以把非数值型转为数值型:Number()、parseInt()、parseFloat(),其中,Number()是转型函数,可以用于任何数据类型,另外两个专门针对于将字符串转为数值。

<script type="text/javascript">
	alert(Number(true)); // 1
	alert(Number(25)); // 25
	alert(Number(null)); // 0,空对象返回0
	alert(Number(undefined)); // NaN,不是返回0
</script>

字符串用Number()转换为数值,注意以下要点:

(1)只包含数值的字符串,会直接转换为十进制数值,如果包含前导0,则自动去掉0。

<script type="text/javascript">
	alert(Number("789")); // 789
	alert(Number("0789")); // 789
</script>

(2)只包含浮点数值的字符串,会直接转成浮点数值,如果包含前导和后导0,则自动去掉前后的0。

<script type="text/javascript">
	alert(Number("0.7890")); // 0.789
	alert(Number("000.2340")); // 0.234
</script>

(3)如果字符串是空,那么直接转成0。

<script type="text/javascript">
	alert(Number("2   23")); // 有空格,返回NaN
	alert(Number("")); // 0
	alert(Number("   ")); // 0
</script>

(4)如果不是以上三种字符串类型,则返回NaN。

<script type="text/javascript">
	alert(Number("1323yed123")); // NaN
</script>

(5)如果是对象,首先会调用valueOf()方法,然后确定返回值是否能够转化成数值。如果转换的结果是NaN,则基于这个返回值再调用toString()方法,再测试返回值。

<script type="text/javascript">
	var box = {
		// 加上valueOf方法,发现alert调用时返回123
		valueOf : function() {
			return "123";
		},
		// 不加上valueOf方法,只有toString方法,发现alert调用时返回NaN
		toString : function() {
			return "yedward";
		}
	};
	alert(Number(box));
</script>

由于Number()函数在转换字符串时比较复杂且不够合理,因为在处理整数的时候更常用的是parseInt()。

<script type="text/javascript">
	alert(parseInt("123Yed")); // 123,返回前面的整数部分
	alert(parseInt("yed123ward")); // NaN,如果第一个不是数值,则返回NaN
	alert(parseInt("123yed456")); // 123,从第一个数值开始取,到最后一个连续数值结束
	alert(parseInt("123.456")); // 123,这里是取得整数,小数点又不是数值,取小数点前的数
	alert(parseInt("")); // NaN,没有数值
</script>

parseInt()除了能够识别十进制数值,也可以识别八进制和十六进制。

<script type="text/javascript">
	alert(parseInt("0xA")); // 10,十六进制
	alert(parseInt("070")); // 56,八进制
	alert(parseInt("0xAYYY")); // 100,十六进制,YYY被自动去掉
</script>

javascript为parseInt()提供了第二个参数,用于解决各种进制的转换。

<script type="text/javascript">
	alert(parseInt("0xAF")); // 175,十六进制
	alert(parseInt("AF", 16)); // 175,第二个参数指定为16进制,可以去掉前面的0x
	alert(parseInt("101010101", 2)); // 314,二进制
</script>

parseFloat()是用于浮点数值转换的,和parseInt()一样,从第一位解析到非浮点数值位置。

6、String类型

String类型用于表示由0个或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号("")或单引号('')表示。在一些其他语言(如:PHP)中,单引号和双引号表示的字符串解析方式不同,而在javascript中,这两种表示方法没有任何区别。

转义序列
字面量
含义
\n
换行
\t 制表
\b

空格

\r
回车
\f
走纸换页
\\
斜杠
\'
单引号
\"
双引号
\xnn
以十六进制代码nn表示的一个字符(0-F)。例:\x41
\unnn
以十六进制代码nnn标识的一个Unicode字符(0-F)。例:\u03a3

javascript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变了。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用一个包含新值的字符串填充该变量。toString()方法可以把值转为字符串,toString()方法一般不需要传参,但在数值转成字符串的时候,可以传递进制参数,不传参,则默认为10进制。

如果在转型之前不知道变量是null还是undefined,可以使用转型函数String(),这个函数能够把任何类型的值转换为字符串。如果值有toString()方法,则调用值的该方法并返回相应的结果;如果是null或者undefined,则返回"null"或者"undefined"。

7、Object类型

javascript中的对象类型就是一组数据和功能的集合,对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。new Object(),Object()是对象构造,如果对象初始化时不需要传递参数,可以不写括号,但是这种方式也是不被推荐的,当作没看见好了。

既然可以使用new Object()来表示一个对象,那么也可以使用new操作符来创建其他类型的对象。

<script type="text/javascript">
	var a = new Object(12); // Object类型
	alert(typeof a); // object
	var age = a + 2; // 可以和普通变量运算
	alert(age); // 14
	alert(typeof age); // 转型为number类型
</script>

(二)运算符

javascript中的运算符与别的语法相类似,不展开总结,加减乘除、求余、求模等等,还有运算符优先级的问题,记不住优先级的时候,用括号括起来就好了。

(三)流程控制语句

javascript中的流程控制语句和java差不多,顺序、循环、分支、选择、异常抛出、异常捕获等等,不展开。

本文标题:javascript小结之数据类型、运算符、流程控制语句

本文链接:http://yedward.net/?id=249

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章