《JS高级程序设计》PART 2.ECMASCript基础

2011/02/08 读书笔记

2.1 语法

ECMASCript的基础概念如下:

· 区分大小写。

· 变量是弱类型的。与java和c不同,ECMASCript中的变量无特定的类型,定义变量时只用var运算符,可以将它初始化为任意的值。这样可以随时改变变量所存数据的类型(尽管应尽量避免这样做)。

· 每行结尾的分号可有可无。如果没有分号,ECMASCript就把这行代码的结尾看作该语句的结尾,前提是这样没有破坏代码的语义。(注:最好的代码编写习惯是总加入分号,因为没有分号,有些浏览器就不能正确运行)。

· 注释与java、c、php语言相同。单行注释:// 多行注释: /* ^^^ */

· 括号表明代码块。

2.2变量

· var test = “hello”;//由于ECMASCript是弱类型,解释程序会为test自动创建一个字符串值,无需明确的类型申明。

· var test=”hi”,age = 25;//使用同一var语句定义的变量不必具有相同的类型。

· var test;//ECMASCript变量并不一定要求初始化(它们是在幕后完成初始化)

· 在使用变量之前不必一定有声明。ECMASCript的解释程序在遇到未声明的标识符时,用该变量创建一个全局变量,并将其初始化为指定的值。如果不能紧密跟踪变量,这样做也很危险。(注:最好习惯是像其它语言那样,使用前总是声明所有变量)。

eg: stest = stest + “hi”;

变量命名需要遵守的规则:

· 第一个字符必须是字母、下划线(_)或美元符号($);

· 余下的字符可以是下划线、美元符号或任何字母或数字字符。

· 变量命名应遵守以下某条著名的命名规则:

· Camel标记法:首字母小写、接下类的单次都以大写字母开头。eg:var myTestValue;

· Pascal标记法:首字母大写,接下来的单次都已大写字母开头。eg:var MyTestValue;

· 匈牙利类型标记法:在以Pascal标记法命名的变量前附加一个小写字母,说明该变量的类型。eg:var iMyTestValue = 0 , sMyStr = “hi”; (注:推荐使用这种方法,更易阅读)

下面列出匈牙利类型标记法定义ECMASCript变量使用的前缀: <table cellpadding="0" border="1" cellspacing="0" ><tbody > <tr >

类型 前缀
   </tr>        <tr >         
数组 a
   </tr>        <tr >         
布尔型 b
   </tr>        <tr >         
浮点型 f
   </tr>        <tr >         
函数 fn
   </tr>        <tr >         
整数(数字) I
   </tr>        <tr >         
对象 o
   </tr>        <tr >         
正则表达式 re
   </tr>        <tr >         
字符串 s
   </tr>        <tr >         
变型(可以是任何类型) v
   </tr>     </tbody></table>

2.5原始值和引用值

在ECMASCript中,变量可以存放2中类型的值,既原始值和引用值。

· 原始值:是存储在栈中的简单数据段,也就是说,她们的值直接存在变量访问的位置。

· 引用值:是存储在堆中的对象,也就是说,存储在变量出的值是一个指针,指向存储对象的内存处。

为变量赋值时,ECMASCript解释程序需要判断该值是原始类型还是引用类型。原始类型的特征:Undefined、Null,Boolean、数字和string型。由于这些原始类型占据的空间是固定的,所以可以将其存储在较小的内存区域-栈中。这样存储便于迅速查询变量的值。

2.6原始类型

· Undefined类型:

> > 变量未定义,未初始化,以及函数返回无明确的返回值时,都是Undefined。 > > > > var tmp; > > > > alert(tmp == Undefined);//true > >

· Null类型:值Undefined实际上是从null派生而来,因此ECMASCript把它们定义为相等的:

> > alert( null == Undefined); > >

· Boolean类型:有2个值,既true和false;

· Number类型:既可以表示32位整数,又可以表示64位浮点数。

> > 几个特殊的数字类型的值: > > > > Number.MAX_VALUE Number.MIN_VALUE > > > > NaN:表示非数字。NaN一般发生在类型转换失败时。它与自身不相等: > > > > alert(NaN == NaN);// false > > > > 注:不推荐使用NaN值本身,而使用函数isNaN(): > > > > alert(isNaN("blue"));// true > > > > alert(isNaN("3"));//false > >

· String类型

> > 字符串字面常量是由单引号或双引号声明的。ECMASCript中没有字符类型,只有字符串类型,所有单双引号皆可。 > >

2.7转换

1.转换成字符串

· ECMASCript的Boolean、数字和字符串的原始值都是伪对象,都有属性和方法。eg:

> > var sColor = "hello"; > > > > alert(sColor.length);//ouput "5" > >

· 3种主要的原始值Boolean、数字和字符串都有toString()方法,用于转换为字符串。

2.转换为数字

parseInt() 和parseFloat():只有对String类型调用这些方法,才能正确运行,其它类型返回的都是NaN;

3.强制类型转换

ECMASCript可用的3中强制类型转换:

  • Boolean(value):把给定值转换为Boolean型;

  • Number(value):将给定值转换为数字(可以是整数或浮点);注:其处理方法与parseInt及pasrseFloat相似,但是他转换的是整个值,而不是部分值。4.5.6使用parseInt转换后为4.5,而使用Number转换的为NaN。

  • String(value):转换为字符串,可将null也转换为字符串”null”

2.8引用类型(类)

对象是由new加上要实例化的类的名字创建:var o = new object();//括号非必须,但最好写上;

Object.ValueOf():对于许多类,返回最适合该对象的原始值。

eg: var oNum = new Number(99);

oNum.toFixed(2);// 99.00

String类:

length():返回其长度

charAt(pos):返回pos处的字符;

charCodeAt(pos):返回pos处字符的asc码;与此类似:indexOf()/lastIndexOf()

localeCompare():字符串比较;

从字串创建字符串:slice()/substring():与concat()方法一样,这2个方法都不改变String对象自身的值,她们只返回原始的String值,保持String对象不变。

> > 对于负数参数,slice方法会用字符串的长度加上参数,substring则将其作为0处理。(正数2者相同)。 > > > > eg:var oStr = new String("hello world"); > > > > oStr.slice(3,-4);//"lo w" > > > > oStr.substring(3,-4);// "hel" //substring总是把较小的数字作为起始位,substring(3,0)->substring(0,3); > >

大小写转换:toLowerCase()/toLocaleLowerCase()/toUpperCase()/toLocaleUpperCase()

注:String类的所有属性和方法都可以直接用于String原始值上,因为它们是伪对象。


2.9运算符

void:void运算符对任何值都返回Undefined。该运算符通常用于避免输出不应该输出的值,例如,从Html的元素调用js函数时。

click me

2.10语句

ECMASCript和java中的switch语句有2点不同。在ECMASCript中switch语句可以用于字符串,而不能用于不是常量的值说明情况:

var BLUE=”blue”,RED= “red”;

switch(sCol){

case BLUE:…;

case RED:…;

default:…;

}

2.11函数

函数是ECMASCript的核心。函数是由关键字function、函数名加一组参数以及置于括号中要执行的代码声明的。

即使函数有返回值,也不必明确声明。只需要使用return运算符后跟要返回的值即可。

function sum(iNum1,iNum2){

return iNum1 + iNum2;

}

无重载

ECMASCript中的函数不能重载。可用相同的名字在同一个作用域中定义2个函数,而不会引发错误,但真正执行的是后一个函数。

arguments对象

在函数代码中,使用特殊对象arguments,开发者无需指出参数名,就能访问它们。

eg:function howManyArgs(){

alert(arguments.length);

alert(arguments[0]);

}

howManyArgs(“string”,45);//2,”string”

howManyArgs();//0 Undefined

注:与其它程序设计语言不同,ECMASCript不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意格式的参数(最多25个),而不会引发任何错误。任何遗漏的参数都会已Undefined传递给函数,多余的参数被忽略。


Function类

所有函数都应看作是Function类的实例。使用Function类直接创建函数:

var fName = new Function(arg1,arg2,..,function_body);

eg:doAdd = new Function(“iNum”,”alert(iNum+ 100)”);

doAdd.length;//1 函数是引用类型,所以也有属性和方法,其属性length返回所期望的参数个数。

Funtion对象也有valueOf和toString方法,这2个方法返回的都是函数的源代码,在调试时尤其有用。

闭包

ECMASCript最容易让人误解的一点是其支持闭包。所谓闭包,是指词法表示包括不必计算的变量的函数,也就是说,该函数能使用函数外定义的变量。在ECMASCript中使用全局变量是个简单的闭包实例。

Search

    Post Directory