JavaScript数据类型

ECMASctipt中有5种简单数据类型(也称为基本数据类型):UnderfindNullBooleanNumberString

还有1种复杂的数据类型-Object,Object本质上是由一组无序的名值组成。
 
1.2.1 typeof操作符
 
typeof用于检测给定变量的数据类型。对一值使用typeof可能返回某个字符串:
kl
”undefined“-如果这个值未定义;
 
"boolean"-如果这个值是布尔值;
 
”string“-如果这个值是字符串;
 
”number“-如果这个值是数值;
 
”object“-如果这个值是对象或null;
 
”function“ - 如果这个值是函数;
 
备注:从技术角度讲,函数在ECMAScript中是对象,而不是一种数据类型。然而函数
也有也些特殊的属性,因此同过typeof操作符来区分函数和其他对象是有必要的。
 
1.2.2 undefined类型
 
Undefined类型只有一个值,即特殊的undefined。在使用var声明变量时但未对其加以初始化时,这个变量
的值就是undefined。例如:
 
var message;
alert(message == undefined);      //true
 
这个例子值声明了变量message,但未对其进行初始化。比较这个变量与undefined字面量,结果表明他们是相等的。
 
备注:一般而言,不存在需要显示地把一个变量设置为undefined值的情况。字面值undefined的主要目的用于比较,而
ECMA-262第3版之前版本中并没有规定这个值。第3版引入这个值是为了区分空对象指针与未经初始化的变量。
 
不过,包含undefined值的变量和尚未定义的变量还是一样的。如下所示:
 
 
 
// var  age 
 
alert(message);   // "undefined"
alert(age);       // 产生错误
 
上面的代码运行后,由于传递给alert()函数的是尚未申明的变量age,则会导致错误。
对于尚未声明过得变量,只能执行一项操作,即使用typeof操作符检测其数据类型。
 
然而,对未初始化的变量执行typeof操作符会返回undefined值,而对未声明的变量执行
typeof操作符同样也会返回undefined值。如下例子:
 
 
 
// var  age 
 
alert(typeof message);   // "undefined"
alert(typeof age);       // "undefined"
 
结果表明,对未初始化和未声明的变量执行typeof操作符都返回undefined值;这个结果
有逻辑上的合理性。因为虽然这两种变量从技术角度看有本质的区别,但实际上对那种
变量也不可能执行真正的操作。
 
备注:即便未初始化的变量会自动赋予undefined值,但显示地初始化变量依然是明智的选择。
如果能够做到这一点,那么在typeof返回“undefined”值时,我们就知道被检测的变量还没有被
声明,而不是尚未初始化。
 
 
1.2.3 Null类型
 
Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度看,null值表示一个空对象指针,
而这正是使用typeof操作符检测null值时会返回"object"的原因,如下例子所示:
 
var car = null ;
alert(typeof car);       // "object"
 
如果定义的对象准备用于保存对象,那么最好将该变量的初始化设为null而不是其他值。这样一来,只要
直接检查null值就可以知道相应的变量是否已经保存了一个对象引用,如下所示:
 
if(car != null){
          // 对car对象执行某些操作
}
 
实际上,undefined值是派生自null值的,因此ECMA-62规定对它们的相等性测试要返回true。
 
alert (null ==undefined);     // true 
 
尽管null和undefined具有这样的关系,但他们的作用完全不同。只要意在保存对象保存的对象的变量还没有真正保存
对象,就应该明确地让该变量保存null值。这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和defined。
 
 
1.2.4 boolean类型
 
boolean类型是ECMAScript中使用得最多的一种类型,该类型只有两个字面值:true和false。
这两个值与数字值不是一回事,因此true不一定等于1,而false也不一定等于0。以下是变量boolean类型值的例子:
 
var found = true;
var lost = false;
 
注意:boolean类型的字面值true和false是区分大小写的。也就是说,
True和False(以及其他的混合大小写形式)都不是boolean值,只是标识符。
 
虽然boolean类型的字面值只有两个,但ECMAScript中所有类型值都有与这两个boolean值等价的值。调用转型函数boolean()可
以将一个值转换成对应的boolean值。如下所示:
 
var message = "Hello world";
var messageAsBoolean = Boolean(message);
 
可以对任何数据类型的值调用boolean()函数,而且总会返回一个boolean值。至于返回的是true还是false,取决于要转换的数据类型
的实际值。下面表给出了各种数据类型以及其对应的转换规则。
 
 
            数据类型                  转换为true的值                          转换为false的值             
           boolean                      true                                         false
           
           String                        任何非空字符串                          ""(空字符串)

           Number                     任何非0数字值(包括无穷大)         0和NaN

           Object                       任何对象                                  null

           undefined                   n/a                                         undefined
 
注:a/n,是not applicable的缩写,意思是”不适用“
 
这些转换规则对理解流控制语句(如if语句)自动执行相应的转化非常重要。
 
 
1.2.5 Number类型
 
为了支持各种数值类型,ECMA-262定义了不同的数值字面量格式。

整形

1.最基本的数值字面量格式是十进制整数,十进制整数可以像下面这样直接在代码中输入:

var intNum =  55;    //整数

2.除了以十进制表示外,整数还可以用八进制(以8为基数)或十六进制(以16为基数)的直面值来表示。

其中,八进制字面值第一位必须是(0),然后是八进制数字序列(0~7)。如果直面值超出了范围,那么前导0将

被忽略,后面的数值将被当做十进制数值解析。如下面例子:

var octalNum = 070;  // 八进制的56
var octalNum2 = 079; // 无效的八进制数值-解析为79
var octalNum3 = 08; //无效的八进制数值-解析为8

注:八进制字面量在严格模式下是无效的,会导致支持该模式的Javascript引擎抛出错误。

3.十六进制字面值的前两位必须是0x,后面跟任何十六进制数字(0~9及A~F)。其中,字母A~F可以大写,也可以小写。
如下所示:

var hexNum1  = 0xA;   //十六进制的10
var hexNum2  = 0x1f;   //十六进制的31

注:在算术计算时,所有的八进制和十六进制表示的数值最终都将被转换成十进制数值。


浮点型

1.所谓的浮点型,就是数值必须包含一个小数点,并且小数点后面必须至少有一位数数字。以下是浮点型的几个例子:

var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1;     //有效,但不推荐。

注:虽然小数点前面可以没有整数,但我们不推荐这种写法。


2.由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机的将浮点数值转换为整数值。

显然,如果小数点后面没有任何数字,那么这个数值就可以作为整数值来保存。

同样的,如果浮点数值本省表示的就是一个整数(如1.0),那么该值也会被转换为整数。如下面例子:

var  floatNum1 = 1.;      //小数点后面没有数字-解析为1
var  floatNum2 = 10.0;  //整数-解析为10

3.对于那些极大或极小的数值,可以用e表示法(即科学技术法)表示的浮点数值表示。

用e表示法表示的数值等于e前面的数值乘以10的指数幂。e也可以是大写的E。如下面例子:

var floatNum = 3.125e7;     //等于31250000
 
也可以用E表示法表示极小的数值。
 
 
NaN
 
NaN,即非数值(Not a Number是一个特殊的数值,这个数值用于一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误)
 
NaN本身有两个非同寻常的特点。首先涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多次计算中可能导致问题。其次,
Nan与任何数值都不相等,包括NaN自身。例如下面那段代码会返回false:
 
alert(NaN == NaN);   // false
 
针对NaN的这两个特点,ECMAScript定义了isNaN()函数。
这个函数接受一个参数,该参数可以是任何类型,而函数会帮助们确定这个参数是否“不是数值”。
isNaN()在接到一个值后,会尝试的将这个值转换为数值。某些不是数值的会直接被转换成数值,例如字符窜"10"或Boolean值。
而任何不能转换为数值的值都会导致该函数返回true。如下面的例子:
 
alert(isNaN(NaN));        // true
alert(isNaN(10));          // false(10是一个数值)
alert(isNaN("10"));       //false(可以被转换为数值10) 
alert(isNaN("blue"));      // true(不能转换为数值) 
alert(isNaN(true));       // false(可以被转换成数值1)
 
数值转换
 
有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。
第一个函数,即Number()可以用于任何数据类型,而另外两个则专门用于把字符串转换为数值。
这3个函数对于同样的输入会返回不同的结果。
 
Number()函数的转换规则如下:
 
如果是Boolean值,true和false将分别被转为1和0。
如果是数值,只是简单的传入和返回。
如果是null值,返回0.
如果是undefined,则返回NaN。
如果是字符串,遵循下列规则:
  1. 如果字符串只包含数字(包括前面带正号和负号的情况),则将其转换为十进制数值,即"1"会变成1,"123"会变成123,"011"会变成11(注意:前导的0被忽略) 。
  2. 如果字符中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样也会被忽略前导0)。
  3. 如果字符串包含有效的十六进制,例如"0xA",则将其转换为相同大小的十进制数值。
  4. 如果字符窜是空的(不包含任何字符),则将其转换为0;
  5. 如果字符串中包含除上述格式之外的字符,则将其转换为NaN。
如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回值。如果转换的结果是NaN,则调用对象的toString()方法然后再依照前面的规则转换返回的字符串值。
 
下面几个具体的例子:
 
var num1 = Number("Hello world");      //NaN
var num2 = Number("");      //0
var num3 = Number("000001")   // 1
var num4 = Number(true);     // 1
 
针对于上述用Number()把字符串转换成数字太过于繁杂,z在处理整数时,ECMAScript经常使用parseInt()函数进行转换。
 
parseInt()的转换机制:首先会看是否符合数值模式->在忽略字符串面前的空格,直到找到第一个非空字符->进行判断,如果第一个是非数字字符或者负号,则返回NaN
 
->如果第一个是数字字符,则解析第二个字符,直到解析完后续所有字符,或则遇到一个非数字字符。
 
1.2.6 string类型
 
String类型用于表示由零或多个Unicode字符组成的字符系列,即字符串。字符串可以由单引号('')或双引号("")表示,因此下面两种字符串都写法都是有效的:
 
var firstname = "cqs";
 
var firstname = 'cqs';
 
说明:用双引号与用单引号表示字符串没有什么区别,但是以双引号开头的字符串必须以双引号结尾,单引号的也一样。下面这种字符串表示方法是错误的:
 
var firstname = "cqs';   // 语法错误
 
1.字符字面量
 
String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者有其他用途的字符。这些字符字面量如下表所示:
  字面量                                                 含义
    \n                             换行
   
    \t                              制表

   \b                              退格

   \r                               回车

   \f                               进纸

    \\                              斜杠

   \'                               单引号('), 在用单引号表示的字符串中使用。例如:"‘He said,\'hey.\'"

   \"                               双引号("),在用双引号的表示的字符串中使用。例如:"He said,\"hey.\""

   \xnn                           以十六进制代码nn表示的一个字符(其中0-F)。 例如,\x41表示A

   \unnnn                       以十六进制代码表示的一个Unicode字符(其中n为0-F)。例如,\u003a3表示一个希腊字符

 
说明:这些字符字面量可以出现在字符串中的任何位置,而且也将作为一个字符串来解析,如下面的例子所示:
 
var text = "This is the letter sigma:\u03a3";
 
这个例子中的变量text有28个字符,其中6个字符长度的转义系列表示1个字符。
 
任何字符串的长度都可以通过访问其length属性取得,例如:
 
alert (text.length);   // 输出28
 
注:这个属性返回数包括16位字符数的数目。如果字符串中包含双字节字符,那么length属性可能不会精确的赶回字符串中的字符数目。
 
 
2.字符串的特点
 
ECMAScript 中的字符串是不变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个字符串,首先要销毁原来的字符串,然后再用
 
另一个包含新值的字符串填充该变量。例如:
 
var lang = "Java";
 
lang = lang + "Script";
 
上面这例子
 
 
3.转换字符串
 
转换成字符串的方法有两种。
 
1.toString(),几乎每个值都有这种方法,这个方法唯一要做的就是返回相应值得字符串表现。如下面的例子:
 
var age = 11;
 
var ageAsstring = age.toString();         //字符串"11"
 
var found = true;
 
var foundAsString = found.toString;    //  字符串"true"
 
注:null 和 defined值没有这个方法。
 
多数情况下调用toString()方法不必传递参数,但在调用数值的toString()的方法时,可以传递一个参数:输出数值的基数。
默认情况下,toString()方法以十进制格式返回数值的字符串表示。然而可以通过传递参数,toString()方法可以输出二进制
、八进制、十六进制,乃至任意有效进制格式表示的字符串值。如下所示:
 
var num = 8;
 
alert(num.toString());           // "8"
 
alert(num.toString(2));         //  "1010"
 
alert(num.toSrting(8));       // "12"
 
alert(num.toString(10));       // "8"
 
alert(num.toString(16));       // "a"
 
 
2.String()方法:在不知道当前要转换的值是不是null或undefined的情况下,可以使用转型函数String(),这个函数能够将任何类型
类型的值转换为字符串。String()函数遵循下列转换规则:
 
如果值有String()方法,则调用该方法(没有参数)并返回相应的值;
如果值是null,则返回"null";
如果值是undefined,则返回"undefined";
 
 
1.2.7object 类型
 
在ECMAScript中对象其实就是一组数据和功能的集合。
 
对象可以通过执行new操作符后跟要创建的对象类型的名称创建。
 
var o = new Object();
 
注:在ECMAScript中Object类型是所有它的实例的基础。换句话说,Object类型具有的任何属性和方法也同样存在于更具体的对象中。
 
Object的每个实例都具有下列属性和方法。
 
1.Constructor:保存着用于创建当前对象的函数。
 
2.hasOwnProperty(propertyName):用于检查给定的属性在当前你对象实例中(而不是在实例的原型中)是否存在。其中作为参数的属性名(propertyName)必须以字符串形式指定。
 
3.isPrototypeof(object):用于检查传入的对象是否是另一个对象的原型。
 
4.propertyIsEnumberable(propertyName):用于检查给定的属性是否能够使用for-in语句。作为参数的属性名必须以字符串形式指定。
 
5.toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
 
6.toString():返回对象的字符串表示。
 
valueOf(): 返回对象的字符串、数值或布尔值表示。糖厂与toString()方法的返回值相同。

 

posted @ 2017-03-25 16:24  北落师门丨  阅读(119)  评论(0编辑  收藏  举报