现在的位置: 首页 > javascript > 正文
Javascript数据类型
2012年11月22日 javascript ⁄ 共 5657字 暂无评论 ⁄ 被围观 3,108 views+

1.标识符 用了这么久标识符居然不知道标识符的定义,翻阅资料得到结果,所谓的标识符,就是指变量、函数、属性的名字、或者函数的参数。标识符是按照一定规则组合起来的一个活多个字符 Javascript标识符规则 (1) 第一个字符必须是一个字母、下划线(_)或一个美元符号($) (2) 其他字符可以是字幕、下划线、美元符合或者数字 (3) 不能为关键字或系统保留字 2.变量 ECMAScript的变量是松散型的,所谓的松散型就是可以用来保存任何类型的数据,换句话说每个变量仅仅是一个用于保存值得占位符而已。定义变量时要使用var关键字,后跟变量名,例如 var msg; 上面的代码定义了一个名为msg的变量,该变量可以用来保存任何值,如果没有经过初始化的变量,会保存一个特殊的值undefined,当然也可以在定义变量时初始化变量,如下:

var msg="hello";//字符串
msg=10;//数字

有一点要注意,用var关键字定义的变量是定义该变量的作用域中(javascript中function是作用域)的局部变量。也就是说,如果在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁,例如:

function message()
{
    var msg="hello";//局部变量
}
test();
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,例如:

var msg;
alert(msg);//undefined
alert(msg == undefined);//true

关于未定义和定义未赋值,先看个例子:

<script>
 var msg;
 alert(msg);//“undefined”
 alert(a);//错误
</script>

上面的例子告诉我们,未定义和定义未赋值是两回事,就好比你拿着一张照片去一个学校找照片的上的学生,定义未赋值就好比你不知道这个人叫什么,但是这个人就在这个学校,未定义就好比这个学校就根本没这个人。但是对未初始化的变量执行typeof 操作符会返回undefined,而对未声明的变量执行typeof同样也返回undefined。例:

<script type="text/javascript">
var msg;
alert(typeof msg);//undefined
alert(a);//undefined
</script>

上面结果的唯一解释就是,在技术上未定义和定义未赋值是有区别的,但是在实际运用过程中,两个都无法操作。 2.Null类型 Null类型是第二个只有一个值的数据类型,这个特殊的值是null,从逻辑的角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时,返回"object"的原因,如下例子所示

<script type="text/javascript">
  var obj=null;
  alert(typeof obj);//object
</script>

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null,而不是其他值,这样以来,只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用,如下所示:

if(obj !=null) 
{
    //对obj对象执行某些操作
}

实际上,undefined值是派生自null值的,因此:

alert(undefined == null ) ; //true

尽管null和undefined有这样的关系,但他们的用途完全不同。如前所述,无论在什么情况下,都没有必要把一个变量的值显式的设置为undefined,可是同样的规则对null却不适用,换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null值,这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和undefined. 3.Boolean类型 Boolean类型是ECMAScript使用最多的一种类型,该类型只有两个字面值:true和false,这两个值于数字不是一回事,因此true不一定等于1,而false也不一定等于0,定义如下

var found=true;
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转换非常重要,看下面的例子:

var msg="java";
if (msg)
 {
     alert("i am java");
}

运行这个例子,就会弹出一个提示框,因为字符msg被自动转换成对应的Boolean值(true),执行了alert("i am java")语句。 4.Number类型 (1) 整数数值 Number类型使用IEEF754格式来表示整数和浮点值,为支持各种数值类型,ECMA-262定义了不同的数值字面量格式。 最基本的数值字面量格式是十进制整数,十进制整数可以像下面这样直接在代码中输入:

var num=78;
var count=56;

除了以上十进制表示以外,整数还可以通过八进制或十六进制的字面值来表示,其中八进制字面值的第一位必须为0(零),然后是八进制的数字(0~7),如果字面值中的数值超出了范围(0~7),那么第一位的零将被忽略,后面的数值被当作十进制数值解析。例:

var octalNum1=060; 
var octalNum2=059;
var octalNum3=08;

alert(octalNum1);//56
alert(octalNum2);//59
alert(octalNum3);//8

注:八进制字面量在严格模式下是无效的,会导致Javascript引擎抛错。 十六进制的字面值的前两位必须为0x,后跟任何十六进制数字(0~9及A~F),其中字母,A-F不区分大小写,例:

var hexNum1=0xA;
var hexNum2=0xa;
alert(hexNum1);//10
alert(hexNum2);//10

在进行计算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。 (2) 浮点数值 所谓的浮点数,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。虽然小数点前面可以没有整数,但不推荐这种写法,例:

var floatNum1=8.8;
var floatNum2=.3;//正确,但不推荐

alert(floatNum1);// 8.8
alert(floatNum2);// 0.3

由于保存浮点数值需要的内存空间是保存整数值的两倍,因此,ECMAScript会不时地将浮点数值转换为整数值,如果小数点后面没有跟任何数字,那么这个数值可以作为整数值来保存,如果小数点后只有一位数值,并且这个数值为0,则这个数值也会被转换为整数。如下:

var floatNum1=3.;
var floatNum2=3.0;
var floatNum3=3.50;

alret(floatNum1);// 3
alret(floatNum2);// 3
alret(floatNum3);// 3.5

对于一些比较大或者比较小的数值,可以用e表示法(科学计数法)来表示,用e表示法表示的数值等于e前面的数值乘以10的指数(e后面的数字)次幂,如下:

var floatNum=6.456e7; //64560000

浮点数的最高精度为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本身,如下代码:

alert(NaN==NaN);//false

针对NaN的这个特点,ECMAScript定义了isNaN()函数,这个函数接受一个参数,该参数可以是任何类型,,而函数会帮我们确定这个参数是否"不是数值",isNaN()在接收到一个值后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,而任何不能被转换为数值的值都会导致这个函数返回true,如下:

alert(isNaN(NaN)); //true
alert(isNaN(10)); //false
alert(isNaN("10")); //false(可以被转换为数值10)
alert(isNaN("aa")); //true (不能被转换成数值)
alert(isNaN(true)); //true (可以被转换为数值1)

在基于对象的isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值再调用toString()方法,再测试返回值. 5. String类型 String类型用于表示由零或多个16位Unicode字符组成的序列,即字符串,字符串可以由双引号(")或单引号(')表示,因此下面两种字符串的写法都是有效的: var firstName='张'; var lastName="三"; 在Javascript中,用双引号和单引号表示的字符串完全相同。不过以双引号开头的字符串也必须以双引号结尾,单引号同理。 (1) 字符串的特点 ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后在用另一个包含新值的字符串填充该变量,例如:

var lang='java';
lang=lang+'script';

以上示例中的变量lang开始包含字符串'java'。而第二行代码把lang的值重新定义为'java'与'script'的组合。实现这个操作的过程如下: 首先创建一个能容纳10个字符的新字符串,然后在这个字符串中填充'java'和'script',最后一步是销毁原来的字符串'java'和字符串'script',因为这两个字符串已经没用了。 (2)转换为字符串 要把一个值转换为一个字符串有两种方式。第一种是使用几乎每个值都有的toString()方法,这个方法唯一要做的就是返回相应值的字符串表现。例:

var num=23;
var numString=num.toString();//字符串"11"
var isNot=true;
var isNotString=isNot.toString(); //字符串"true"

数值、布尔值、对象和字符串(没错,每个字符串也都有一个toString()方法,该方法返回字符串的一个副本)都有toString()方法。但null和undefined值没有这个方法。 在不知道要转化的值是不是null或者undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的转换为字符串。String()函数遵循下列转换规则: 如果值有toString()方法,则调用该方法(没有函数)并返回相应的结果 如果值是null,则返回"null". 如果值是undefined,则返回"undefined".

给我留言

留言无头像?


×