ecmascript基础

57
新业务新人培训课程计划 ECMAScript基础》 F2E 霸先

Upload: enmaai

Post on 13-Jul-2015

899 views

Category:

Technology


0 download

TRANSCRIPT

新业务新人培训课程计划

《ECMAScript基础》

F2E 霸先

• ECMAScript历史

• ECMAScript描述

• ECMAScript主要术语

• ECMAScript内部属性

• ECMAScript组成

• ECMAScript对象描述

• JSON

• ECMAScript历史

• ECMAScript描述

• ECMAScript主要术语

• ECMAScript内部属性

• ECMAScript组成

• ECMAScript对象描述

• JSON

ECMAScript[ek - ma - script]

Javascript历史

• 1992年,Nombas公司开发了一种名叫C-minus-minus(Cmm)的嵌入式脚本

语言

• Cmm被打包到共享软件CEnvi中,Nombas公司将Cmm更名为ScriptEase

• Netscape Navigator开始流行,Nomas公司开发了可以嵌入到网页中的CEnvi

版本,这种嵌入CEnvi的早起试验性网页被叫做Espresso Pages(浓咖啡版网

页),这就是www上首次使用脚本语言的标志。

• 1995年2月,Netscape发布Netscape Navigator 2,Brendan Eich开发了

LiveScript,为了赶工Netscape和Sun结成同盟,为了搭java的顺风车,把

LiveScript改名为javascript

• Javascript 1.0大获成功,Netscape在Netscape Navigator 3中发布Javascript

1.1

• 微软在Internet Explorer 3中加入名为Jscript的javascript

• Javascript 1.1、Jscript、CEnvi三种版本并存,没有标准,javascript标准化

推上日程

ECMA-262诞生

• 1997年,以javascript 1.1为蓝本的建议被提交给了欧洲计

算机制造商协会ECMA(European Computer

Manufacturers Association)

• ECMA指定39号技术委员会(TC39,Technical Committee

#39)负责“标准化一种通用、跨平台、供应商中立的脚本

语言的语法和语义”(http://www.ecma-

international.org/memento/TC39.htm)。

• TC39经过数月努力完成了ECMA-262(ECMAScript的标

准)

• 1998年4月,ISO/IEC JTC 1采用了ECMAScript作为标准

(ISO/IEC 16262),之后一直简称ECMA-262,目前发展

到第五版。

目前ECMA-262实现

目前大部分浏览器实现的是第三版

• ECMAScript历史

• ECMAScript描述

• ECMAScript主要术语

• ECMAScript内部属性

• ECMAScript组成

• ECMAScript对象描述

• JSON

ECMA-262语言描述

• ECMAScript最初的设计是一种网页脚本语言。

• 脚本语言是一种编程语言,可用来操作、自定义、自动化现有系统中的设

备。

• 在某些系统中,一些可用的功能是可以通过用户接口来使用的。而脚本语

言,就是将这些功能暴露给编程人员进行控制的机制。这样的系统,我们可

以 说,它们为我们提供了一个运行脚本语言的宿主环境。脚本语言是专门给

专业和非专业的编程人员使用的,为了适应非专业的程序员,有些方面多少

有些不太严格。

脚本语言与宿主环境是两个不同的主体,比如,浏览器就为ECMAScript提供

了一个宿主环境,BOM和DOM则都是浏览器提供的功能,而各种基于

ECMA262实现的脚本语言,如JavaScript,Jscript等,都可以为我们提供对

BOM和DOM的操作方法。因为宿主环境的不同,它们提供 的功能也不尽相

同,这也是我们知道的,不同的浏览器中会有不同的BOM和DOM的属性和方

法。

ECMA-262语言描述

• ECMAScript是基于对象(object-based)的编程语言,在宿

主环境中执行计算或操作对象。ECMAScript程序就是一

个 对象间交互通信的聚合。 在ECMAScript中,“对

象”(object)的properties是一个无序的集合,properties 是

一个容器,可以包含其他的对象,原始值

(primitive values)或方法(methods)。

原始值属于下列“内置类型”(built-in types)中的一员:

Undefined, Null, Boolean, Number和String,“对象 ”则是内

置类型:Object,“方法”是一个透过property关联到对象的

函数。

ECMA-262语言描述

• ECMAScript定义了“内置对象”(built-in objects),以使ECMAScript实体更为完

善。这些内置对象包括:Global对象,Object对象, Function对象,Array对

象,String对象,Boolean对象,Number对象,Math对象,Date对象,

RegExp对象和错误对象:

Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIErro

r。

• ECMAScript还定义了“内置操作符”或者说是“函数”或“方法”。ECMAScript操

作符包括了各种一元运算符、乘除运算符、加减法运算符、位移运算符、关

系运算符、相等运算符、二元运算符、二元逻辑运算符、分配运算符和逗号

运算符。

• ECMAScript的语法类似Java的语法。ECMAScript语法宽松是为了使它能够

成为更容易使用的脚本语言。比如,变量不需要申明类型也不需要为

properties指定类型,函数定义也可以不需要出现在它们的调用语句之前。

• ECMAScript历史

• ECMAScript描述

• ECMAScript主要术语

• ECMAScript内部属性

• ECMAScript组成

• ECMAScript对象描述

• JSON

ECMA-262主要术语

• Type

数据值的集合

• Primitive Value

原始值包括Undefined,Null,Boolean,Number,String这些类型成员。原

始值是语言实现中底层可以直接表示的数据。

• Object

每个对象都是Object类型的成员。它包含的所有属性成员,如原始

值、对象或者函数,是一个无序的集合。对象属性成员放置的函数又

被称为方法。

• Constructor

构造器是一个函数对象,用来创建和初始化对象。每个构造器都有一

个关联的原型对象用来实现属性成员的继承和共享。

ECMA-262主要术语

• Prototype

ECMAScript中的原型用来实现对象结构、状态和行为的继承。当一个构造器

构造了一个对象,这个对象会隐含地引用到该构造器关联的原型去解析属性

的 引用。构造器关联的原型可以通过程序表达式constructor.prototype 来引

用。在某个共享对象的原型上添加的属性值,通过继承,可以被所有其他对

象共享。

• Native Object

原生对象是由ECMAScript的实现提供的,独立于宿主环境。有些原生对像同

时又是内置对象,其他的则可能会在执行一个 ECMAScript程序时产生。

• Built-in Object

内置对象是由ECMAScript的实现提供的,独立于宿主环境,它们出现在

ECMAScript程序开始执行的时候。所有的内置对象都是原生对象。

• Host Object

宿主对象由为ECMAScript提供完整执行环境的宿主环境提供的。任何对象,

不是原生对象,就是宿主对象。

ECMA-262主要术语

• Undefined Value

Undefined值是一个原始值,当一个变量没有被分配值的时候使用。

• Undefined Type

Undefined类型只有一个值,undefined。

• Null Value

Null值是一个原始值,它表示空的,没有的,或不存在的引用。

• Null Type

Null类型有一个值,null。

• Boolean Value

Boolean值是Boolean类型的成员,它只能是两个值中的一个,true或false。

• Boolean Type

Boolean类型表示一个逻辑实体,由两个唯一值组成,一个是true,另一个是false。

• Boolean Object

Boolean对象是Object类型的成员,它是内置对象Boolean的实例。意思是,一个

Boolean对象是通过Boolean构造器的 new表 达式创建,提供一个boolean参数。结果

对象有一个隐含的(未命名)原型boolean。一个Boolean对象支配一个 Boolean值。

ECMA-262主要术语

• String Value

String值是String类型的成员,它是一个有限的有序的,0到16位无符号整数长度的值。注意:尽管

每个值通常都表示一个单独的16位的UTF-16文本的单元,但该语言不会做出任何限制和要求当这

个值不是16位无符号整数的情况时。

• String Type

String类型是所有字符串值的集合。

• String Object

String对象是Object类型的成员,它是内置对象String的实例。

• Number Value

Number值是Number类型的成员,它是一个直接表示的数字。

• Number Type

Number类型是表示数字的值的集合。在ECMAScript中,该集合表示IEEE754的64位双精度运算格

式的值,包含一个特殊值"Not-a- Number"(NaN),正无穷大和负无穷大。

• Number Object

Number对象是Object类型的成员,它是内置对象Number的实例。

• Infinity

原始值Infinity表示一个正无穷大的数字,Number类型成员。

• NaN

原始值NaN表示IEEE标准"Not-a-Number"值的集合,Number类型成员。

• ECMAScript历史

• ECMAScript描述

• ECMAScript主要术语

• ECMAScript内部属性

• ECMAScript组成

• ECMAScript对象描述

• JSON

ECMAScript内部属性

• [[Prototype]]

This对象的原型,该属性值只会是一个object或null,所有的

[[Prototype]] chain最终都都会通向到null。

• [[Class]]

指明This对象类别的字符串值

• [[Value]]

与This对象关联的内部状态信息

• [[Get]](PropertyName)

返回指定属性的值

• [[Put]](PropertyName Value)

设置指定的属性值

• [[CanPut]](PropertyName)

返回是否可以执行[[Put]]指定属性的操作的Boolean值

• [[HasProperty]](PropertyName)

返回对象是否存在指定的属性名的Boolean值

ECMAScript内部属性

• [[Delete]](PropertyName)

移除对象指定的属性

• [[DefaultValue]](Hint)

返回对象的默认值,只能是原始值,不允许对象和引用。

• [[Construct]] a list of argument values provied by the caller

通过调用new操作符构造一个对象。

• [[Call]] a list of argument values provied by the caller

通过函数调用表达式执行与对象关联的代码。

• [[HasInstance]](Value)

返回一个Boolean值,表示This对象是否存在指定的委派(实例),

仅对ECMAScript native中的Function对象实现。

• [[Scope]]

作用域链,用于表示一个函数对象执行时的环境。

• [[Match]](String,Index)

为正则表达式匹配和返回一个MatchResult的值。

• ECMAScript历史

• ECMAScript描述

• ECMAScript主要术语

• ECMAScript内部属性

• ECMAScript组成

• ECMAScript对象描述

• JSON

ECMA-262组成

• 语法

• 关键字

• 保留字

• 变量

• 类型

• 语句

• 操作符

• 对象

符合ECMA-262规范的脚本编程语言必须实现该规范描述的所有的“类型、值、对象、属

性、函数和程序语法及语义”,并且必须支持Unicode字符标准(UCS)。在此基础上,每

个具体实现还可以指定“额外的类型、值、对象、属性和函数”,可以定义新的“程序和正则

表达式语法”等。

语法

• 区分大小写

– Ecmascript中的一切,比如变量、函数名、操作符都区分大小写。

• 标识符

– 标识符就是变量、函数、属性、函数参数的名字

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

– 其他字符可以是字符、下划线、美元符号或数字

– 保留字、关键字、null、true、false不能用做标识符

• 注释

– //单行注释

– /* javascript code */多行注释

• 语句

– 语句以分号结尾,如果没有分号则由解析器确定结尾

– {}表示代码块,if else语句在多行的时候才要求使用代码块(我们推荐任何

时候都使用代码块)

关键字和保留字• 关键字

• 保留字

break else new var case

finally return void catch for

switch while continue function this

with default if throw delete

in try do instanceof typeof

abstract enum synchronized short boolean export

interface static implements extends long super

char native debuggerv int class float

package throws volvatile goto private transient

final byte protected const double import

public

变量• 松散类型

可以保存任何类型的值,但我们不推荐这么做

变量使用var来定义,函数内部定义的为局部变量,不使用var的为全局变量

类型

• 简单数据类型:

–Undefined

–Null

–Boolean

–Number

–String

• 复杂数据类型

–Object

Undefined类型

• Undefined类型只有一个特殊值undefined;

• 变量在已声明未初始化的时候值就是undefined

var taobao;

alert(taobao); // ‘undefined’

• 未声明的变量在typeof操作符检测其类型的时候值也为

undefined

var a;

alert(typeof a); // ‘undefined’

alert(typeof b); //‘undefined’

alert(b) // error ‘b is undefined’

Null类型

• Null类型只有一个特殊值null;

• null值表示一个空对象指针

var taobao = null;

alert(typeof taobao); // ‘object’

• undefined是派生于null的,ecma规定这两个值比较是相

等的

alert(null == undefined); // true

Boolean类型

• Boolean类型有两个值true和false

• 要将其他类型转换成Boolean可以调用Boolean()或者!!操

作符

Number类型• Number类型使用IEEE754格式来表示整数和浮点数

• 分十进制、八进制、十六进制,八进制必须以0开头数字范围0~7,十六进制以0x或0X开头数字范

围0~9,A~F,a~f,进行数字计算的时候都会转换为十进制

• 可以使用科学计数法表示

• 数值范围Number.MAX_VALUE(1.7976931348623157e+308)~Number.MIN_VALUE(5e-324),如

果超出范围会转换成Infinity和-Infinity,这两个值不能用于计算,可使用isFinite()检测

• NaN,这是个特殊值,任何涉及NaN的操作都会返回NaN,NaN不等于任何值

• 可以使用Number()、parseInt()、parseFloat()进行数值转换

• 浮点数,占用内存为整数的2倍,最大精度17位

var a = 0.1;

var b = .1; //不推荐

var c = 1.0;

alert(0.11+0.12) // 0.22999999999999998 IEEE754bug

1.toFixed(2) // Syntax error 这里的点是小数点不是方法引用

(1).toFixed(2) // ‘1.00’

String类型

• String类型用于表示由零或多个16位Unicode字符组成的字符序列,

可以用引号或单引号表示

• 有特殊的转义字符,\n、\t、\b、\r、\f、\\、\’、\”、\xnn、\unnnn

• 字符串可以用toString()和String()来转换,null和undefined没有

toString()方法,Number的toString()有两种模式

Object类型

• 对象是一组数据和功能的集合,通过new操作符来创建

var a = new Object();

var b = new Object; //不推荐

var c = {};

• Object每个实例都具有下列属性和方法

constructor 创建当前对象的函数

hasOwnProperty(propertyName) 检查给定的属性在当前实例中是否存在

isPrototypeOf(object) 检查传入的对象是否是另一个对象的原型

propertyIsEnumerable(propertyName)

检查给定属性是否能够使用for-in语句

toString() 返回对象的字符串表示

valueOf() 返回对象的字符串、数字或布尔值表示

操作符

• 一元操作符

• 位操作符

• 布尔操作符

• 乘性操作符

• 加性操作符

• 关系操作符

• 相等操作符

• 条件操作符

• 赋值操作符

• 逗号操作符

一元操作符• delete,强制解除引用

var taobao = {foo:111};

delete taobao.foo;

alert(taobao.foo) // undefined

• void,对任意值返回undefined

• typeof,返回’undefined’,’number’,’string’,’boolean’,’object’,’function’

• instanceOf,需指定要检测的类型

• 递增和递减(++和--)– ++num,--num,num++,num—

– 这4种操作符不仅适用于整数,还可以用于字符串、布尔值、浮点数、对象

• 一元加减– 一元加对数值不会产生影响,一元减用于表示负数

– 一元加作用域非数值时会进行Number()转换,一元减将结果转换为负数

位操作符• 位运算符是按内存中表示数值的位来操作数值

• ECMA中所有整数默认都以有符号整数存储,只有位运算符才能创建无符号整数

• 有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。数值范围

从 -2147483648 到 2147483647。

• 位运算符NOT(~)

– 实际上是对数字求负然后减1,处理过程如下:

1. 把运算数转换成 32 位数字

2. 把二进制数转换成它的二进制反码

3. 把二进制数转换成浮点数

• 位运算符AND(&)

– 直接对数字的二进制形式进行运算,把每个数位上的数字对齐,1&1=1,其他均为0

• 位运算OR(|)

– 对齐规则0|0=0,其他均为1

• 位运算XOR(^)

– 对齐规则有一个1的时候返回1,其他均为0

• 左移运算(<<)

– 把数字所有位数左移指定的数量,用0填充空位,保留符号位

• 有符号右移运算(>>)

– 把数字所有位数右移指定数量,用符号位的值填充空位,保留符号位,与左移相反

• 无符号右移运算(>>>)

– 对正数与>>相同,对负数,把负数的二进制码当成正数的二进制码

布尔操作符• 逻辑非(!)

– 运算数为对象、非空字符串、非0数值时返回false,其他均为true

• 逻辑与(&&)

– 如果第一个操作数是对象,返回第二个操作数

– 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会

返回该对象

– 如果两个操作数都是对象,返回第二个操作数

– 有null、NaN、undefined则返回

• 逻辑或(||)

– 如果第一个操作数是对象,返回第一个操作数

– 如果第一个操作数的求值结果为false,则返回第二个操作数

– 如果两个操作数都是对象,返回第一个操作数

乘性操作符

• 乘法(*)

• 除法(/)

• 求模(%)

• 主要注意Infinity、NaN、0为操作数时候的表现

加性操作符

• 加法(+)

– 字符串连接

• 减法(-)

– Infinity、NaN、0

关系操作符• 小于(<)

• 大于(>)

• 小于等于(<=)

• 大于等于(>=)

• 字符串比较的是字符代码

• 任何有NaN参与的关系运算都返回false

• 如果有对象,调用valueOf(),如果没有valueOf()方法,调用toString()方法

• 如果有布尔值,转换为数值再比较

相等操作符• 相等(==)

• 不相等(!=)

• 相等和不相等都会进行类型转换– 执行类型转换的规则如下:

– 如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。

– 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。

– 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。

– 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

– 在比较时,该运算符还遵守下列规则:

– 值 null 和 undefined 相等。

– 在检查相等性时,不能把 null 和 undefined 转换成其他值。

– 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。

– 如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回

true,否则两个运算数不等。

– NaN != NaN

• 全等(===)

– 两个操作数不需要类型转换就相等的情况下返回true

条件操作符• boolean ? true_value : false_value

赋值操作符• =

• *=

• /=

• %=

• +=

• -=

• <<=

• >>=

• >>>=

逗号操作符

• 用于赋值

– var num = (3,4,5,6,7); // num == 7

• var num1 =1,

num2 = 2,

num3 = 3;

语句

• if语句

• do-while语句

• while语句

• for语句

• for-in语句

• label语句

• break和continue语句

• with语句

• switch语句

if语句

• if (condition) statement1 else statement2

• condition计算不一定为boolean类型,ECMA会使用Boolean()强制转

换成boolean类型,如果为true,执行statement1,如果为false,执

行statement2

• If(condition1){

statement1

}else if(condition2){

statement2

}else{

statement3

}

do-while语句

• do {statement} while (condition)

• statement执行之后再检测condition,statement至少执行一次

• do{

statement1

} while (condition2);

while语句

• while (condition) statement

• 如果condition为true执行statement

• while(condition){

statement

}

for语句

• for (initialization; expression; post-loop-expression) statement

• for 语句是前测试循环,而且在进入循环之前,能够初始化变量,并

定义循环后要执行的代码。

• Initialization、expression和post-loop-expression都是可选的

• 循环内部定义的变量可以在外部访问

• Expression需要有限条件否则会无限循环

for ( ; ; ){

infinitive loop //无限循环

}

for-in语句

• for (property in expression) statement

• For-in语句一般用来枚举对象的属性

label语句

• label : statement

• label语句可以在代码中添加标签以便将来使用,一般配合break和

continue来使用

var iNum = 0;

outermost:

for (var i=0; i<10; i++) {

for (var j=0; j<10; j++) {

if (i == 5 && j == 5) {

break outermost;

}

iNum++;

}

}

alert(iNum); //输出 "55"

break和continue语句

• 用于在循环中精确的控制代码的执行

• break语句会立即退出循环,continue也会立即退出循环,退出循环后

会从循环顶部继续执行

• break和continue语句可以配合label使用,但要避免过度使用

with语句

• with (expression) statement

• 将代码的作用域设定到一个特定的对象中

• 过度使用会造成性能下降,不推荐使用

switch语句• switch (expression) {

case value : statement

break;

case value : statement

break;

default : statement

}

• switch判断值的时候使用===操作符,不做类型转换

• ECMAScript历史

• ECMAScript描述

• ECMAScript主要术语

• ECMAScript内部属性

• ECMAScript组成

• ECMAScript对象描述

• JSON

ECMAScript对象概述• ECMAScript没有像C++,Smalltalk,Java等语言中的真正的类,但是它支持构造器

(constructors)。它在代 码执行时创建对象,为对象分配内存并初始化它们全部或部分

初始值和properties。所有的构造器都是对象,但不是所有对象都是构造器。每个构造

器都 有一个Prototype属性用于实现基于原型的继承(prototype-based inheritance)和属

性共享(shared properties)。

• 对象在对构造器使用new表达式时被创建,比如,new String(“A String”)创建了一个新

的字符串对象。不用new表达式直接去调用一个构造器,其结果将依赖于这个构造器的

具体实现,如,String("A String") 产生一个原始值String,而不是一个对象。

• ECMAScript支持基于原型的继承。所有构造器都有一个相关联的原型,所有由构造器

创建的对象都隐含一个指向到该原型的引用(称为对象原 型),此外,一个原型可能

有一个非空的、隐含的引用,指向到它的原型,所以,这又被称为是:原型链

(prototype chain)

• 当一个引用来自一个对象时,它会去该对象和它的原型(链)中查找与该property同名的

属性,换句话说,会先直接从该对象中检测是否存在这个同名的引用,如果有则返

回,否则再从该对象的原型(链)中去检测是否存在该引用。

JSON

• Just an Object

• {code : 200,ret : {},msg : ‘’}

• http://json.org/

参考资料

• http://www.w3cgroup.com/article.asp?id=293

• http://www.w3school.com.cn/js/js_reference.asp

• 《javascript高级程序设计》第二版

• http://www.w3school.com.cn/js/index_pro.asp

• http://www.ecma-

international.org/publications/standards/Ecma-262.htm