JavaScript权威指南学习笔记

JavaScript权威指南学习笔记

  • with语句

    with语句用于临时扩展作用域链,它具有如下的语法:

    1
    2
    with (object)
    statement

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

    在严格模式中是禁止使用with语句的,并且在非严格模式里也是不推荐使用with语句的,那些使用with语句的JavaScript代码非常难于优化,并且同没有使用with语句的代码相比,它运行的更慢。

    使用with关键字的目的是为了简化多次编写访问同一对象的工作,比如下面的例子:

    1
    2
    3
    var qs = location.search.substring(1);
    var hostName = location.hostname;
    var url = location.href;

    如果使用with将会使代码变得简洁

    1
    2
    3
    4
    5
    with (location){
    var qs = search.substring(1);
    var hostName = hostname;
    var url = href;
    }
  • use strict

    “use strict”是ECMAScript5引入的一条指令,指令不是语句,“use strict”指令和普通的语句之间有两个重要的区别:

    1:它不包含任何语言的关键字,指令仅仅是一个包含一个特殊字符串直接量的表达式(可以是使用单引号也可以使用双引号)

    2:它只能出现在脚本代码的开始或者函数的开始,任何实体语句之前,但它不必一定出现在脚本的首行或函数体内的首行,因为“use strict”指令之后或之前都可能有其他字符串直接量表达式语句,并且javascript的具体实现可能将它们解析为解释器自有的指令。

    使用“use strict”指令的目的是说明(脚本或函数中)后续的代码将会解析为严格代码,如果顶层(不在任何函数内的)代码使用了“use strict”指令,那么函数体的代码也是严格代码。如果eval()调用时所处的代码是严格代码或者eval()要执行的字符串中使用了“strict code”指令,则eval()内的代码也是严格代码。

  • 严格模式与非严格模式之间的区别

    | 严格模式 | 非严格模式 |
    | ———————————————————— | ———————————————————— |
    | 禁止使用with语句 | 允许使用with语句 |
    | 所有变量要先声明 | 使用未声明的变量将隐式声明为全局变量 |
    | 函数(非方法)中的thisundefined | this是全局对象 |
    | call()apply()传入的第一个值不会被转换 | call()apply()传入的第一个值如果是nullundefined,则会被全局对象取代,如果是原始值则转换为对应的包装对象 |
    | 给只读属性和不可扩展的对象创建新成员将抛出类型错误异常 | 只是简单的操作失败 |
    | 传入eval()的代码不能在定义变量和函数 | 变量和函数定义在eval()创建的新作用域中 |
    | 函数中的arguments对象拥有传入函数值的静态副本 | |
    | delete后跟非法标识符将抛出语法错误异常 | 只是简单的返回false |
    | delete删除不可配置的属性将抛出类型错误异常 | 只是简单的返回false |
    | 在对象直接量中定义多个同名属性将产生语法错误 | 不会报错 |
    | 函数声明存在多个同名的参数将产生语法错误 | 不会报错 |
    | 不允许使用八进制直接量 | 某些实现是允许的 |
    | evalarguments当作关键字,并且不允许更改 | |
    | 限制了对栈的检测能力,arguments.callerarguments.callee将抛出类型错误异常 | |

在严格模式中,调用的函数(不是方法)中的一个this值是undefined。(在非严格模式中,调用的函数中的this值总是全局对象)。可以利用这种特性来判断javascript实现是否支持严格模式。

1
2
3
4
var hasStrictMode = function(){
"use strict";
return this==unddfined}()
}
  • 对象

    内置对象是由ECMAScript规范定义的对象或类。例如,数组,函数,日期和正则表达式都是内置对象。

    宿主对象是由JavaScript解释器所嵌入的宿主环境(如web浏览器)定义的。客户端JavaScript中表示网页结构的HTMLElement对象均是宿主对象。既然宿主环境定义的方法可以当成普通的JavaScript函数对象,那么宿主对象也可以当成内置对象。

    自定义对象是由运行中的JavaScript代码创建的对象

    自由属性是直接在对象中定义的属性

    继承属性是在对象的原型对象中定义的属性

  • 创建对象的方法

    对象直接量

    1
    var point={x:0,y:1}

    通过new创建对象

    1
    2
    3
    4
    var s=new Object();  //创建一个空对象
    var a=new Array(); //创建一个空数组
    var d=new Date(); //创建一个表示当前时间的Date对象
    var r=new RegExp("js"); //创建一个可以进行模式匹配的EegExp对象

    Object.create()

    ECMAScript定义了一个名为Object.create()的方法,它创建一个新对象,其中第一个参数是这个对象的原型,Object.create()提供第二个可选参数,用以对对象的属性进行进一步描述。

    1
    var s=Object.create({x:1,y:2});
  • 作为数组的字符串

    在ECMAScript5中,字符串的行为类似于只读的数组,除了用charAt来访问单个的字符以外,还可以使用方括号:

    1
    2
    3
    var s=test
    s.charAt(o) //==> "t"
    s[1] //==> "e"

    这里要注意,字符串是不可变值,故当把它们作为数组看待时,他们是只读的。如push(),sort(),reverse()和splice()等数组方法会修改数组,他们在字符串上是无效的,不仅如此,使用数组方法来修改字符串会导致错误,出错的时候没有提示。

  • 函数调用

    作为函数

    作为方法

    作为构造函数

    通过它们的call()和apply()方法间接调用