es5

来源:互联网 发布:淘宝关键词搜索人气 编辑:程序博客网 时间:2024/06/06 09:27

ECMAScript 概述

  1. Javascript是一门编程语言,运行的环境是虚拟机(chrome是v8,别的浏览器也有),这个虚拟机在标准内称作javascript的运行时,这个运行时本身就是javascript的宿主环境了,不过在浏览器端,也把浏览器称作它的宿主环境(虚拟机寄宿在浏览器内)。

  2. ECMAScript 最初被设计为 Web 脚本语言 ,提供了一种机制,使浏览器里的网页更加活跃,成为基于 Web 的客户 - 服务器架构的一部分执行服务器计算。ECMAScript 可以为各种宿主环境提供核心的脚本功能,因此本文档为不依赖特定宿主环境的核心脚本语言作出规范。

概述

1.Web 脚本语言

WEB 浏览器为引入客户端计算能力而提供 ECMAScript 宿主环境,例如,它提供的对象有:windows,menus,pop-ups,dialog boxes,text areas,anchors,frames,history,cookies 及输入 / 输出等等。进一步来说,WEB 浏览器中提供的这种宿主环境,它提供了一种方式,使得脚本代码可以去处理诸如改变焦点、页面和图片的加载、卸载、错误和放弃,选择,表单提交和鼠标交互等等事件。脚本代码出现在 HTML 中,显示出来的页面是一个用户接口元素与固定的和计算出来的文本和图片的集合。脚本代码根据用户的交互而做出反应,并不需要存在一个主程序。

WEB 服务器为了服务端的计算则提供了一个完全不一样的宿主环境,包括的对象有:requests,clients,files 以及数据锁定和分享的机制。通过浏览器端脚本及服务端脚本的配合使用,在为基于 WEB 方式的应用程序提供定制的用户接口时,可以将计算分布到客户端和服务端进行。

每一种支持 ECMAScript 的 WEB 浏览器和服务器都将它们自身的宿主环境作为 ECMAScript 的补充,以使得 ECMAScript 的执行环境变得完整。

2.语言概述

ECMAScript 是基于对象的:基本语言和宿主设施都由对象提供,ECMAScript 程序是一组可通信的对象。ECMAScript 对象 (objects) 是 属性 (properties) 的集合,每个属性有零个或多个 特性 (attributes),它确定怎样使用此属性。例如,当设置一个属性的 Writable 特性为 false 时,任何试图更改此属性值的 ECMAScript 代码的都会运行失败。属性是持有其他 对象 (objects), 原始值 (primitive values), 函数 (functions) 的容器。原始值是以下内置类型之一的成员:Undefined,Null,Boolean,Number,String;对象是剩下的内置类型 Object 的成员;函数是可调用对象 (callable object)。方法 (method) 是通过属性与对象关联的函数。ECMAScript 定义一组内置对象 (built-in objects),勾勒出 ECMAScript 实体的定义。这些内置对象包括 全局对象 (global object) ,Object 对象 ,Function 对象 ,Array 对象 ,String 对象 ,Boolean 对象 ,Number 对象 ,Math 对象 ,Date 对象 ,RegExp 对象 ,JSON 对象,和 Error 对象: Error ,EvalError ,RangeError ,ReferenceError ,SyntaxError ,TypeError ,URIError 。ECMAScript 中还定义一组内置运算符 (operators)。ECMAScript 运算符包括 一元运算符 ,乘法运算符 ,加法运算符 ,按位移位运算符 ,关系运算符 ,相等运算符 ,二进制位运算符 ,二进制逻辑运算符 ,赋值运算符 ,逗号运算符。ECMAScript 语法有意设计成与 Java 语法类似。ECMAScript 的语法是松散的,使其能够作为一个易于使用的脚本语言。例如,一个变量不需要有类型声明,属性也不需要与类型关联,定义的函数也不需要声明在函数调用词句的前面。

3.对象

对象可以通过各种方式创建,包括字面符号,或通过 构造器 创建对象然后运行代码初始化其全部或部分属性值,为这些属性分配初始值。每个构造器是一个拥有名为“prototype”的属性的函数。此属性用于实现 基于原型的继承 和 共享属性 。构造器通过 new 表达式创建对象:例如,new Date(2009,11) 创建一个新 Date 对象。不使用 new 调用一个构造器的结果,依赖构造器本身。例如,Date() 产生一个表示当前日期时间的字符串,而不是一个对象。不同于基于类的对象语言,属性可以通过赋值的方式动态添加给对象。也就是说,构造器并不是非要对构造的对象的全部或任何属性命名或赋值。

4.ECMAScript 的严格模式变体

ECMAScript 语言认可有些用户希望限制使用语言中某些功能的可能性。他们这样做可能是为了安全考虑,避免他们认为是容易出错的功能,获得增强的错误检查,或其他原因。为了支持这种可能性,ECMAScript 中定义了语言的严格变体。语言的严格变体,排除了 ECMAScript 语言的某些特定的语法和语义特征,还修改了某些功能的详细语义。严格变体还指定了必须抛出错误异常报告的额外错误条件,即使在非严格的语言形式下这些条件不属于错误。ECMAScript 的严格变体通常被称为语言的 严格模式 (strict mode)。严格模式选择使用的 ECMAScript 严格模式的语法和语义,明确地适用于个别 ECMAScript 代码单元级别。由于严格模式适用于选择的语法代码单元级别,严格模式仅在这个代码单元内施加有局部效果的限制。严格模式不限制或修改任何必须运行在多个代码单元的 ECMAScript 语义层面。一个 ECMAScript 程序可由严格模式和非严格模式的代码单元组成。在这种情况下,严格的模式只适用于严格模式代码单元内实际执行的代码。要符合这一规范,ECMAScript的实现必须同时实现未限制的ECMAScript    语言和按照这个规范定义的ECMAScript的严格模式变体。此外,实现还必须支持未限制的和严格模式代码单元的在同一个程序中混用。.

5.术语定义

(1)原始值 (primitive value):原始值直接代表语言实现的最底层的数据。(2)对象 (object)对象类型的成员。对象是属性的集合,并有一个原型对象。原型可以是空值。(3)构造器 (constructor):创建和初始化对象的函数对象。构造器的“prototype”属性值是一个原型对象,它用来实现继承和共享属性。(4)原型 (prototype)为其他对象提供共享属性的对象。当构造器创建一个对象,为了解决对象的属性引用,该对象会隐式引用构造器的“prototype”属性。通过程序表达式 constructor.prototype 可以引用到构造器的“prototype”属性,并且添加到对象原型里的属性,会通过继承与所有共享此原型的对象共享。另外,可使用 Object.create 内置函数,通过明确指定原型来创建一个新对象。(5)原生对象 (native object)ECMAScript 实现中,并非由宿主环境,而是完全由本规范定义其语义的对象。标准的原生对象由本规范定义。一些原生对象是内置的,其他的可在 ECMAScript 程序执行过程中构建。(6)内置对象 (built-in object)由 ECMAScript 实现提供,独立于宿主环境的对象,ECMAScript 程序开始执行时就存在。标准的内置对象由本规范定义,ECMAScript 实现可以指定和定义其他的。所有内置对象是原生对象。一个内置构造器 (built-in constructor) 是个内置对象,也是个构造器。(7)宿主对象 (host object)由宿主环境提供的对象,用于完善 ECMAScript 执行环境。任何对象,不是原生对象就是宿主对象。(8)布尔对象 (Boolean object)对象类型的成员,它是标准内置构造器 Boolean 的一个实例。通过使用 new 表达式,以一个布尔值作为参数调用 Boolean 构造器来创建布尔对象。由此产生的对象包含一个值为此布尔值的内部属性。一个 Boolean 对象可以强制转换为布尔值。(9)字符串值 (String value)原始值,它是零个或多个 16 位无符号整数组成的有限有序序列。一个字符串值是字符串类型的成员。通常序列中的每个整数值代表 UTF-16 文本的单个 16 位单元。然而,对于其值,ECMAScript 只要求必须是 16 位无符号整数,除此之外没有任何限制或要求。(10)NaN值为 IEEE 754“Not-a-Number”的数字值

记法约定

1.语法和词法的文法

(1) 一个 上下文无关文法 由一定数量的 产生式 (productions) 组成。每个产生式的 左边 (left-hand side) 是一个被称为非终结符 (nonterminal) 的抽象符号, 右边 (right-hand side) 是零或多个非终结符和 终结符 (terminal symbols) 的有序排列。任何文法,它的终结符都来自指定的字母集。当从一个叫做 目标符 (goal symbol) 的特殊非终端符组成的句子起始,那么给出的上下文无关文法就表示 语言 (language),即,将产生式右边序列的非终结符当作左边,进行反复替换的结果就成为可能的终结符序列集合(可能无限)。(2)词法和正则的文法 空白和注释之外的输入元素构成 ECMAScript 语法文法的终结符,它们被称为 ECMAScript 的 tokens。这些 tokens 是,ECMAScript 语言的保留字,标识符,字面量,标点符号。此外,行结束符虽然不被视为 tokens,但会成为输入元素流的一部分,用于引导处理自动插入分号( 7.9 )。空白和单行注释会被简单的丢弃,不会出现在语法文法的输入元素的流中。如果一个 多行注释 (MultiLineComment)(即形式为“/ ... /”的注释,不管是否跨越多行)不包含行结束符也会简单地丢弃,但如果一个 多行注释 包含一个或多个结束符,那么,注释会被替换为一个行结束符,成为语法文法输入元素流的一部分。  只用一个冒号“:”作为分隔符分割语法词法的产生式。  两个冒号“::”作为分隔符分割词法和正则的文法产生式。词法和正则的文法共享某些产生式。 三 冒号“:::”作为分隔符分割数字字符串文法的产生式。(3)数字字符串文法   用于转换字符串为数字值的一种文法。此文法与词法文法的一部分(与数字字面量有关的)类似,并且有终结符 SourceCharacter。(4)语法文法(5)JSON 文法   JSON 文法用于将描述 ECMAScript 对象的字符串转换为实际的对象。   两个冒号“::”作为分隔符分割 JSON 词法文法的产生式。JSON 词法文法使用某些 ECMAScript 词法文法的产生式。JSON 语法文法与 ECMAScript 语法文法类似。JSON 语法文法产生式被一个冒号“:”作为分隔符分割。(6) 文法标记法 因此,非终结 IterationStatement 实际上有 8 个右侧变体。 如果文法定义的冒号后面出现文字“one of”,那么其后一行或多行出现的每个终结符都是一个选择定义。例如,ECMAScript 包含的词法文法生   产器: NonZeroDigit :: one of 1 2 3 4 5 6 7 8  9如果产生式的右侧是出现“[empty]”,它表明,产生式的右侧不包含终结符或非终结符。  如果产生式的右侧出现“[lookahead ∉ set]”,它表明,给定 set 的成员不得成为产生式紧随其后的 token。这个 set 可以写成一个大括号括起来的终结符列表。为方便起见,set 也可以写成一个非终结符,在这种情况下,它代表了这个非终结符 set 可扩展所有终结符。例如,给出定义DecimalDigit :: one of0 1 2 3 4 5 6 7 8 9DecimalDigits ::DecimalDigitDecimalDigits DecimalDigit在定义LookaheadExample ::n [lookahead ∉ {1 , 3 , 5 , 7 , 9}]DecimalDigitsDecimalDigit [lookahead ∉ DecimalDigit ]当一个词法文法产生式或数字字符串文法中出现多字符 token,它表示此字符序列将注册一个 token。使用词组“but not“可以指定某些不允许在产生式右侧的扩展,它说明排除这个扩展。例如,产生式:

2.算法约定

此规范通常使用带编号的列表来指定算法的步骤。这些算法是用来精确地指定 ECMAScript 语言结构所需的语义。该算法无意暗示任何具体实现使用的技术。在实践中,也许可用更有效的算法实现一个给定功能。为了表达清晰,算法的步骤可细分为有序的子步骤。子步骤被缩进,可以将自身进一步划分为缩进子步骤。大纲编号约定用于识别分步骤,第一层次的子步骤适用小写字母标记,第二层次的子步骤使用小写罗马数字标记。如果需要超过三个层次,则重复这些规则,第四层次使用数字标记。例如 : 1.Top-level step   a.Substep.    b.Substep      i.Subsubstep.      ii.Subsubstep.        1.Subsubsubstep           a.Subsubsubsubstep  如果算法定义“抛出一个异常”,算法的执行将被终止,且没有返回结果。已调用的算法也被终止,直到算法步骤使用术语“如果一个异常被抛出 ...”明确指出异常处理。一旦遇到这种算法步骤,异常将不再被视已发生过。
源代码文本
 用 3.0 或更高版本 Unicode 字符编码的一个字符序列来表示 ECMAScript 源文本。该文本预期已经正常化为 Unicode Technical Report #15 中描述的 Unicode 正常化形式 C(canonical composition)。符合 ECMAScript 的实现不要求对文本执行正常化,也不要求将其表现为像执行了正常化一样。为了目的,此规范 ECMAScript 的源文本被假定为一个 16 位代码单元,本规范的目的序列。这样的包含 16 位代码单元序列的源文本可能不是有效的的 UTF-16 字符编码。如果实际的源文本没有用 16 位代码单元形式编码,那么必须把它看作已经转换为 UTF-16 一样处理。 语法:

ES5新特性:理解 Array 中增强的 9 个 API

  1. 为了更方便的对JS中Array的操作,ES5规范在Array的原型上新增了 9个 方法,分别是forEach、filter、map、reduce、reduceRight、some、every、indexOf 和 lastIndexOf,本文将对这几个方法进行详细的讲解,并对每一个方法进行原型扩展,以兼容不支持ES5的浏览器.

    2.forEach(callback[,thisArg])

    var arr=[‘a’,’b’,’c’];
    arr.forEach(function(v,i,r){
    console.log(v,i,r);
    })
    从输出的接口可以看出,callback中传入了3个参数v,i,r 分别表示当前元素、当前位置、数组对象。再看看使用thisArg的例子:
    var obj={
    print:function(a,b){
    console.log(a,b);
    }
    };
    var arr=[‘a’,’b’,’c’];
    arr.forEach(function(v,i,a){
    this.print(v,i);
    },obj);
    不传thisArgs时,callback中的 this 默认指向window对象,当传递thisArg时,callback中的this就指向了thisArg,因此这个参数的目的就是为了改变回调函数中的this指向。
    对于不支持ES5的浏览器,我们可以对forEach进行简单的扩展来兼容老的浏览器
    if(!Array.prototype.forEach){
    Array.prototype.forEach=function(callback,thisArg){
    for (var i=0;i

0 0
原创粉丝点击