读《高性能 JavaScript》笔记 -”JS进阶必读“(第二章)

本文探讨JavaScript中数据存取的四大位置:字面量、本地变量、数组元素和对象成员,分析作用域链、闭包及原型链的概念与实践,通过具体代码示例解释如何优化对象成员值读取。

二,数据存取

       2.0 javaScript四种基本的数据存取位置

       字面量:字符串,数字,布尔值,对象,数组,函数,正则表达式,及特殊的null和undefined值。

       本地变量:var let const 定义的数据存储单元

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

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

(遍历相同长度的对象集合和数组 ,对象集合比较费时)

    2.1作用域链和标识符解析

    2.1.1改变作用域   with  和 try{}catch(){}  语句   

 (使用with 会使执行环境的作用域链临时被改变 ,一个新的变量对象被创建,这个对象被推入作用域链的首位,这意味着函数的所用局部变量现在处于第二个作用域对象中,因此访问代价更高)

function initUI(){
   with(document){
     links = getElemtnByTagName("a");
     i = 0;
     len = links.length;
     while(i < len){
       update(links[i++])
     }
     getElementById("go-btn").onclick = function(){
       start();
     }
     bd.className = "ative";
   }
}

    2.1.2 闭包,作用域,内存       闭包是javaScipt最强大的特征之一,它允许访问局部作用之外的数据。  但存在引用不能及时释      放的性能问题.  

function assignEvents(){
      var id  = "xid2323";
     document.getElementById("sava-btn").onclick= function(e){
       saveDocument(id);
    }
}

    2.2 原型链

function Book(title,publisher){
      this.title = title;
      this.publisher = publisher;
}

Book.prototype.sayTitle = funciton(){
      alert("this.title")
};

var book1 = new Book("javaScript","publish1");
var book2 = new Book("Phython","publish2");

alert(book1 instanceof Book);//true
alert(book1 instanceof Object);//true 

boo1.sayTitle();//"javaScript"
alert(book1.toString())//"[object Object]"

// 原型对象问题          (摘于 高级程序设计javaScript 3版)
function Person(){}

Person.prototype={
   constructor:Person,
   name:"bruce",
   friends:["aaa","bob"]
}

var person1 =new Person();
var person2 =new Person();
person1.friends.push("ccc");
alert(person2.friends);//“aaa,bob,ccc” 
alert(person1.friends === person2.friends);//true   

//共享的本质问题; 
//因为person1 和 person2指向 同一个原型的指针。所以都会改变。

//解决方法:
//组合使用构造函数模式和原型模式(目前在ECMAScript中使用最广泛 认同度最高)
function Person(name){
    name:"bruce",
 friends:["aaa","bob"]
}
Person.prototype={
   constructor:Person,
   sayName:function(){
    alert(this.name) 
   }
}
var person1 =new Person("bruce");
var person2 =new Person("dddd");
person1.friends.push("ccc");
alert(person1.friends);//“aaa,bob,ccc” 
alert(person2.friends);//“aaa,bob” 
alert(person1.friends === person2.friends);//false
alert(person1.sayName === person2.sayName);//true

//构造函数模式用于定义实例的属性,原型模式用于定义方法和共享的属性。
//结果每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存

    2.3缓存对象成员值   (这种优化技术不推荐用于对象的成员方法,因为许多对象方法使用this来判断执行环境,把一个对象方法保存在局部变量会导致this绑定到window,  this值的改变会使得javaScript引擎无法正确解析它的对象成员,而导致错误)

 

//优化前 
function hasEitherClass(element,className1,className2){
     return element.className == className1 || element.className == className2; 
}

//优化后
function hasEitherClass(element,className1,className2){
     var currentClassName = element.className;//缓存成员变量, 减少读取次数
     return currentClassName == className1 || currentClassName== className2; 
}

注意:如有版权问题,请联系我~

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TE-茶叶蛋

踩坑不易,您的打赏,感谢万分

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值