javascript学习(二)——第一部分 JavaScript语言核心

来源:互联网 发布:notebook软件 编辑:程序博客网 时间:2024/05/18 09:41

第四章 表达式和运算符

4.1原始表达式

        常量、直接量、关键字(this返回当前对象)和变量

4.2对象和数组的初始化表达式

          对象和数组初始化表达式实际上是一个新创建的对象和数组。这些初始化表达式优势称作“对象直接量”和“数组直接量”,但它们不是原始表达式。

      数组直接量中的列表逗号之间的元素可以省略,空位会填充值undefined。var sparseArray=[1,,,5];在元素列表结尾处可以留下单个逗号,这时并不会创建一个新的undefined的元素。

      对象直接量中的属性名称可以是字符串而不是标识符

4.3函数定义表达式

     可称为函数直接量,典型的函数定义表达式包含关键字function,跟随其后的是一对圆括号,括号内是以逗号分割的列表,列表含有0个或多个标识符(参数名),然后再 根叔一个由花括号包裹的js代码段(函数体)

     var square=function(x)  {return x*x};

4.4属性访问表达式

        得到一个对象属性或一个数组元素的值。

           expression.identifier

           expression[expression]

       如果计算结果是null或者undefined,表达式会抛出一个类型错误异常,因为这两个值都不能包含任意属性

       第一种写法更加简单,但要注意这种方式值适用于要访问的属性名称是合法的标识符,并且要知道要访问的属性的名字。如果属性名称是一个保留字或者包含空格和标点符号,或是一个数字,则必须使用方括号的写法,当属姓名通过计算得出而不是固定值是也不需使用方括号写法

4.5调用表达式

            f(0);

       Math.max(x,y,z);

       a.sort();

4.6对象的创建表达式

              创建一个对象并调用一个函数(这个函数陈谷总构造函数)初始化新对象的属性。

           new Object;

           new Point(2,3);

                不用传入任何参数给构造函数的话,那么这对空圆括号是可以省略掉的:new Object         new Date

4.7运算符概述

    P66有运算符表

4.7.1操作数的个数  

       二元 *    一元  -       三元   ?:

4.7.2操作数类型和结果类型

               运算符通常会根据需要对操作数进行类型转换

4.7.3左值

            指表达式只能出现在赋值运算符的左侧

            变量、对象属性和数组元素均是左值

            规范允许内置函数返回一个左值,但自定义的函数则不能返回左值

4.7.4运算符的副作用

         赋值运算符、函数调用表达式和对象创建表达式

4.7.5运算符优先级

         当实在不知道优先级时可用括号强行制定运算次序

4.7.6运算符的结合性

              左结合和右结合

4.7.7运算顺序

              从左到右           b=(a++)+a  //3:计算a是a已经是2了

4.8算数表达式

                      *求余%操作数可以是整数

4.8.1  “+”运算符

              必要的类型转换    *null->0    undefined->NaN

4.8.2一元算数运算符

                 +、-、++、--

4.8.3位运算符

           尽管不是传统的数学运算,这里也将其归类为算数运算符

           ^、|、&、~、<<、>>、>>>


4.9关系表达式

4.9.1相等和不等运算

           根据关系是否存在而返回true或false

        ==、===、!=、!==

        ===:

        类型不同不相等。null、undefined、NaN自己本身都不相等

        ==:

         null和undefined相等,可进行类型转换

4.9.2比较运算符

         <、>、<=、>=

          *字符串的比较注意大写字母都小于小写字母

            String.localCompare() String.toLowerCase()   String.toUpperCase()

            *当其中一个操作数是NaN的时候,所有4个比较运算符均返回false

4.9.3 in运算符

          左操作数是一个字符串或可以转换为字符串,右操作数是一个对象

4.9.4 instanceof运算符

         左侧是对象,右侧是标识对象的类。左侧是右侧的实例返回true,否则false

            *所有对象都是Object的实例,判断会包含对父类的检测

           原型链:js的继承机制6.2.2

4.10逻辑表达式

                  &&:可能不会计算右操作数的情况  “短路”

           ||:函数体内的用法

           !

4.11赋值表达式

                  带操作的赋值运算         a op=b

4.12表达式计算

                  eval()     解释运行由JS源代码组成的字符串,并产生一个值

            是一个函数,但已经被当成运算符来对待

            *当把eval当成一个函数是,一个问题是,如果一个函数调用了eval(),那么解释器将无法对这个函数做进一步优化,另一个问题是它可以被赋予其他的名字,解释器将无法放心的优化///

         所以要对eval()实施更多的限制,以便让它的行为更接近运算符

4.12.1 eval()

           只有一个参数,当参数不是字符串时直接返回该参数,是字符串时,将把它当成JS代码进行编译,编译失败会抛出一个语法错误,成功就开始执行这段艾玛,并返回字符串中的最后一个表达式或语句的值,如果最后一个表达式或语句没有值,则最终返回undefined。如果抛出一个异常,这个异常将把该调用传递给eval()

        *它使用了调用它的变量作用域环境

4.12.2 全局eval()

       由于具有更改局部变量的能力,3规定了任何解释其都不允许对eval()赋予别名。如果eval()函数通过别名调用的话会抛出一个EvalError异常

         5是反对该异常的,并且规范了eval()的行为,当直接调用时,它总是在调用它的上下文作用域内执行,其他的间接调用则使用全局对象作为其上下文作用域,并且无法读、写、定义局部变量和函数(使用别名调用eval将是全局eval)

4.12.3 严格eval()

    5的严格模式对函数的行为施加了更多的限制,在严格模式下调用eval时,或者以use strict指令开始。。。

4.13其他运算符

4.13.1 条件运算符 ?:

4.13.2typeof运算符    null   Object          NaN   number    宿主对象  object/字符串    函数   function

4.13.3 delete运算符

                   是一元操作符,它用来删除对象属性或者数组元素(删除后数组长度没有变)。就像赋值、递增、递减运算符一样。

                  删除后读取一个不存在的属性将返回undefined,但是可以通过in运算符检测属性是否存在

                  delete希望他的操作数是一个左值,如果他不是左值,那么delete将不进行任何操作同时返回true。

                 不是所有属性都可删除,一些内置核心和客户端属性是不能删除的,用户通过var语句声明的变量不能删除。同样,通过function语句顶一顶函数和函数参数也不能删除。

                 5的严格模式下,如果操作数是非法的,将会抛出一个语法错误异常。严格模式下,delete删除不可配置的属性是会抛出一个类型错误异常。在非严格模式下,这些delete操作不会报错,只是简单地返回false

4.13.4 void运算符

                  操作数会正常计算,但忽略计算结果并返回undefined

                 最常用在客户端的URL——javascript:URL中,在URL中可以写带有副作用的表达式,而void让浏览器不必显示这个表达式的计算结果。

4.13.5 逗号运算符(,)

       

第五章 语句

           表达式语句、声明语句

       条件语句(if、switch)、循环语句(while,for)、跳转语句(break、return、throw)

5.1表达式语句

            有副作用的表达式是最简单的语句

5.2 复合语句和空语句

              用花括号将多条语句括起来就形成一条复合语句

        ;空语句

5.3声明语句

5.3.1 var

         *var声明的变量是无法通过delete删除的

         “提前”

5.3.2 function

         *花括号是必须的

5.4条件语句

5.4.1 if

         if,else(else总是与就近的if匹配,所以要适当添加花括号)

5.4.2 else if

5.4.3 switch

             case break default

5.5循环

             while  do/while   for(循环变量可以是对象)  for/in(枚举,对象的属性只有“可枚举“的才会被遍历到)

5.6跳转

5.6.1标签语句

             通过给语句定义标签,就可以在程序的任何地方通过标签名引用這条语句

5.6.2 break语句

                   switch中,循环语句中,后跟一个语句标签(程序将跳转到标签所标识的语句块的结束,或者直接终止)

                控制权无法越过函数的边界

5.6.3 continue语句

            也可代标签,只能在循环体中使用

5.6.4 return语句

             只能出现在函数体内,没有事将返回undefined,单独的return也返回undefined

5.6.5throw语

5.6.6 try/catch/final语句 P112

5.7其他语句类型

5.7.1 with语句

          用于临时扩展作用域链

         with(object)

         statement

         这条语句将object添加到作用域链的头部然后执行statement,最后把作用域链会发到原始状态。

         严格模式中,是禁止使用的

5.7.2 debugger语句

        *当调试程序可用并运行时,解释器将以调试模式运行。

        实际上这条语句用来产生一个断点,代码的执行会停止在断点的位置,这时可以使用调试器输出变量的值,检查调用栈等(先启用调试器eg:Firebug)

5.7.3 “use strict”

        是5引入的一条指令,不是语句

        与普通语句的区别:不包含任何关键字,对于未实现5的只是条没有副作用的表达式,将来用use做关键字;只能出现在代码开始或函数体开始

         使用该指令的目的是说明后续的代码将会解析为严格代码。如果顶层代码使用了这个指令,他们就是严格代码;如果函数体定义或函数体使用了这个指令,那么函数体的代码也是严格代码。如果eval()调用时所处或要执行的字符串中使用了“strict code”指令,则eval内的代码是严格代码

         严格代码:是该语言的一个受限制的子集,它修正了语言的重要缺陷,并提供健壮的差错功能和增强的安全机制。严格模式和非严格模式之间的区别如下:

               1、严格模式中禁止使用with语句

               2、所有的变量都要先声明,引用错误异常/给全局对象新添加一个新属性

               3、调用函数中的this值是undefined/全局对象

               4、通过call()或apply()来调用函数是,其中的this就是通过它们传入的第一个参数/null和undefined值被全局对象和转换为对象的非对象值所代替

               5、给只读属性赋值和给不可扩展的对象创建新成员都将抛出一个类型错误异常/知识简单的操作失败,不会报错

               6、eval()的代码不能再调用程序所在的上下文中声明变量或定义函数/可以这样做,作用域在返回时弃用

               P116


           

0 0