第三章=》基本概念

第三章 基本概念

  基于ECMA-262第三版中定义的ECMAScript介绍这门语言的基本概念

3.1  语法

  ECMAScript的语法大量借鉴了C及其他类C语言(如Java 和 Perl)的语法

  3.1.1 区分大小写

        ECMAScript中的一起(变量、函数名和操作符)都区分大小写。

  3.1.2  标识符

        所谓标识符,就是指变量、函数、属性的名字或者函数的参数。标识符可以是按照下列各式规则组合起来的一或多个字符:

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

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

        为了与ECMAScript内置的函数和对象命名格式保持一致,ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个有意义的单词的首字母大写。

  3.1.3  注释

         // 单行注释

        /*

    多行注释

    */

  3.1.4 严格模式

         ECMAScript 5 引入了严格模式的概念。严格模式是为JS定义了一种不同的解析与执行模型。在严格模式下,ECMAScript3中一些不确定的行为将得到处理,而且对某些不安全的操作会抛出错误。

         整个脚本中启用严格模式,可以在顶部添加如下代码:

         “use strict”;

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

  3.1.5  语句

        ECMAScirpt中的语句以一个分号结尾;如果省略分号,则由解析器确定语句的结尾。语句结尾的分号不是必需的,但是加上分号可以增进代码的性能,因为解析器不必花时间推测应该在哪里插入分号了。

  

3.2 关键字和保留字

       ECMA-262描述了一组具有特定用途的关键字,这些关键字可用于表示控制语句的开始或结束,或者用于执行特定操作等。不用用作标识符

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 

       另外描述了另外一组不能用作标识符的保留字(将来可能被用作关键字)

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 public

       严格模式下,第5版还对以下保留字施加了限制:

       implements  package  public interface private static let protexted yield

       除了上面列出的保留字和关键字,ECMA-262第5版对eval 和 arguments 还施加了限制。在严格模式下,这两个单词也不能作为标识符或属性名

3.3  变量

       ECMAScript的变量是松散类型的,可以用来保存任何类型的数据。每个变量仅仅是一个用于保存值的占位符而已。定义变量时要使用var操作符,后跟变量名。

       var  message = “hi”;

       使用var操作符定义的变量将成为定义该变量的作用域中的局部变量。如果在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁。(省略var操作符可以定义全局变量,但不推荐这种做法,因为会使变量难以维护,导致不必要的混乱,在严格模式下会导致抛出ReferenceError错误)

       可以使用一条语句定义多个变量,只要把每个变量(赋不赋值均可)用逗号分隔开即可:

       var message = “hi”, found ,age=29;

 

3.4  数据类型

       简单数据类型 (基本数据类型):Undefined、Null、Boolean、Number和String。

       复杂数据类型:Object

       3.4.1  typeof 操作符

       typeof可以用来检测给定变量的数据类型,对一个值使用typeof操作符可能返回下列某个字符串:

      “undefined”——如果这个值未定义;

      “boolean”——如果这个值是布尔值;

      “string”——如果这个值是字符串;

      “number”——如果这个值是数值;

      “object”——如果这个值是对象或null;

      “function”——如果这个值是函数。

        typeof操作符的操作数可以是变量,也可以是数值字面量。注意typeof是一个操作符而不是函数。

        3.4.2 Undefined类型

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

        对于尚未声明过的变量,只能执行一项操作,即使用typeof操作符检测其数据类型。然而,令人困惑的是:对未初始化的变量执行typeof操作符会返回undefined值,而对未声明的变量执行typeof操作符同样也会返回undefined值。 

       3.4.3 Null类型

       Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时会返回“object”的原因。  

       实际上, undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true。(不全等)

        3.4.4 Boolean类型

        Boolean类型只有两个字面值:true和false(区分大小写)。

        虽然Boolean类型的字面值只有两个,但ECMAScript中所有类型的值都有与这两个Boolean值等价的值。转型函数Boolean()可以将一个值转换为其对应的Boolean值。

        Boolean转换规则

数据类型

转换为true的值

转换为false的值

Boolean

true

false

String

任何非空字符串

“”

Number

任何非零数字值(包括无穷大)

0和NaN

Object

任何对象

null

Undefined

 

undefined

   这些转换规则对理解流控制语句(如if语句)自动执行相应的Boolean转换非常重要。

       3.4.5 Number类型

       ECMAScript中的Number类型使用IEEE754格式表示整数和浮点数值(浮点数值在某些语言中也被称为双精度数值)。

       a.支持的进制

            最基本的数值字面量格式是十进制整数

            八进制字面值的第一位是零(0),然后是八进制数字序列(0-7)。如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当做十进制数值解析。八进制字面量在严格模式下是无效的。会导致抛出错误。

           十六进制字面量的前两位必须是0x,后跟任何十六进制数字(0-9及a-f)。其中,字母a-f可以大写,也可以小写。

           在进行算数计算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。

         b.浮点数值

        浮点数值,就是数值中包含一个小数点,并且小数点后面至少有一位数字,小数点前面可以没有整数。

        由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转换为整数值。

        对于那些极大或极小的数值,可以用e表示法。用e表示法表示的数值等于e前面的数值乘以10的指数次幂。

        var floatNum = 3.123e7;           // 31230000

  c.数值范围

        由于内存的限制,ECMAScript并不能保存世界上所有的数值。ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中,最大数值保存在Number.MAX_VALUE中。如果某次计算的结果得到了一个超出JS数值范围的值,那么这个数值将被自动转换成特殊的Infinity值(包括-Infinity负无穷)。Infinity不能参加计算。

        isFinite()函数可以确定一个数值是不是又穷的,如果是会返回true。

       d.NaN

        NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。在ECMAScript中,任何数值除以0会返回NaN,因此不会影响其他代码的执行。

        NaN的两个特点:设计NaN的计算都会返回NaN,NaN与任何值都不想等,包括NaN本身。

        isNaN()函数:这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”。该函数在接收到一个值之后,会尝试讲这个之转换为数值,任何不能被转换为数值的值都会导致这个函数返回true。

        e.数值转换

        三个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。Number()可以用于任何数据类型,另两个函数则专门用于把字符串转换成数值。

        Number()函数转换规则

                Boolean:true转换为1,false转换为0

                Number:简单的传入和返回

                Null: null转换为0

                Undefined: undefined转换为NaN

               String: 空字符串“”转换为 0(里面有空格也是转换为0)

                             字符串只包含数字,则转换为十进制数值(会忽略前导0,不论有几个0)

                             字符串包含有效的浮点格式,则转换为对应的浮点数值(只可以有一个小数点,会忽略前导0)

                             如果字符串中包含有效的十六进制格式,例如“0xf”,则将其转换为相同大小的十进制整数值

                            其他情况转换为NaN

              Object:调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次转换返回的字符串值

        parseInt()函数在转换字符串时,更多的是看其是否符合数值模式

        转换规则

                忽略字符串前面的空格,直至找到一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN(空字符串返回0)。如果第一个字符是数字字符,会继续解析第二个字符,知道解析完所有后续字符或者遇到了一个非数字字符

                如果字符串中的第一个字符是数字字符。parseInt()也能够识别出各种整数格式(十进制、八进制、十六进制),如果字符串以“0x”开头且后跟数字字符,就会将其当做一个十六进制整数;如果字符串以“0”开头且后跟数字字符,则会将其当做一个八进制数来解析。

               “034”在ES3中会转换为28  在ES5中会转换为0,在ES6中会转换为34

               可以为这个函数提供第二个参数:转换时使用的基数(即多少进制)。

                 parseInt("034",8)   //28

        parseFloat函数的区别

                字符串中的第一个小数点是有效的,第二个小数点就是无效的了

                会忽略前导0

                只解析10进制

       3.4.6 String类型

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

       1.字符字面量

               字符字面量即转义序列,用于表示非打印字符,或者具有其他用途的字符

               \n 换行  \t制表  \b空格  \r回车  \f进纸  \\斜杠  

               \’  单引号(’)在用单引号表示的字符串中使用。

              例如 'he said \' i like apple\' '=》"he said ' i like apple' "

              \”  双引号(”)在用双引号表示的字符串中使用(同上)

              \xnn  以十六进制代码nn标识的一个字符(其中n为0-f)

              例如   '\x23' =》“#”

              \unnnn  以十六进制代码nnnn表示的一个Unicode字符(其中n为0-f)

            例如   "\u03a3" =》"Σ"

         2.转换为字符串

                 toString()方法  返回相应值的字符串表现。

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

                         多数情况下,调用toString()方法不必传递参数,但是调用数值的toString()方法时,可以传递一个参数:输出数值的基数(默认是十进制)

                String()转型函数,可以讲任何类型的之转换为字符串

                如果值有toString()方法,调用该方法(没有参数),返回相应的结果;

                如果值是null,则返回“null”;

                如果值是undefined,则返回“undefined”

          3.4.7 Object类型

                 ECMAScript中的对象其实就是一组数据和功能的集合。可以通过new操作符后跟要创建的对象类型的名称来创建。创建Object类型的实例并为其添加属性和方法,就可以创建自定义的对象。

                 在ECMAScript中,Object类型是所有它的实例的基础。换句话说Object类型所具有的任何属性和方法也同样存在于更具体的对象中。

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

                             Constructor:保存着用于创建当前对象的函数

                             

                             hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中作为参数的属性名必须以字符串形式指定 

                         

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

                             propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举,作为参数的属性名必须以字符串形式指定

                             toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。

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

                             valueOf(): 返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

3.5 操作符

       ECMAScript-262描述了一组用于操作数据值的操作符,包括算术操作符、位操作符、关系操作符和相等操作符。它们能够适用于很多值,例如字符串、数字值、布尔值,甚至对象。不过,在应用于对象时,相应的操作符通常都会调用对象的valueOf()和toString()方法,一边去的可以操作的值

       3.5.1 一元操作符

               a.递增和递减操作符

                      分为两个版本:前置型和后置型

                      执行前置操作时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种情况通常被称作副效应。)

                     

                      这4个操作符对任何值都适用,应用于非Number类型时,先用Number()函数转换为数值变量,再执行加减操作。

      b. 一元加和减操作符

                在对非数值应用1元加/减操作符时,该操作符会像Number()转型函数一样对这个值执行转换。

                一元加操作符主要用于基本的算数运算,可以用用于转换数据类型。

        3.5.2 位操作符

                 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。不做深入了解。

     3.5.3 布尔操作符

              a.逻辑非(!)返回一个布尔值

                      逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。

                      逻辑非返回true的情景:

                      空字符串(如果里面有空格返回false)、数值0、NaN、null、undefined。

                     同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数的行为。

              b.逻辑与(&&)有两个操作数。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则:

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

                      如果第二个操作数是对象,则只有第一个操作数的求职结果为true的情况下才会返回该对象。

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

                      如果有一个操作数是null,则返回null;

                      如果有一个操作数是NaN,则返回NaN;

                      如果有一个操作数是undefined,则返回undefined。

             c.逻辑或(||)有两个操作数。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则:

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

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

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

                      如果两个操作数都是null,则返回null;

                      如果两个操作数都是NaN,则返回NaN;

                      如果两个操作数都是undefined,则返回undefined。

                      我们可以利用逻辑或的行为为变量赋优先值和默认值

      3.5.4 乘性操作符

                ECMAScript定义了三个乘性操作符:乘法、除法和求模。在操作数为非数值的情况下会执行自动的类型转换(Number())

                规则:

                得出值超出ECMAScript数值的表示范围 返回 Infinity 或 –Infinity。

                有一个操作数是NaN,则结果为NaN

                Infinity 与 0 相乘 ,则结果是NaN,与非零数值相乘结果是Infinity或-Infinity,取决于有符号操作数的符号。

                Infinity与Infinity相乘,结果为Infinity,相除结果是NaN

                0除以0 结果是NaN

                求模情况下:

                       如果被除数是无穷大而除数是有限大的数值,结果是NaN;

                       如果被除数是有限大的数值而除数是零,结果是NaN;

                       Infinity被Infinity除,结果是NaN;

                       被除数是有限大的数值而除数是无穷大的数值,结果为被除数

                       被除数是0,则结果是零

       3.5.5 加性操作符

               +可以用在字符串拼接。

       3.5.6 关系操作符

               小与、大于、小于等于、大于等于,这几个操作符都返回一个布尔值

       3.5.7 相等操作符

               1.相等和不相等——先转换再比较值

               2.全等和不全等——先转换再比较值,如果通过再比较之前的数据类型(??)??

       3.5.8 条件操作符

               条件操作符即三目运算

               Variable = Boolean_expression ? true_value :false_value

        3.5.9 赋值操作符

                 简单赋值=>(=) ,复合赋值=》(+=)

        3.5.10 逗号操作符

                 逗号操作符可以在一条语句中执行多个操作 例如:

                 var num1=1,num2=2;

3.6 语句

      3.6.1 if语句

              if(condition) {…} else {…} 

              if(condition1) {…} else if(condition2){…}else {…}  

              ECMAScript会自动调用Boolean()转换函数将这个表达式的结果转换为一个布尔值。

     3.6.2 do-while 语句

              do-while语句是一种后测试循环语句,在对条件表达式求值之前,循环体内的代码至少会被执行一次。

              var i = 0; do {i+=2; console.log(i)} while (i<10)

     3.6.3 while语句

              While语句属于前测试循环语句,循环体内的代码有可能永远不会执行。

              var i =0; while(i<10){i+=2}

      3.6.4 for语句

              for 语句也是前测试循环语句

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

      3.6.5 for-in 语句

              for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性。

              for(property in expression) statement

              for-in循环输出的属性名的顺序是不可预测的。具体来讲,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异。

       3.6.6 label语句

               使用label语句可以在代码中添加标签,以便将来使用

               label:statement    如下示例:

               start: for( var i=0; i<count; i++) { alert(i); }

               这个例子中定义的start标签可以在将来由break或continue语句引用。加标签的语句一般都要与for语句等循环语句配合使用。

      3.6.7 break和continue语句

                 break和continue语句用于在循环中精确地控制代码的执行。其中,break语句会立即退出循环,强制继续执行循环后面的语句。而continue语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行。

                 break和continue语句都可以与label语句联合使用,从而返回代码中特定的位置。这种联合使用的情况多发生在循环嵌套的情况下。

                 

                 在这个例子中,outermost标签表示外部的for语句。如果每个循环正常执行10次,则num++语句就会正常执行100次,num的值应该是100。但内部循环中的break语句带了一个参数:要返回的标签。添加这个标签的结果将导致break语句不仅会退出内部的for循环(变量j的循环),而且也会退出外部的for语句(变量i的循环)。为此,当变量i和j都等于5时,num的值正好是55.

                  continue语句会强制继续执行循环——退出内部循环,执行外部循环。当i与j都是5时,continue语句执行,跳出循环直接到i=6,开始。这也意味着内部循环少执行了5次,因此num的结果是95.

       3.6.8 with语句

                 with语句的作用是将代码的作用域设置到一个特定的对象中。

                 with(ecpression) statement;

                 定义with语句的目的主要是为了简化多次编写同一个对象的工作

                 严格模式下不允许使用with语句

       3.6.9 switch 语句

                 switch (expression){

                      case value : statement

                                    break;

                     case value : statement

                                break;

               default : statement }

              switch语句在比较值时使用的是全等操作符。

3.7 函数

        ECMAScript中的函数使用function关键字来声明,后跟一组参数以及函数体。

        函数可以通过return语句后跟要返回的值来实现返回值。return 语句之后的任何代码都不会执行。实际上,未指定返回值的函数返回的是一个特殊的undefined值。

        3.7.1 理解参数

               ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获得传递给函数的每一个参数。

               ECMAScript函数有一个重要特点:命名的参数只提供便利,但不是必需的。

               通过访问arguments对象的length属性可以获知传递了多少个参数。

                arguments对象中的值会自动反映到对应的命名参数,这并不是说读取这两个值会访问相同的内存空间;它们的内存空间是独立的,但它们的值会同步。但这种影响是单向的:修改命名参数不会改变arguments中对应的值。

               严格模式对arguments对象作出了很多限制,所以最好别用arguments

       3.7.2 没有重载

        ECMAScirpt函数没有签名,因为其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。

        在其他语言(如java)中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可

       通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。

3.8小结

  5种基本数据类型

  复杂数据类型Object

  流控制语句

  基本操作符

  函数 arguments 不能重载

 

 

    

 

posted @ 2018-01-09 19:39  摘星捧月  阅读(252)  评论(0编辑  收藏  举报