没有合适的资源?快使用搜索试试~ 我知道了~
首页JavaScript深度解析:从入门到精通与设计模式详解
JavaScript深度解析:从入门到精通与设计模式详解
需积分: 50 58 下载量 61 浏览量
更新于2024-07-19
收藏 2.05MB PDF 举报
"《深入理解JavaScript系列》是一本全面详尽的JavaScript学习指南,它旨在帮助读者从入门到精通。全书分为四大部分,第一部分提供基础知识,让读者快速掌握JavaScript基础编程要素;第二部分则追溯语言的历史和技术背景,以便理解其发展脉络;第三部分是深度解析,涵盖了丰富的主题,如语法、数据类型、运算符、函数、对象、原型、闭包、面向对象编程、JSON、DOM操作、以及SOLID原则的应用等,这些都是提升编程技能的关键点。 其中,章节详细列举了诸如命名函数表达式、Module模式、立即调用的函数表达式等高级概念,让读者深入了解JavaScript的高级特性。作者还强调了JavaScript的核心概念,如执行上下文、变量对象、this的使用和作用域链,这些都是理解语言动态性的重要基石。此外,书中还专门探讨了面向对象编程在JavaScript中的实践,以及各种设计模式的应用,如单例、构造函数、工厂、装饰者等,这些模式有助于编写更加灵活和可维护的代码。 在代码复用和对象创建模式部分,作者提供了实用的建议,指导读者如何避免冗余代码并有效利用设计模式来优化代码结构。Function模式的讨论则深入剖析了JavaScript函数的灵活性和高效性。最后,作者通过实例和答案详解,确保读者能够真正理解和掌握所学内容。 《深入理解JavaScript系列》适合所有希望系统学习或提升JavaScript技能的开发者,无论他们是初学者还是进阶者,都能从中找到适合自己的学习路径。通过阅读这本书,读者将对JavaScript有更深入的理解,并能够应用这些知识写出高质量的JavaScript代码。"
资源详情
资源推荐
避免隐式类型转换(AvoidingImpliedTypecasting)
JavaScript的变量在比较的时候会隐式类型转换。这就是为什么一些诸如:false==0或
“”==0返回的结果是true。为避免引起混乱的隐含类型转换,在你比较值和表达式类型
的时候始终使用===和!==操作符。
varzero=0;
if(zero===false){
//不执行,因为zero为0,而不是false
}
//反面示例
if(zero==false){
//执行了...
}
还有另外一种思想观点认为==就足够了===是多余的。例如,当你使用typeof你就知道它
会返回一个字符串,所以没有使用严格相等的理由。然而,JSLint要求严格相等,它使代码
看上去更有一致性,可以降低代码阅读时的精力消耗。(“==是故意的还是一个疏漏?”)
避免(Avoiding)eval()
如果你现在的代码中使用了eval(),记住该咒语“eval()是魔鬼”。此方法接受任意的字符
串,并当作JavaScript代码来处理。当有问题的代码是事先知道的(不是运行时确定的),
没有理由使用eval()。如果代码是在运行时动态生成,有一个更好的方式不使用eval而达到同
样的目标。例如,用方括号表示法来访问动态属性会更好更简单:
//反面示例
varproperty="name";
alert(eval("obj."+property));
//更好的
varproperty="name";
alert(obj[property]);
使用eval()也带来了安全隐患,因为被执行的代码(例如从网络来)可能已被篡改。这是个很
常见的反面教材,当处理Ajax请求得到的JSON相应的时候。在这些情况下,最好使用
JavaScript内置方法来解析JSON相应,以确保安全和有效。若浏览器不支持JSON.parse(),
你可以使用来自JSON.org的库。
同样重要的是要记住,给setInterval(),setTimeout()和Function()构造函数传递字符串,大
部分情况下,与使用eval()是类似的,因此要避免。在幕后,JavaScript仍需要评估和执行你
(1)编写高质量JavaScript代码的基本要点
-16-本文档使用看云构建
给程序传递的字符串:
//反面示例
setTimeout("myFunc()",1000);
setTimeout("myFunc(1,2,3)",1000);
//更好的
setTimeout(myFunc,1000);
setTimeout(function(){
myFunc(1,2,3);
},1000);
使用新的Function()构造就类似于eval(),应小心接近。这可能是一个强大的构造,但往往被
误用。如果你绝对必须使用eval(),你可以考虑使用newFunction()代替。有一个小的潜在
好处,因为在新Function()中作代码评估是在局部函数作用域中运行,所以代码中任何被评
估的通过var定义的变量都不会自动变成全局变量。另一种方法来阻止自动全局变量是封装
eval()调用到一个即时函数中。
考虑下面这个例子,这里仅 un 作为全局变量污染了命名空间。
console.log(typeofun);//"undefined"
console.log(typeofdeux);//"undefined"
console.log(typeoftrois);//"undefined"
varjsstring="varun=1;console.log(un);";
eval(jsstring);//logs"1"
jsstring="vardeux=2;console.log(deux);";
newFunction(jsstring)();//logs"2"
jsstring="vartrois=3;console.log(trois);";
(function(){
eval(jsstring);
}());//logs"3"
console.log(typeofun);//number
console.log(typeofdeux);//"undefined"
console.log(typeoftrois);//"undefined"
另一间eval()和Function构造不同的是eval()可以干扰作用域链,而Function()更安分守己
些。不管你在哪里执行Function(),它只看到全局作用域。所以其能很好的避免本地变量污
染。在下面这个例子中,eval()可以访问和修改它外部作用域中的变量,这是Function做不
来的(注意到使用Function和newFunction是相同的)。
(function(){
(1)编写高质量JavaScript代码的基本要点
-17-本文档使用看云构建
varlocal=1;
eval("local=3;console.log(local)");//logs"3"
console.log(local);//logs"3"
}());
(function(){
varlocal=1;
Function("console.log(typeoflocal);")();//logsundefined
}());
parseInt()下的数值转换(NumberConversionswith
parseInt())
使用parseInt()你可以从字符串中获取数值,该方法接受另一个基数参数,这经常省略,但不
应该。当字符串以”0″开头的时候就有可能会出问题,例如,部分时间进入表单域,在
ECMAScript3中,开头为”0″的字符串被当做8进制处理了,但这已在ECMAScript5中改
变了。为了避免矛盾和意外的结果,总是指定基数参数。
varmonth="06",
year="09";
month=parseInt(month,10);
year=parseInt(year,10);
此例中,如果你忽略了基数参数,如parseInt(year),返回的值将是0,因为“09”被当做8
进制(好比执行parseInt(year,8)),而09在8进制中不是个有效数字。
替换方法是将字符串转换成数字,包括:
+"08"//结果是8
Number("08")//8
这些通常快于parseInt(),因为parseInt()方法,顾名思意,不是简单地解析与转换。但是,
如果你想输入例如“08hello”,parseInt()将返回数字,而其它以NaN告终。
编码规范(CodingConventions)
建立和遵循编码规范是很重要的,这让你的代码保持一致性,可预测,更易于阅读和理解。
一个新的开发者加入这个团队可以通读规范,理解其它团队成员书写的代码,更快上手干
活。
许多激烈的争论发生会议上或是邮件列表上,问题往往针对某些代码规范的特定方面(例如
代码缩进,是Tab制表符键还是space空格键)。如果你是你组织中建议采用规范的,准备
(1)编写高质量JavaScript代码的基本要点
-18-本文档使用看云构建
好面对各种反对的或是听起来不同但很强烈的观点。要记住,建立和坚定不移地遵循规范要
比纠结于规范的细节重要的多。
缩进(Indentation)
代码没有缩进基本上就不能读了。唯一糟糕的事情就是不一致的缩进,因为它看上去像是遵
循了规范,但是可能一路上伴随着混乱和惊奇。重要的是规范地使用缩进。
一些开发人员更喜欢用tab制表符缩进,因为任何人都可以调整他们的编辑器以自己喜欢的空
格数来显示Tab。有些人喜欢空格——通常四个,这都无所谓,只要团队每个人都遵循同一
个规范就好了。这本书,例如,使用四个空格缩进,这也是JSLint中默认的缩进。
什么应该缩进呢?规则很简单——花括号里面的东西。这就意味着函数体,循环(do,while,
for,for-in),if,switch,以及对象字面量中的对象属性。下面的代码就是使用缩进的示例:
functionouter(a,b){
varc=1,
d=2,
inner;
if(a>b){
inner=function(){
return{
r:c-d
};
};
}else{
inner=function(){
return{
r:c+d
};
};
}
returninner;
}
花括号{}(CurlyBraces)
花括号(亦称大括号,下同)应总被使用,即使在它们为可选的时候。技术上将,在in或是
for中如果语句仅一条,花括号是不需要的,但是你还是应该总是使用它们,这会让代码更有
持续性和易于更新。
想象下你有一个只有一条语句的for循环,你可以忽略花括号,而没有解析的错误。
//糟糕的实例
for(vari=0;i<10;i+=1)
alert(i);
(1)编写高质量JavaScript代码的基本要点
-19-本文档使用看云构建
但是,如果,后来,主体循环部分又增加了行代码?
//糟糕的实例
for(vari=0;i<10;i+=1)
alert(i);
alert(i+"is"+(i%2?"odd":"even"));
第二个alert已经在循环之外,缩进可能欺骗了你。为了长远打算,最好总是使用花括号,即
时值一行代码:
//好的实例
for(vari=0;i<10;i+=1){
alert(i);
}
if条件类似:
//坏
if(true)
alert(1);
else
alert(2);
//好
if(true){
alert(1);
}else{
alert(2);
}
左花括号的位置(OpeningBraceLocation)
开发人员对于左大括号的位置有着不同的偏好——在同一行或是下一行。
if(true){
alert("It'sTRUE!");
}
//或
if(true)
{
alert("It'sTRUE!");
}
(1)编写高质量JavaScript代码的基本要点
-20-本文档使用看云构建
剩余396页未读,继续阅读
develbai
- 粉丝: 89
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 计算机人脸表情动画技术发展综述
- 关系数据库的关键字搜索技术综述:模型、架构与未来趋势
- 迭代自适应逆滤波在语音情感识别中的应用
- 概念知识树在旅游领域智能分析中的应用
- 构建is-a层次与OWL本体集成:理论与算法
- 基于语义元的相似度计算方法研究:改进与有效性验证
- 网格梯度多密度聚类算法:去噪与高效聚类
- 网格服务工作流动态调度算法PGSWA研究
- 突发事件连锁反应网络模型与应急预警分析
- BA网络上的病毒营销与网站推广仿真研究
- 离散HSMM故障预测模型:有效提升系统状态预测
- 煤矿安全评价:信息融合与可拓理论的应用
- 多维度Petri网工作流模型MD_WFN:统一建模与应用研究
- 面向过程追踪的知识安全描述方法
- 基于收益的软件过程资源调度优化策略
- 多核环境下基于数据流Java的Web服务器优化实现提升性能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功