《Professional JavaScript for Web Developers》day03

《Professional JavaScript for Web Developers》day03

1.1ECMAScript语法

1.1.1 区分大小写

1.1.2 标识符

按照惯例,ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写。

#不能把关键字,保留字,true,false和null用作标识符。

1.1.3 注释

关注《JavaScript经典入门-day01》

1.1.4 严格模式

ECMAScript5引入了严格模式(strict mode)的概念。严格模式是为JavaScript定义了一种不同的解析与执行模型。在严格模式下,ECMAScript3中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模式,可以在顶部添加如下代码:

"use strict"

这行代码看起来就像是字符串,而且也没有赋值给任何变量,但其实它是一种编译指示(pragma),用于告诉支持的JavaScript引擎切换到严格模式。这是为了不破坏ECMAScript3语法而特意选定的语法。

在函数内部的上方包含这条编译指示,也可以指定函数在严格模式下执行:

function doSometing(){
    "use strict";
    //函数体
}

严格模式下,JavaScript的执行结果会有很大不同,因此本书将会随时指出严格模式下的区别。

1.1.5 语句

ECMAScript中的语句以一个分号结尾;如果省略分号,则由解析器确定语法的结尾,如下所示:

var sum = a + b  //即使没有分号也是有效语句—不推荐
var diff = a - b;  //有效的语句,推荐

可以使用C风格的语法把多条语句组合到一个代码块中,即代码块以左花括号({)开头,以右花括号(})结尾:

if (test) {
    test = false;
    alert(test);
}

虽然条件控制语句(如if语句)只在执行多语句的情况下才要求使用代码块,但最佳实践是始终在控制语句中使用代码块—即使代码块中只有一条语句,例如:

if (test)
    alert (test);   //有效但容易出错,不要使用
if (test) {
    alert (test);
}                     //推荐使用

在控制语句中使用代码块可以让编码意图更加清晰,而且也能降低修改代码是出错的几率。

1.2 关键字和保留字

以下就是ECMAScript的全部关键字:

break     do    instanceof     typeof

case      else       new       var

catch     finally    return       void

continue     for              switch                    while

debugger *      function      this                        with

default             if                throw                      

delete              in               try

ECMA-262还描述了另外一组不能用作标识符的保留字。尽管保留字在这门语言中还没有任何特定的用途,但它们有可能在将来被用作关键字。以下是ECMA-262第3版定义的全部保留字:

abstract    enum     int     short

boolean    export      interface      static

byte          extends           long             super

char          final                 native          synchronized

class         float                package    throws

const                   goto                private         transient

debugger    implements     protected     volatile

double                import

1.3 变量

ECAMScript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说,每个变量仅仅是一个用于保存值的占位符而已。定义变量时要使用var操作符(注意var是一个关键字),后跟一个变量名,如下所示:

var message;

这行代码定义了一个名为message的变量,该变量可以用来保存任何值(像这样未经过初始化的变量,会保存一个特殊的值—undefined。)ECMAScript也支持直接初始化变量,因此在定义变量的同时就可以设置变量的值,如下所示:

var message = 'hi';

在此,变量message中保存了一个字符串值“hi”。像这样初始化变量并不会把它标记为字符串类型;初始化的过程就是给变量赋一个值那么简单。因此可以在修改变量值的同时修改值的类型,如下所示:

var message = "hi";
message = 100;   //有效但不推荐

有一点要注意,即用var操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说,如果在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁,例如:

function test(){
    var message = "hi"; //局部变量
}
test()
alert(message); //错误!

这里,比变量message是在函数中使用var定义的。当函数被调用时,就会创建该变量并为其赋值。而在此之后,这个变量又会立即被销毁,因此例子中的下一行代码会导致错误。不过,可以下像下面这样省略var操作符,从而创建一个全局变量:

function test(){
    message = "hi";
}
test()
alert(message);  //"hi"

虽然省略var操作符可以定义全局变量,但这也不是我们推荐使用的用法。因为在局部作用域中定义的全局变量很难维护,而且如果有意的忽略了var操作符,也会由于相应变量不会马上就有定义而导致不必要的混乱。给未经声明的变量赋值在严格模式下会导致

Reference Error错误。

可以使用一条语句定义多个变量,只要像下面这样把每个变量用逗号分隔开即可:

var message = "hi",
    found = false,
    age = 29;

1.4 数据类型

ECMAScript中有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有1种复杂数据类型—Object,Object本质上是由一组无序的名值对组成的。ECMAScript不支持任何创建自定义类型的机制,而所有值最终都将是上述6种数据类型之一。

3.4.1 typeof操作符

鉴于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeof 就是负责提供这方面信息的操作符,对一个值使用typeof操作符可能返回下列某个字符串:

1)"undefined"—— 如果这个值未定义;

2)"boolean" —— 如果这个值是布尔值;

3)"string" —— 如果这个值是字符串;

4)"number" —— 如果这个值是数值;

5)"object" —— 如果这个值是对象或null;

6)"function"—— 如果这个值是函数;

下面是几个使用typeof操作符的例子:

var message = "some string";
alert(typeof message); // "string"
alert(typeof (message)); // "string"
alert(typeof 95); // "number"

 1.4.2 Undefined类型

Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是Undefined。

1.4.3 Null类型

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值。(只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。)

1.4.4 Boolean类型

Boolean类型是ECMAScript中使用得最多的一种类型,该类型只有两个字面值:true和false。

1.4.5 Number类型

1)浮点数

对于那些极大或极小的数值,可以用e表示法(即科学计数法)表示的浮点数值表示。下面是一个使用e表示法表示数值的例子:

var floatNum = 3.12e7 // 等于31200000

浮点数值的最高精度是17位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1加0.2的结果不是0.3,而是0.300000000000004。这个小小的舍入误差会导致无法测试特定的浮点值。例如: 

if(a + b == 0.3){
    alert("You got 0.3.");
} // 不要做这样的测试!

这个例子中,我们测试的是两个数的和是不是等于0.3.如果这两个数是0.05和0.25,或者是0.15和0.15都不会有问题。而如前所述,如果这两个数是0.1和0.2,那么测试将无法通过。因此,永远不要测试某个特定的浮点数值。

2)数值范围

由于内存的现直,ECMAScript并不能保存世界上所有的数值。ECMAScript能够表示的最小数值保存在Number.MIN_VALUE 中——大多数浏览器中,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中——在大多数浏览器中,这个值是1.7976931348623157e+308。如果某次计算的结果得到了一个超出Javascript数值范围的值,那么这个数值将被自动转换成特殊的Infinity值。具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个数值是正数,则会被转换成Infinity(正无穷)。

如上所述,如果某次计算返回了正或负的Infinity值,那么该值将无法继续参与下一次的计算,因为Infinity不是能够参与计算的数值。要确定一个数值是不是有穷的(换句话说,是不是位于最小和最大的数值之间),可以使用isFinite()函数。这个函数在参数位于最小与最大数值之间时会返回true,如下面的例子所示:

var result = Number.Max_VALUE + Number.Max_VALUE;
alert(isFinity(result)); // false

尽管在计算中很少出现某些值超出表示范围的情况,但在执行极小或极大数值的计算时,监测监控这些值是可能的,也是必须的。

3)NaN

NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。

NaN本身有两个非同寻常的特点。首先,任何涉及NaN的操作都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN与任何值都不想等,包括NaN本身。例如:

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)

 #尽管有点不可思议,但isNaN()确实也适用于对象。在基于对象调用isNaN()函数时,会首先调用对象的valueof()方法,然后确定该方法返回的值是否可以转换为数值。如果不能,则基于这个返回值再调用toString()方法在测试返回值。而这个过程也是ECMAScript中内置函数和操作符的一般执行流程。

4)数值转换

有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。

1.4.6 String类型

String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号(“”)或单引号(‘’)表示。

1)转换为字符串

要把一个值转换为字符串有两种方式。第一种是使用几乎每个值都有的toString()方法。这个方法唯一要做的就是返回相应值的字符串表现。例如:

var age = 11;
var ageAsString = age.toString(); // 字符串"11"
var found = true;
var foundAsString = found.toString(); // 字符串"true"

数值,布尔值,对象和字符串值都有toString()方法。但null和undefined值没有这个方法。

多数情况下,调用toString()方法不必传递参数。但是,在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。默认情况下,toString()方法以十进制返回数值的字符串表示。而通过传递基数,toString()可以输出以二进制,八进制,十六进制,乃至其他任意有效进制格式表示的字符串值。下面给出几个例子:

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"

在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的数值转换为字符串。String()函数遵循下列转换规则:

01 如果值有toString()方法,则调用该方法并返回相应结果;

02 如果值是null,则返回"null";

03 如果值是undefined,则返回"undefined"。

1.4.7 object类型:略

 

上一篇:sharepoint 开发书籍整理记录


下一篇:手机sd卡中的图片误删?Mac数码相机中的照片丢失?