Javascript数据类型(核心基础)
1.标识符
用了这么久标识符居然不知道标识符的定义,翻阅资料得到结果,所谓的标识符,就是指变量、函数、属性的名字、或者函数的参数。标识符是按照一定规则组合起来的一个活多个字符
Javascript标识符规则
(1) 第一个字符必须是一个字母、下划线(_)或一个美元符号($)
(2) 其他字符可以是字幕、下划线、美元符合或者数字
(3) 不能为关键字或系统保留字
2.变量
ECMAScript的变量是松散型的,所谓的松散型就是可以用来保存任何类型的数据,换句话说每个变量仅仅是一个用于保存值得占位符而已。定义变量时要使用var关键字,后跟变量名,例如
var msg;
上面的代码定义了一个名为msg的变量,该变量可以用来保存任何值,如果没有经过初始化的变量,会保存一个特殊的值undefined,当然也可以在定义变量时初始化变量,如下:
有一点要注意,用var关键字定义的变量是定义该变量的作用域中(javascript中function是作用域)的局部变量。也就是说,如果在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁,例如:
1 function message()
2 {
3 var msg="hello";//局部变量
4 }
5 test();
6 alert(msg);//错误
这里,变量msg是在函数中使用var定义的,当函数被调用时,就会创建该变量并为其赋值。而在此之后,这个变量优惠立即被销毁,因此例子中的下一行代码就会导致错误。不过可以像下面这样,省略var操作符,从而创建一个全局变量:
function test()
{
msg="hello";//全局变量
}
test();
alert(msg);//hello
上面的例子省略了var关键字,因而msg就成了全局变量。这个,只有调用过一次test()函数,这个变量就有定义,就可以在函数外部任何地方被访问到(没有调用test()函数,会报未定义错位,说明只有执行时才定义)。虽然省略var关键字可以定义全局变量,但这中做法不推荐,因为在局部作用域中定义的全局变量很难维护,而且如果有意地忽略了var,也会由于相应变量不会马上就有定义而导致不必要的混乱。
数据类型
1.Undefined类型
Undefined类型只有一个值,即undefined,在使用var关键字只声明未初始化时,这个变量的值就是undefined,例如:
1 var msg;
2 alert(msg);//undefined
3 alert(msg == undefined);//true
关于未定义和定义未赋值,先看个例子:
1 <script>
2 var msg;
3 alert(msg);//“undefined”
4 alert(a);//错误
5 </script>
上面的例子告诉我们,未定义和定义未赋值是两回事,就好比你拿着一张照片去一个学校找照片的上的学生,定义未赋值就好比你不知道这个人叫什么,但是这个人就在这个学校,未定义就好比这个学校就根本没这个人。但是对未初始化的变量执行typeof 操作符会返回undefined,而对未声明的变量执行typeof同样也返回undefined。例:
上面结果的唯一解释就是,在技术上未定义和定义未赋值是有区别的,但是在实际运用过程中,两个都无法操作。
2.Null类型
Null类型是第二个只有一个值的数据类型,这个特殊的值是null,从逻辑的角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时,返回"object"的原因,如下例子所示
1 <script type="text/javascript">
2 var obj=null;
3 alert(typeof obj);//object
4 </script>
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null,而不是其他值,这样以来,只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用,如下所示:
1 if(obj !=null)
2 {
3 //对obj对象执行某些操作
4 }
实际上,undefined值是派生自null值的,因此:
尽管null和undefined有这样的关系,但他们的用途完全不同。如前所述,无论在什么情况下,都没有必要把一个变量的值显式的设置为undefined,可是同样的规则对null却不适用,换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null值,这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和undefined.
3.Boolean类型
Boolean类型是ECMAScript使用最多的一种类型,该类型只有两个字面值:true和false,这两个值于数字不是一回事,因此true不一定等于1,而false也不一定等于0,定义如下
1 var found=true;
2 var lost=false;
需要注意的是,Boolean类型的字面值true和false是区分大小写的,也就是说,True和False(以及其他混合形式)都不是Boolean的值,只是标识符
虽然Boolean类型的字面值只有两个,但ECMAScript中所有类型的值都有与这两个Boolean值等价的值,要讲一个值转换为其对应的Boolean值,可以调用转型函数Boolean().如下所示:
var message="HelloWorld";
var messageAsBoolean=Boolean(message);
在这个例子中,字符串message被转换成了一个Boolean值,该值被保存在messageAsBoolean变量中,可以对任何数据类型的值调用Boolean()函数,而且总会返回一个Boolean值,至于返回的这个值是false还是true,取决于要转换的数据类型及实际值,下面给出个各种数据类型及其对应的转换规则。
这些转换规则对理解流程控制语句自动执行相应的Boolean转换非常重要,看下面的例子:
运行这个例子,就会弹出一个提示框,因为字符msg被自动转换成对应的Boolean值(true),执行了alert("i am java")语句。
4.Number类型
(1)
整数数值
Number类型使用IEEF754格式来表示整数和浮点值,为支持各种数值类型,ECMA-262定义了不同的数值字面量格式。
最基本的数值字面量格式是十进制整数,十进制整数可以像下面这样直接在代码中输入:
除了以上十进制表示以外,整数还可以通过八进制或十六进制的字面值来表示,其中八进制字面值的第一位必须为0(零),然后是八进制的数字(0~7),如果字面值中的数值超出了范围(0~7),那么第一位的零将被忽略,后面的数值被当作十进制数值解析。例:
注:八进制字面量在严格模式下是无效的,会导致Javascript引擎抛错。
十六进制的字面值的前两位必须为0x,后跟任何十六进制数字(0~9及A~F),其中字母,A-F不区分大小写,例:
在进行计算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。
(2)
浮点数值
所谓的浮点数,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。虽然小数点前面可以没有整数,但不推荐这种写法,例:
1 var floatNum1=8.8;
2 var floatNum2=.3;//正确,但不推荐
3 alert(floatNum1);// 8.8
4 alert(floatNum2);// 0.3
由于保存浮点数值需要的内存空间是保存整数值的两倍,因此,ECMAScript会不时地将浮点数值转换为整数值,如果小数点后面没有跟任何数字,那么这个数值可以作为整数值来保存,如果小数点后只有一位数值,并且这个数值为0,则这个数值也会被转换为整数。如下:
1 var floatNum1=3.;
2 var floatNum2=3.0;
3 var floatNum3=3.50;
4 alret(floatNum1);// 3
5 alret(floatNum2);// 3
6 alret(floatNum3);// 3.5
浮点数的最高精度为17位小数,但在计算时其精度远远不如整数,例如:0.1加上0.2结果不是0.3,而是0.30000000000000004,如果两个数是0.05和0.25或者是0.15和0.15都不会有问题。因此。永远不要测试某个特定的浮点数值。
(3) 数值范围
由于内存的限制,ECMAScript并不可能保存世界上所有的数值。ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中,在大多数浏览器中这个值是5e-324,能够表示的最大数值保存在Number.MAX_VALUE中,在大多浏览器中,这个值是1.7976931348623157e+308.如果某次计算的数值得到一个超出Javascript范围的值,那么这个值将被自动转换为特殊的Infinity值,具体来说。如果是负值,则会转换为-Infinity(负无穷),如果为正数,则会别转换为Infinity(正无穷)
(4)
NaN
NaN,即非数值,是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况,NaN本身有两个非同寻常的特点,首先,任何涉及NaN的操作都会返回NaN,其次,NaN与任何值都不相等,包括NaN本身,如下代码:
针对NaN的这个特点,ECMAScript定义了isNaN()函数,这个函数接受一个参数,该参数可以是任何类型,,而函数会帮我们确定这个参数是否"不是数值",isNaN()在接收到一个值后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,而任何不能被转换为数值的值都会导致这个函数返回true,如下:
1 alert(isNaN(NaN)); //true
2 alert(isNaN(10)); //false
3 alert(isNaN("10")); //false(可以被转换为数值10)
4 alert(isNaN("aa")); //true (不能被转换成数值)
5 alert(isNaN(true)); //true (可以被转换为数值1)
在基于对象的isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值再调用toString()方法,再测试返回值.
转载地址:http://www.easyui.info/archives/661.html
浙公网安备 33010602011771号