代 码 之 家
☆╭╮╭╮の
╭☆┴┴☆╮
│╭╮╭╮ │
╰○--○╯

一、Javascript是什么

Javascript实现由以下3个不同的部分组成:

  • 核心(ECMAScript)
  • 文档对象模型(DOM)
  • 浏览器对象模型(BOM)

ECMASript是一个重要的标准,它并不与任何具体浏览器相绑定。Web浏览器对于ECMAScript来说是一个宿主环境,在其他环境(如Macromedia用在Flash中的ActionScript)都有ECMAScript的实现。

二、ECMAScript基础

1、在ECMAScript中,变量可以存放两种类型的值,即原始值引用值。原始值存储在栈(stack)中,引用值存储在堆(heap)中,存储在变量处的是一个指针。

2、ECMAScript有5种原始类型,即Undefined、Null、Boolean、Number和String。

  • Undefined:该类型只有一个值,即undefined,当声明的变量未初始化时,变量的默认值是undefined
  • Null:值undefined实际是从null派生来的,null用于表示尚未存在的对象。
  • Boolean:有两个值,即true或false。
  • Number:Number类型有几个特殊值,如Number.MAX_VALUE、Number.POSITIVE_INFINITY、NaN等。NaN表示非数(Not a Number)。NaN一般发生在类型(String等)转换为数值失败时,判断一个值是否是NaN可使用isNaN()函数。
  • String:在许多语言中,字符串被看作引用类型,而ECMAScript打破了这一传统。String类型存储的是Unicode字符。

3、引用类型

  • Object类:ECMAScript中的所有类都从Object类继承而来,Object类中的所有属性和方法都会出现在其他类中。
    Object类具有下列属性:
    ◇Constructor——创建对象的函数(构造函数)的引用。Object类该属性指向的Object()函数
    ◇Prototype——对象的对象原型的引用。对于所有的类,它默认返回Object对象的一个实例。
    Object类还有几个方法:
    ◇HasOwnProperty(property)——判断对象是否有某个特定的属性,property为属性名
    ◇IsPrototypeOf(object)——判断该对象是否为另一个对象的原型
    ◇PropertyIsEnumerable(property)——判断给定的属性是否可以用for...in语句进行枚举
    ◇ToString()——返回对象的原始字符串表示
    ◇ValueOf——返回最适合该对象的原始值。对于许多类,该方法返回的值都与ToString()的返回值相同。
  • Boolean类:Boolean类是Boolean原始类型的引用类型。
  • Number类:Number类是Number原始类型的引用类型。
    Number类有几个与格式化数值相关的方法:
    ◇toFixed()——返回具有指定位数小数的数字的字符串表示。
    ◇toExponential()——返回科学记数法表示的数字的字符串表示。
    ◇toPrecision()——根据最有意义的形式来返回数字的预定或指数形式。
    以上这三个方法都会进行舍入操作。
  • String类:String类是String原始类型的对象表示法。
    String类具有大量的方法:
    ◇charAt()——返回指定位置的字符
    ◇charCodeAt()——返回指定位置字符的ASCII码
    ◇concat()——连接字符串,不过一般使用加号(+)连接字符串更多
    ◇indexOf()——从开头位置检索子串的索引
    ◇lastIndexOf()——从结尾位置开始检索子串的索引
    ◇localeCompare()——比较字符串
    ◇slice()和substring()——获取指定的子字符串
    ◇toLowerCase()和toLocaleLowerCase()——小写转换
    ◇toUpperCase()和toLocaleUpperCase()——大写转换
    String类的所有属性和方法都可应用于String原始值上,因为它们是伪对象。其他引用类型也一样。

4、运算符

  • 一元运算符(delete):删除之前定义的对象属性或方法的引用,delete运算符不能删除开发者未定义的属性和方法,如不能删除原始的ECMAScript的方法toString()
  • 一元运算符(void):使任何值都返回undefined。该运算符通常用于避免输出不应该输出的值。如
    <a href='javascript:void(window.open('about.blank'))">click me</a>
    这使window.open调用返回undefined,它不是有效的值,不会显示在浏览器窗口中。记住,没有返回值的函数真正返回的都是undefined。
  • 所有整数字面量都默认存储为有符号整数,只有用ECMAScript的位运算符才能创建无符号整数。
  • 逻辑运算符(AND):由双和号(&&)表示,逻辑AND运算并不一定返回Boolean值
    ◇如果一个运算数是对象,另一个是Boolean值,返回该对象
    如果两个运算数都是对象,返回第二个对象
    ◇如果某个运算数是null,返回null
    ◇如果某个运算数是NaN,返回NaN
    ◇如果某个运算数是undefined,发生错误
  • 逻辑运算符(OR):由双竖线(||)表示,逻辑OR运算并不一定返回Boolean值
    ◇如果一个运算数是对象,另一个是Boolean值,返回该对象
    如果两个运算数都是对象,返回第一个对象
    ◇如果某个运算数是null,返回null
    ◇如果某个运算数是NaN,返回NaN
    ◇如果某个运算数是undefined,发生错误
  • 无论何时比较一个数字和一个字符串,ECMAScript都会把字符串转换成数字。如果字符串不能转换成数字,会返回NaN。根据规则,任何包含NaN的关系运算都要返回false。
  • 如查一个运算数是Boolean值 ,在检查相等性之前,把它转换成数字值。false转换成0,true转换成1。
  • 如果两个运算符都是对象,比较相等性实际是比较它们的引用值。
  • 全等号(===)和非全等号(!==)所做的和等号(==)和非等号(!=)相同,只是它们在检查相等性前,不执行类型转换。

5、语句

  • for...in用于枚举对象的属性,propertyIsEnumerable()是ECMAScript中专门用于说明属性是否可以用for...in语句访问的方法。 下面语句用于显示BOM window对象的所有属性:
    for (sProp in window) {
         alert(sProp);
    }

6、函数

  • 如果函数无明确的返回值,或调用了没有参数的return语句,那么它真正返回的值 是undefined。
  • ECMAScript中的函数不能重载。
  • ECMAScript的函数可以接受任意个数的参数。使用特殊对象arguments,无需明确命名参数,就可以重写函数。利用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”
  • ECMAScript的函数只不过是一种引用类型
  • 函数名只是指向函数的引用变量,可以把函数作为变量传递给另一个函数使用
  • Function对象的valueOf方法和toString方法都返回函数的源代码

三、对象基础

1、 ECMAScript的对象(object)像一个集合,可以随时添加新的属性或方法。

2、 对象由特性(attribute)构成,特性可以是原始值,也可以是引用值,如果特性存放的是函数,它将被看作对象的方法(method),否则该特性被看作属性(property)。

3、 ECMAScript无用存储单元收集程序,意味着不必专门销毁对象来释放内存。把对象的所有引用都设置为null,可以强制性地废除对象。如果一个对象有两个或更多引用,则要正确废除该对象必须将其所有引用都 设置为null

4、 “独立于宿主环境的ECMAScript实现提供的对象”称为本地对象native object)。ECMA-262定义的类包括:

Object               Function           Array                 String

Boolean             Number            Date                  RegExp

Error                 EvalError          RangeError         ReferenceError

SyntaxError       TypeError         URIError

5、 Array类:

创建Array类对象:

var aValues = new Array()

创建指定大小的Array对象:

var aValues = new Array(20);

创建不指定大小的Array对象:

var aColors = new Array()

aColors[0] = “red”;

aColors[1] = “green”;

aColors[2] = “blue”;

创建并初始化Array对象

var aClors = new Array(“red”, “green”, “blue”);

数组可以根据需要增大或减小。数组增大时没有赋值的位置都会填上null,如:

var aColors = new Array(“red”, “green”, “blue”);

Alert(aColors.length);           // ouputs “3”

aColors[25] = “purple”;

alert(aColors.length);           // outputs “26”

可以用字面量表示定义Array对象,即使用方括号“[”和“]”,用逗号分隔值。

var aColors = [“red”, “green”, “blue”];

Array类的toString()方法和valueOf方法,返回特殊的字符串。该字符串是通过对每项调用toString()方法转为字符串后,用逗号“,”把它们连接在一起构成的。

join()方法也是用来把Arrray各项连接成字符串的。它只有一个参数,可以指定分隔符。如:

alert(aColors.join(“][“));          // outputs   “red][green][blue][“

字符串通过split()方法能转换为数组。当split()的参数为空字符串时,返回的数组中的每个项是字符串的字符。如:

var sColors = “green”

var aColors = sColors.split(“”);

alert(aColors.toString());                   // ouputs “g,r,e,e,n”

Array常用方法:

Ø concat():将参数中的项附加到数组末尾。如:
var aColors2 = aColors.concat(“yellow”, “purple”);

Ø slice():返回指定位置的数组项。如:
var aColors = [“red”, “green”, “blue”, “yellow”, “purple”];
var aColros2 = arr.slice(1);
var aColors3 = arr.slice(1, 4);
alert(aColors2.toString());                      // outputs “green,blue,yellow,purple”
alert(aColors3.toString());                     // outputs “green,blue,yellow”

Ø Array对象提供了两个方法push()pop()push()方法用于在Array结尾添加一个或多个项,pop()方法用于删除最后一个数组项(length-1),并把该项作为函数的返回值。利用push()pop()方法可把Array对象模拟为一个栈(stack)

Ø shift():删除数组中的第一个项,并返回该项作为函数返回值。利用shift()push()方法可把Array对象模拟为一个队列(queue)

Ø unshift():把一个项放在数组的第一个位置,然后把余下的项向下移动一个位置。

Ø reverse():颠倒数组。

Ø sort():按升序排序数组项。根据字符代码(ASCII)大小排序。

Ø splice():最复杂的方法,功能是把数据项插入数组的中部。该方法用于插入这些项的方式的变体大有用途:
删除——当只声明两个参数时,就可以删除数组的任意多个项。如arr.splice(0, 2)将删除数组arr中的前两项。
替换——声明三个参数时,可以把指定的数据项替换掉。这三个参数的意义是起始位置,删除的数组项的个数,要插入的项。如arr.splice(2, 2, “red”, “green”)将把位置2处的两项删除,并把”red””green”插入到该位置,达到替换的目的。

6.         内置对象是指独立于宿主环境,由ECMAScript在程序开始时就实例化的对象。ECMA-262只定义了两个内置对象,即GlobalMath

7.         Global对象是ECMAScript最特别的对象,因为根本看不到它的存在。之前章节介绍的函数isNaN()isFinite()等都是Global对象的方法。而且Grobal对象的方法不止这些。

encodeURI()encodeURIComponent()——encodeURI用于对完整的URL进行编码,而encodeURIComponent用于处理URI的一个片断。这两个方法可代替BOMescape()方法。

decodeURI()decodeURIComponent()——用于对编码的URI进行解码。这两个方法可代替BOMunescape()方法。

eval()——该方法就像整个ECMAScript的解释程序,接受一个参数,参数是即要执行的ECMAScript字符串。例如:
eval(“alert(‘hi’)”);
这行代码的功能行等价于下面的代码:
alert(“hi”);
当解释程序发现eval()调用时,它将把参数解释为真正的ECMAScript语句,然后把它插入该函数所在的位置。这意味着eval()调用内部引用的变量可在参数以外定义:
var msg = “hello world”;
eval(“alert(msg)”);          // outputs “hello world”

8.         Math对象包括许多专门用于执行简单的及复杂的数学计算的方法。

ceil()——向上舍入函数

floor()——向下舍入函数

round()——标准的舍入函数,即四舍五入

random()——返回一个01之间的随机数,不包括01。可用下面的形式调用random()方法,在某个范围内选择随机数:
number = Math.floor(Math.random() * total_number_of_choices + first_possible_value)

9.         所有非本地对象都是宿主对象(host object),即由ECMAScript实现的宿主环境提供的对象。所有BOMDOM对象都是宿主对象。

10.     关键字this总是指向调用该方法的对象,例如:
var oCar = new Object();
oCar.color = “red”;
oCar.showColor = function(){
        alert(this.color);              // outputs “red”
};
使用this,可在任意多个地方重用同一个函数。例如:
function showColor(){
        alert(this.color);
}

var oCar1 = new Object;
oCar1.color = “red”;
oCar1.showColor = showColor;

var oCar2 = new Object;
oCar2.color = “blue”;
oCar2.showColor = showColor;

oCar1.showColor();                   // outputs “red”
oCar2.showColor();                  // outputs “blue”

 

11.     定义类或对象。

工厂方式

构造函数方式,像工厂方式一样,构造函数方式也会重复生成函数,为每个对象都创建独立的函数版本。不过,与工厂方式相似,也可以用外部函数重写构造函数。

原型方式,利用对象的prototype属性,能使多个对象共享相同的函数,不好的是构造函数不能有参数,当属性指向的是一个对象时,多个实例也会共享该对象

混合的构造函数/原型方式,结合了两种方式的优点,这是目前使用最广泛的类定义方式。例如:

  function Car(sColor, iDoors, iMpg){           // 构造函数方式定义属性
    this.color = sColor;
    this.doors = iDoors;
    this.mpg = iMpg;
    this.drivers = new Array(“Mike”, “Sue”);
}

Car.prototype.showColor = function(){               // 原型方式定义函数,使多个实例能共享相同的函数
    alert(this.color);
};

var oCar1 = new Car(“red”, 4, 23);
var oCar2 = new Car(“blue”, 3, 25);

oCar1.drivers.push(“Matt”);

alert(oCar1.drivers);                   // outputs “Mike,Sue,Matt”
alert(oCar2.drivers);                 // outputs “Mike, Sue”

动态原型方法,动态原型方法的优点是可以把属性定义和函数定义把封装在一起,不用分开定义。

混合工厂方式,与经典的工厂方式不同,这种方式可以使用new运算符,使它更像真正的构造函数。不过同经典的工厂方式存在相同的问题,不建议使用。

posted on 2009-12-13 16:15  娜娜  阅读(248)  评论(0编辑  收藏  举报