您的位置:首页 > Web前端 > JavaScript

《高性能javascript》读书笔记:第二章 数据访问

2012-01-09 23:47 260 查看
javascript中四种基本的数据存取位置:

1,直接量:只代表自己,不存储在特定位置,包括字符串、数字、布尔值、对象、数组、函数、正则表达式、null值、undefined值

2, 变量:var定义的数据存储单元

3,数组元素:存储在数组内部,以数字作为索引

4,对象成员:存储在对象内部,以字符串作为索引

直接量和局部变量的访问速度快于数组项和对象成员的访问速度。

一个函数被创建的作用域中对象的集合叫作函数的作用域链(键值对)

其中包括一个单独的可变对象(window,navigator,document等等)。

执行函数时,由运行期上下文(函数执行的环境)按对象在函数中出现的顺序生成活动对象(包括所有局部变量、命名参数、参数集合、this),然后将活动对象推入作用域链的前端。

函数访问数据时都需要去搜索运行期上下文的作用域链,查找同名的标识符,搜索过程从作域链头部开始,也就是当前运行函数的活动对象,直到找到为止。如果到最后还没找到,则认为该标识符是未定义的。并且,假如有多个同名的标识符的话,只会查找第一个函数中读写局部变量是最快的,而读写全局变量是最慢的。

如果某个跨作用域的值在函数中被引用一次以上,那么建议把它存储到局部变量里。

With(document等):把document等括号内的对象置 于作用域的头部,会使其它局部变量标识符的识别。

catch: 把异常对象置于作用域的头部,同样会影响局部变量标识符的识别。

eval(code) 执行代码。代码格式为字符串。

闭包:

闭包的[[Scope]]属性包含了与运行期上下文作用域相同的对象和引用,因为会有一项副作用,激活对象无法被销毁。占内存,可能会导致内存泄露。

对象成员包括属性和方法。

原型,我感觉相当它的父类。在Firefox、Safari、Chrome中这个属性_proto_即表示它的原型。

var book ={

  title:"标题",

  publisher:"雅虎"

};
alert(book.hasOwnProperty("title"));//true 表示title是实例成员
alert(book.hasOwnProperty("toString"));//false 表示该实例中没有toString

alert("title" in book);//true

alert("toString" in book);//true   都返回true,表示用in操作符时会搜索实例也搜索实例的原型。


对象的原型决定了实例的类型。所有对象都是对象Object的实例。

function Book(title,publisher){

  this.title=title;

  this.publisher=publisher;

}

Book.prototype.sayTitle=function(){

  alert(this.title);

};

var book1=new Book("标题","雅虎");

var book2=new Book("测试","哈哈");

alert(book1 instanceof Book);//true

alert(book1 instanceof Object);//true


上面的示例中,book1的原型(_proto_)是Book.prototype,Book.prototype的原型是Object.

原型链越深,搜索实例成员越慢。

嵌套成员: 每次遇到点操作时,导致js引擎搜索所有对象成员。所以location.href比window.location.href要快。 object.name和object["name"]功能差不多(Safari中点符号会快些)。

不要在同一个函数里多次查找同一个对象成员,除非它的值改变了。应该用查找一次保存为局部变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: