你的位置:首页 > Java教程

[Java教程]JavaScript基本概念(三)


数据类型

Javascript中有5种简单数据类型,也称之为基本数据类型,分别是Null ,Undefined,Boolean,Number,String类型。还有一种复杂数据类型Object,object本质上一组无序的名值对的组成。

数据类型检测

Javascript中使用typeof操作符来检测具体的数据类型,对一个变量使用typeof操作符,可能会返回一下的某个字符串:

I.如果这个值未定义,返回undefined;

II.如果是布尔值,返回boolean;

III.如果是字符串,返回string;

IV.如果是数值,返回number;

V.如果是对象或者是null,返回object;

VI.如果是函数,那么返回function;

 

undefined类型

undefined类型只有一个值,那就是undefined,在使用var操作符定义一个变量,但是并未给该变量赋值,也就是没有初始化,此时该变量的值就是undefined。声明的变量没有初始化与初始化该变量的值为undefined是一样的,可以看下面的例子:

 

通过上面的例子可以看出,对于没有初始化的变量或者初始化为undefined的变量,结果都是undefined,两者结果是相等的;

在看下面的一个例子:

 

上面只声明了变量a1,变量a2并没有声明,通过结果可以看到使用typeof操作符,对于没有声明和没有初始化的变量都返回undefined,但是直接打印没有声明的变量时会报错;因此可以对所声明的变量都进行初始化,当typeof操作符返回undefined时就表明该变量没有声明。

Null类型

Null类型与Undefined类型一样,也是只有一个值null,当使用typeof操作符检测null值时,返回object,表明null为一个空对象指针,可以根据上一篇所说的引用类型在内存中的存储结果来说明,引用对象在栈内存中,栈内存中的名称存储变量的名称,栈内存中的值存储指向堆内存的路径,堆内存中的一块空间才是真正的存储对象的空间,那么null的意思就是栈内存中的变量名称已经有了,但是栈内存中的值并没有指向任何的堆内存空间,也就是一个空对象指针

由上所述,如果要声明一个变量用来保存对象,那么最好将该变量初始化为null而不是其他的值,这样只需要检测该变量是否为null值就可以确定该变量是否保存了一个对象的引用。

null值与defined值的比较,两者再使用==操作符比较时返回true,但是再使用===全等操作符比较时,返回false。如下所示:

 

关于这点,ECMAScript认为undefined是从null中派生出来的,因此认为定义他们为相等的,但是全等时返回false是由于两者的类型不一致(typeof null 返回object,typeof undefined返回undefined),关于全等后面会写到,这里不说了。

布尔类型

Boolean类型只有两个字面量,分别是truefalse,注意在javascript中是严格区分大小写的,写法不能改变,如果写成TRUE或者True都不再表示布尔类型。虽然true可以转换成数字值1,false可以转换成数字值0,但是true和false与数字值不是一个概念,因此true不一定等于1,false也不一定等于0。

Javascript中,任何类型的值都有与Boolean类型的两个值等价的值,可以使用Boolean()转型函数进行转换,转换的对应关系如下所示:

数据类型

转换为true的值

转换为false的值

Boolean

true

false

String

非空字符串

空字符串

Number

非零数字

0和NaN

Object

任何对象

null

Undefined

不适用

undefined

 

Number类型

  Number类型使用IEEF754格式来表示整数和浮点数,其中字面量格式有三种,分别是十进制整数、八进制整数以及十六进制整数,其中八进制整数的第一位必须是0,如果字面值中的数值超过了范围,那么将忽略前导0,后面的数值当做十进制整数解析,十六进制字面值必须以0x开头,后面跟上任何十六进制数字(0 – 9以及A-F),但是在进行数据运算时,所有的八进制以及十六进制数据都转换为十进制参与计算。

  Number类型中的浮点数必须是小数点后至少有一位数字,如果整数部分是0,那么可以省略不写,虽然不推荐,但是确实是可以的。因为保存浮点数所需的内存空间是整数的2倍,因此,ECMAScript会把浮点数转化成整数来保存,当然是可以转换成整数的浮点数,例如10.0,对于极大或者极小的浮点数,可以采用科学计数法的方式来表示,即浮点数的值等于e前面的数值乘以10的指数次幂,例如3.14e5就等价于3.14*105,如果是极小的浮点数,那么就是3.14*10-5,默认情况下,如果小数点后面带有6个以上的0,那么就会转换成科学计数法。此外由于IEEF754浮点数计算的问题,两个浮点数想加会出现精度丢失的情况,例如0.1+0.2是不等于0.3的,而是等于0.30000000000000004,因此是不能测试某个特定的浮点数的

  由于内存的限制,ECMAScript并不能保存全部的数值,能表示的最大的数值保存在Number.MAX_VALUE中,最小值保存在Number.MIN_VALUE中,如果某次计算的值超过了javascript数值范围,如果是正数,那么将表示为Infinity,如果是负数,那么表示为-Infinity,如果出现了Infinity就不能再进行下一次计算,如果要确定一个数值是否处于javascript的数值范围期间,可以使用isFinite()函数。如果在范围期间,返回true,否则返回false。

在javascript中有一个特殊的数值NaN,表示一个本来要返回数值的操作数未返回数值的情况。在ECMAScript中,任何数值除以非数值都会返回NaN。此外任何涉及NaN的操作都会返回NaN,例如1+NaN,那么返回的还是NaN,其次,NaN与任何数值都不相等,包括他自身。ECMAScript中使用isNaN()函数确定传入的任何类型的参数是否“不是数值”。该函数接到参数后会尝试将参数的值转换为数值,如果参数可以转换为数值,例如”10”,那么返回false,如果是不能转换为数值的参数,例如”asdf”,那么返回true。

Javascript中使用三个函数可以将非数值转换数值,三个函数分别是Number(),

parseInt()以及parseFloat()。Number()函数的转换结果如下所示:

i.如果是布尔值,那么true和false分别转换为1和0;

ii.如果是数字值,那么传入和返回一致;

iii.如果是null值,返回0;

iv.如果是undefined,返回NaN;

v.如果是字符串,那么需要遵循如下规则:

    a.如果字符串中只包含数字,那么将其转换为十进制数字,例如”-1”转换为-1,”015”转换为15.

    b.如果字符串中包含有效的浮点格式,那么返回对应的浮点数(前导0去掉,正负号带着).

    c.如果字符串中包含有效的十六进制格式,那么返回十六进制转换为十进制之后的数字.

    d.如果是空字符串,那么返回0.

    e.如果字符串中包含除上述格式之外的字符,返回NaN.

    f.如果是对象,那么调用对象的valueOf()方法,然后按照前面的规则转换返回的值。如果转换的结果是NaN,那么调用对象的toString()方法,然后再次按照前面的规则转换返回的字符串值。

    使用parseInt()函数转换时,会忽略字符串前面的空格,直到第一个非空字符,如果该字符不是负号或者数字,那么直接返回NaN,如果是数字或者负号,那么会继续向后解析,直到解析完全部的字符或者遇到非数字字符,例如”1234aaa”会返回1234,”22.56”会返回22,因为.不是数字字符。此外parseInt()也可以识别八进制或者十六进制的整数格式,也就是说如果是以”0x”开头并且后面跟着数字字符,就会将其当做一个十六进制整数,八进制一样。此外在转换八进制和十六进制时,ECMAScript3和ECMAScript5是有区别的,比如转换”070”, ECMAScript3中parseInt(‘070’)返回56,但是ECMAScript5中返回的是70,也就是按照十进制的方式转换,为了解决这个问题,可以给parseInt()函数添加第二个参数,表明按照哪个进制来转换,如parseInt('070', 10)返回70,parseInt('070', 8)返回56.

    parseFloat()的用法和parseFloat()的用法一样。区别主要有两点,第一,parseFloat可以识别“.“,但是只能是第一个小数点,例如”22.55.66”的返回值是22.55,后面的被舍弃掉了。第二,parseFloat始终都会忽略前导0,parseFloat可以识别前面说过的所有的浮点数格式以及十进制整数,十六进制的字符串始终返回0。

还有就是如果字符串包含的是可以解析为整数(没有小数点或者小数点后面是0),那么parseFloat的返回值是整数。

String类型

String类型由零或者多个16位Unicode字符组成,是一个字符序列,即字符串。字符串可以用双引号或者单引号表示,用双引号表示的字符串和用单引号表示的字符串是完全相同的,因此使用哪种表示字符串都可以,但是两者不可以混用。

字符串的长度可以通过length属性取得,注意是length属性,而不是length()方法,两者不能混淆。

String数据类型中包含一些特殊的字符字面量,也称之为转义序列,用来表示非打印字符或者具有其他作用。常见的几种转义字符如下所示:

字面量

含义

\n

换行

\t

制表

\b

退格

\r

回车

\f

进纸

\\

斜杠

\’

单引号,再用单引号表示的字符串中使用

\”

双引号,在用双引号表示的字符串中使用

      

       Javascript中的字符串是不可改变的,也就是说,字符串一旦建立完成,它的值就不再发生改变,要改变某个变量表示的字符串,那么需要销毁原来的字符串,再用另一个包含新值的字符串填充该变量。

       要把一个值转换为字符串有两种方式。第一种是使用toString()方法,返回相应值的字符串表现,数值、布尔值、对象都有toString()方法,包括字符串本身也有该方法,只不过字符串的toSting()方法返回的是字符串的一个副本,但是null和undefined没有toString()方法。数值类型使用toString()方法时,可以通过传递参数返回任意有效进制格式表示的字符串值,如number.toString(2)返回的就是使用2进制表示的该数值的字符串,如果没有传递参数,那么默认的是转换为十进制格式的字符串。第二种方式是使用String()方法,该方法的有点就是不必确认要转换的值是否是null或者undefined,如果值是null,那么返回”null”,如果值是undefined,那么返回”undefined”,如果值有toString()方法,那么调用该方法返回具体的值。当然还有一种转换方式就是使用加号操作符,把要转换的值和一个字符串(““)加在一起。

 

Object类型

       Javascript中的对象其实就是一组数据和功能的集合,也可以说是一组无序的名值对的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建,而创建Object类型的示例并为其添加属性和方法,就可以创建自定义对象。创建方式如下所示:

 

上面的三种方式都可以创建一个person对象,其中的person/person1/person2都是分别是Object的一个实例。与java中的java.lang.Object一样,javascript中的Object类型是所有它的示例的基础,也就是说,Object类所具有的任何属性和方法也同样存在于它的实例中。

Object的每个示例都具有以下的属性和方法:

A.constructor:保存着用于创建当前对象的函数。

B. hasOwnProperty(propertyName):返回布尔类型的值,用来检查当前对象中是否存在对应的属性。

C. isPrototypeOf(Object):返回布尔值,用来检查指定对象的是否存在于另一个对象的原型链中,例如o1.isPrototypeOf(o2)表示o1是否存在于o2的原型链中,如果存在,那么返回true,否则返回false.

D. propertyIsEnumerable(propertyName):返回布尔值,用来检测给定的属性能否使用for-in语句来枚举。

E. toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。

F. toString():返回对象的字符串表示。

G. valueOf():返回对象的字符串、数值或者布尔值表示。通常和toString()方法的返回值一样。

 

  数据类型部分就这样了,明天争取把操作符、语句以及函数三部分写出来,这样基础部分就完了。