第三章=》基本概念

第三章 基本概念java

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

3.1  语法数组

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

  3.1.1 区分大小写安全

        ECMAScript中的一块儿(变量、函数名和操做符)都区分大小写。app

  3.1.2  标识符函数

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

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

        其余字符能够是字母、下划线、美圆符号或数字。性能

        为了与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 不能重载

相关文章
相关标签/搜索