跳至侧栏

Ch3 JS Language Basics

1.严格模式(Strict Mode)

 

   ECMAScript 5 引入了严格模式(Strict Mode)的概念,对于

JavaScript 来说是一种更加严格的解析和执行模式。
   要为整个脚本使用严格模式,在脚本的顶部加入下面的语句:

 

      "use strict";

 

   要让一个函数使用严格模式,方法如下:

 

      function doSomething(){
    "use strict";
    //function body
      }

 

2.变量的声明与作用域

 

   (1)在一个代码块内部,使用 var 关键字声明的变量为局部变量,作
用域仅在直接包含该代码块的函数或对象的内部;不使用 var 关键字声
明而直接初始化的变量为全局变量。最好不要直接初始化变量而不先声
明这个变量。
   (2)在使用一个 var 关键字和逗号声明多个变量时,同类型的变量放
在同一行,不同类型的变量不放在同一行,并且使用缩进。虽然这不是
必须的,但这样做可以增加可读性,例如:

 

      var message = “hi”, name = "Jim Green", 
          found = false,
          age = 29;

 

3.typeof 运算符

 

   (1)typeof 运算符可以返回变量的数据类型,其返回结果是一下情况
之一:
      “undefined”(值未定义)
      “boolean”(值是布尔类型)
      “string”(值是字符串类型)
      “number”(值是数值类型)
      “object”(值是对象类型)
      “function”(值是函数类型)
   (2)typeof 运算符的使用示例如下:
         var message = “some string”;
         alert(typeof message);    //”string”
         alert(typeof(message));   //”string”
         alert(typeof 95);         //”number”
   (3)typeof 是一个运算符,而不是一个函数,圆括号不是必需的。
      调用 typeof null 返回的结果是 “object”,因为 null 被认为是
   一个空对象的引用。
      对于正则表达式,typeof 在多数浏览器中的返回结果是“object”,
   少数浏览器返回的结果是"function"。

 

4.Undefined 类

 

   (1)Undefined 类型只有一个值 undefined。如果一个使用 var 声明的
变量未被初始化,则其默认值是 undefined。可以将 undefined 显示地
赋给一个变量,但通常不建议这么做。
   (2)值为 undefined 的变量与未定义的变量是不同的。引用一个值
为 undefined 的变量的结果是 undefined,引用一个未被定义变量的结
果将产生错误。
   但 typeof 运算符作用于这两种变量的结果都将是 undefined,这样
将会产生歧义,所以通常最好总是初始化一个变量。
   delete 运算符作用于一个未声明的变量不会产生错误,但在严格模
式下则会产生错误。

 

5.NULL 类型

 

   (1)NULL 类型只有一个值 null。它实际上是一个空对象指针。
   (2)值 undefined 是 null 的衍生,因此 ECMA-262 定义二者是相等的,
如下:

 

      alert(null == undefined);   //true

 

6.Boolean 类型

 

   (1)Boolean 类型只有 true 和 false 两个值,并且与数值类型不同。
因此,true 与 1 和其它非零值不相等,false 与 0 也不相等。这与 C#
的布尔类型相似。
   (2)所有类型的值都有与之对应的 Boolean 值。使用 Boolean() 转换
函数可将一个值转换为与之定对应的 Boolean 值,转换的结果是 true 
还是 false取决于数据类型和其值。各种转换情况如下:

 

     数据类型   转换结果为 true 的情况   转换结果为 false 的情况
 --------------------------------------------------------------------
     Boolean    true                      false 
     String     非空字符串                “” (空字符串) 
     Number     任何数值                0, NaN
     Object     任何对象                  null 
     Undefined  n/a                       undefined 
   在 if 语句中,会自动地(隐式)将各种类型的值转换为 Boolean 类型的值,
这在功能检测技术中很有用。

 

7.Number 类型

 

   (1)JavaScript中的数值类型可以用十进制、十六进制和八进制进行
表达,其方式与其它 C 语言风格的编程语言类似,但是,八进制在严
格模式下会引发错误。
   (2)对于很大或很小的数,可以使用指数表示形式,指数的底数为大
写或小写的 E,例如:
      var floatNum = 3.125e7;    //equal to 31250000
   (2)浮点运算对于某些值来说得不到预期的结果。例如 0.1 和 0.2 
相加的结果将是 0.30000000000000004 而非 0.3。

 

8.值的范围

 

   基于 ECMAScript 标准的 JavaScript 并不能表示所有的值,绝对值
特别大和特别小的值不能超出一定范围。
   最小的值存储在 Number.MAX_VALUE 属性中,在大多数浏览器中为 
5e-324;最大值存储在 Number.MAX_VALUE 属性中,在大多数浏览器中为
1.7976931348623157e+308。
   如果一个值超出了范围,则用 Infinity 表示。正值为  Infinity,
负值为 - Infinity。为正或负 Infinity 的值不能参与运算。
   isFinite()函数可用于判断一个值是否超出范围,返回值为 true 时,
没有超出范围,返回值为 false 时超出范围。例如:

 

      var result = Number.MAX_VALUE + Number.MAX_VALUE;
      alert(isFinite(result));    //false

 

   Number.NEGATIVE_INFINITY 属性和 Number.POSITIVE_INFINITY 属性
中分别存储值 -Infinity 和 infinity。

 

9.NaN

 

   NaN(Not a Number的简称)是一个特殊的数值,如果一个返回数值
的操作失败,结果就是NaN。例如,任何数除以 0 的结果在其它一些语
言中都会产生错误,程序停止执行;而在 JavaScript 中的结果就是 NaN
,程序可以继续执行。
   任何 NaN 参与的运算的结果也将是 NaN。NaN 不等于任何值,甚至
不等于NaN本身。
   函数 isNaN() 用于判断一个值是否为 NaN。它接受一个参数,参数
可以是任何数据类型。isNaN() 会试图将传入的参数转换为数值类型,
能够转换为数值类型将返回 false,不能够转换为数值类型则返回 true。
例如:

 

      alert(isNaN(NaN));       //true
      alert(isNaN(10));        //false - 10 是一个数值
      alert(isNaN(“10”));      //false - 可以被转换为数值 10
      alert(isNaN(“blue”));    //true - 不能够被转换为数值
      alert(isNaN(true));      //false - 可以被转换为数值 1

 

10.数值转换函数

 

   (1) Number( arg ):参数 arg 可以是任何数据类型,对于不同的数
据类型,其转换规则较为复杂,与 + 运算符相同,具体可参见本书。
在许多运算符和运算操作中,都会隐式地调用这个函数将其它数据类型
的值转换为数值类型的值进行运算或操作。例如:

 

      var num1 = Number(“Hello world!”);  //NaN
      var num2 = Number(“”);              //0
      var num3 = Number(“000011”);        //11
      var num4 = Number(true);            //1

 

   (2) parseInt( arg ):arg 是字符串类型,例子如下:

 

      parseInt(“   55”);          // 55
      parseInt(“ 55  66  ”);      // 55
      parseInt(“+”);              // NaN
      parseInt(“-”);              // NaN
      parseInt(“+5”);             // 5
      parseInt(“-5”);             // -5
      parseInt(“a5”);             // NaN
      parseInt(“0.5”);            // 0
      parseInt(“.5”);             // NaN
      parseInt(“1234blue”);       // 1234
      parseInt(“”);               // NaN
      parseInt(“0xA”);            // 10 - hexadecimal
      parseInt(22.5);             // 22
      parseInt(“70”);             // 70 - decimal
      parseInt(“0xf”);            // 15 - hexadecimal

 

   但是,像 "070" 这样以 0 开头的数字字符串,ECMAScript 3 将按
照八进制进行解析并转换为十进制,结果将是56;而 ECMAScript 5 无
论在严格模式还是非严格模式下,转换结果都将是 0;IE 9 转换结果
是70,FireFox 10 和 Chrome 17 转换结果都是 56。

 

   (3) parseInt( arg, radix ):参数 arg 为字符串;参数 radix 指
定按照何种进制进行转换,但无论按照何种进制进制进行转换,最终结
果都是十进制的。例如:
      parseInt(“0xAF”, 16);      // 175
      parseInt(”AF”, 16);        // 175
      parseInt(”AF”);            // NaN
      parseInt(“10”, 2);         // 2 - 作为二进制解析
      parseInt(“10”, 8);         // 8 - 作为八进制解析
      parseInt(“10”, 10);        // 10 - 作为十进制解析
      parseInt(“10”, 16);        // 16 - 作为十六进制解析
  (4) parseFloat(arg):参数 arg 为字符串。例子如下:
parseFloat(“1234blue”);    //1234 - integer
parseFloat(“0xA”);         //0
parseFloat(“22.5”);        //22.5
parseFloat(“22.34.5”);     //22.34
parseFloat(“0908.5”);      //908.5
parseFloat(“3.125e7”);     //31250000
11.字符串

 

   (1)字符串的值可以用双引号包围,也可以用单引号包围,二者无本
质区别。
   (2)length属性用于获取字符串所包含的字符的个数,包含转义字符
的字符串长度,由转义后的结果决定。
   (3)字符串是不可改变的,例如:

 

         var lang = “Java”;
         lang = lang + “Script”;
   在完成后一个语句后,lang将是一个新的变量,“Java”和“Script”被
销毁。这些工作都是在幕后完成。
   (4)toString()方法用于将数据转换为字符串,几乎任何数据类型和值
都有这个方法。但是,如果值为 null 或 undefined 则该方法不可用。
   toString(radix)方法可接受一个参数,用于将数值型字符串以指定的
进制输出,例如:
      var num = 10;
      alert(num.toString());       //”10”
      alert(num.toString(2));      //”1010”
      alert(num.toString(8));      //”12”
      alert(num.toString(10));     //”10”
      alert(num.toString(16));     //”a”
   (5) String( arg )方法用于将数据转换为字符串。如果数据的值具有
toTring() 方法,则调用之;如果值为 null,则转换结果为"null";如
果值为 undefined,则转换结果为"undefined"。
   也可以使用 + 运算符将一个空字符串""与值相加达到转换为字符串
的目的。
12.运算符

 

   (1) ++ 和 --运算符除了可以操作数值类型数据外,也可以操作其他
数据类型,但是,其它数据类型将按照一定规则转换为相应数值类型。
   (2)位运算的效率比较高。位运算符可以直接操作数值型数据,NaN 和
Infinity 被当 0 处理。其它数据类型的数据将会被转换为数值类型进
行运算,运算结果页将是数值类型。数值类型的正值用纯二进制表示,
负值使用二进制补码表示。
   (3) ~ 运算符是位运算中的求补运算符,在数值上,~ num 与 
- ( num + 1 ) 的结果是相等的。但前者效率更高。
   (4) || 是二元逻辑或运算符,它的结果并不总是返回一个布尔值。只
要它的第一个操作数为对象类型,则返回第一个操作数;如果第一个数为
false,则返回第二个数;如果第一个数为 null,则返回第二个数;如果
两者都是 null,NaN,则返回相应的 null 或 NaN;只要有一个变量未被
声明,结果都将产生错误。由于||运算符的这些特性,下面的赋值语句使
用很普遍:

 

   // 当 preferredObject 不为 null 可用时,myObject的结果为 
   // preferredObject。如果 preferredObject 为 null,则结果
   // 为 backupObject。
   var myObject = preferredObject || backupObject;
   (5) + 是加法运算符。如果参与运算的两个值为数值类型,则按照数学
加法运算;如果都为字符串,则连接字符串;如果只有一个为字符串,则
另一个被转换为字符串,然后连接。例如:

 

   var num1 = 5,var num2 = 10;
   var message1 = “The sum of 5 and 10 is “ + num1 + num2;
   alert(message2);    //”The sum of 5 and 10 is 510”
   var message2 = “The sum of 5 and 10 is “ + (num1 + num2);
   alert(message2);    //”The sum of 5 and 10 is 15”
   (6) - 作为二元减法运算符时,如果参与运算的两个值都为数值类型,
则按数学减法运算,否则,将非数值型的值先转换为数值型,再按照数学
减法运算。

 

13.流程控制语句 

 

   (1) for-in 语句用于枚举一个对象的所有属性,形式如下:

 

      for (property in expression) statement
   例子如下:
      // 枚举 window 对象的所有属性
      for (var propName in window) {
         document.write(propName);
      }
   如果被枚举的对象为 null 或 undefined 则会产生错误。但是在
ECMAScript 5 规范下不会出错,仅仅不执行循环体。
   (2)标签语句用于标识以后使用的语句。它通常用在嵌套循环中被 break
continue 语句引用。形式如下:

 

      label: statement
   例子如下:

 

      var num = 0;
      outermost:
      for (var i = 0; i < 10; i++)
      {
         for (var j = 0; j < 10; j++)
         {
            if (i == 5 && j == 5)
            {
               break outermost;   // 终止执行外部的 for 语句
                                  //(内部 for 语句也将终止)
            }
            num++;
         }
      }
      alert(num);    // 55

 

   (3) with 语句尽管可以减少代码量,但是性能较差,而且不利于调试。
所以实践中要避免使用。
   (4) switch语句中的表达式可以是任何数据类型。case 的值不仅可以
是常量,也可以是变量和表达式。switch 语句在幕后使用 === 运算符进
行值的比较,因而不会强制类型转换。

 

14.函数 

 

   (1)无论函数在定义时有多少个形参,在调用函数时,传递的实参个数
可以为任意多个,多于、少于、等于形参的个数都可以,甚至没有实参。
所有的参数都是按值传递,引用传递是不可以的。
   (2) arguments 对象可以在函数内部访问,以获取每个实参的值以及参
数的个数。参数的个数由实参决定。
   arguments 对象类似于数组,可以通过方括号获取单个参数的值,例如:
arguments[0],arguments[1] 等等。如果有命名形参,则索引号由小到大
与对应形参的顺序对应。
   length 是 arguments 的属性,用于获取实参的个数。
   例如:

 

      function doAdd()
      {
         if (arguments.length == 1)
         {
            alert(arguments[0] + 10);
         } else if (arguments.length == 2)
         {
            alert(arguments[0] + arguments[1]);
         }
      }
      doAdd(10);        //20
      doAdd(30, 20);    //50

 

   (3)形参与 arguments 对象中对应的值总是保持一致,一个改变则对应
的也将改变,但严格模式下改变不会影响彼此。
   如果实参个数少于形参个数,则未传递对应实参的形参在函数内部访问
值为 undefined,即使使用 arguments 对象对其赋值,其值也不会被改变,
仍然是 undefined,但可以直接对其赋值,但严格模式下会改变这些行为。
   例如:

 

      function testFunc(num1, num2)
      {                                      // 若调用仅传递一个参数
         alert(num1 + " " + arguments[0]);   // 5 5
         arguments[0] = 10;
         alert(num1 + " " + arguments[0]);   // 10 10
         num1 = 11;
         alert(num1 + " " + arguments[0]);   // 11 11
         alert(num2 + " " + arguments[1]);   // undefined undefined
         arguments[1] = 12;
         alert(num2 + " " + arguments[1]);   // undefined 12
         num2 = 13;
         alert(num2 + " " + arguments[1]);   // 13 12
      }
      testFunc(5);

 

   (4)由于 JavaScript 中函数的以上性质,函数不能重载,但可以通过
检查参数的类型和个数来模拟函数重载。
   如果先后定义了多个重名的函数,则调用时调用的是最后一个被定义
的同名函数。
   (5)没有必要在函数定义时指定返回值的类型,在函数内部可以随时用
return 语句返回值或空返回(退出函数)。未指定返回值的函数实际上会
返回 undefined。
posted @ 2012-12-26 16:22  JiayangShen  阅读(288)  评论(0编辑  收藏  举报
Top
推荐
收藏
关注
评论