JavaScript大杂烩16 - 推荐实践
var name = 'Frank';
var age = 10;
var util = {/*...*/};
var m1 = function() {/*...*/};
4. 总是使用var去定义变量
var name = 'Frank',
age = 10,
util = {/*...*/};
上面例子中是推荐的一种单行定义多个变量的写法。
if (true) {
alert('msg');
}
7. 起始的大括号总是写在上一行行末
var util = {};
util.checkName = function() {/*...*/};
9. 除了"构造函数"外,所有的函数(也包括变量)总是使用驼峰命名规范
var myName = 'bar';
function checkName(name) {
//...
}
10. 正确使用循环
for(var i=0, len = arr.length; i < len; i++) {
//...
}
3). 尽量不要在循环体中创建变量,特别是jQuery对象或者DOM对象,开始循环前缓存起来吧:
var obj = $('.name');
for(/*...*/){
// 使用obj去做某些事
}
11. 尽量多使用单引号表示字符串
var name = 'Frank';
当然了,出现字符串嵌套的时候就要混用单双引号了。
obj.a = obj.b;
obj.c = obj.d;
可以简写成
with(obj) {
a = b;
c = d;
}
但是,在实际运行时,解释器会首先判断obj.b和obj.d是否存在,如果不存在的话,再判断全局变量b和d是否存在。这样就导致了低效率,而且可能会导致意外,因此最好不要使用with语句。
eval("myValue = myObject." + myKey + ";");
可以直接写成
myValue = myObject[myKey];
至于ajax操作返回的json字符串并执行的需求,可以直接使用JQuery的$.getScript方法实现。
switch(n) {
case 1:
case 2:
break;
}
这样写容易出错,而且难以发现。因此建议避免switch贯穿,凡是有case的地方,一律加上break。
switch(n) {
case 1:
break;
case 2:
break;
}
15. 不使用位运算符
var arr = [0, 1];
alert(typeof arr); // object
alert(arr instanceof Array); // true
alert(Array.isArray(arr)); // 比instanceof更好的写法
19. 谨慎对浮点数经行判等
// 错误比较浮点数
alert((0.1+0.2) === 0.3);
// 常见的解决方案
var epsEqual = function () {
var EPSILON = Math.pow(2, -53);
return function epsEqual(x, y) {
return Math.abs(x - y) < EPSILON;
};
}();
alert(epsEqual(0.1+0.2, 0.3));
20. 时刻检查传入数组中的index参数是否是负数
var arr = [1,2,3,4,5];
var index = arr.indexOf('foo'); // index = -1
alert(arr.splice(index, 2)); //
是你想要的结果吗?
// 使用函数是有开销的
var min = Math.min(a, b);
// 推荐的写法
var min = a < b ? a : b;
22.将脚本放在页面的底部,并且采用HTML5的写法
<script src="path/to/file.js"></script>
<script src="path/to/anotherFile.js"></script>
</body>
</html>
23. 总是使用数组的toString方法(简单)或者join方法(可以自定义格式)输出数组字符串
var arr = [1,2,3,4,5];
alert(arr.toString());
alert(arr.join(','));
// 稍微复杂一点的例子
var arr = ['item 1', 'item 2', 'item 3', ...];
var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';
这种情况下,忘了for循环吧。
// 低效率方法
var url = location.href;
// 相对高效一点的用法
var url = window.location.href;
这个原理同样适用于"多定义局部变量,少定义全局变量"。
$('#top').find('p.classA');
$('#top').find('p.classB');
更好的写法是:
var cached = $('#top');
cached.find('p.classA');
cached.find('p.classB');
4. 多使用链式操作
$('div').find('h3').eq(2).html('Hello');
原因:采用链式写法时,jQuery自动缓存每一步的结果,因此比非链式写法要快。
var cached = $('#p');
cached.data('_data');//初始化
cached.data('_data',{//赋值
name: 'haha'
});
cached.data('_data').name;//获取JSON中的name值
虽然使用data()方法可以很方便地存取全局性数据,但存储的数据随着操作的变化,会越来越大,如果不及时进行清理,将会影响原有程序的执行。
var elem = $('#elem');
elem.data(key,value);
而要写成
var elem = $('#elem');
$.data(elem[0],key,value);
根据测试,后一种写法要比前一种写法,快了将近10倍。因为elem.data()方法是定义在jQuery函数的prototype对象上面的,而$.data()方法是定义jQuery函数上面的,调用的时候不从复杂的jQuery对象上调用,所以速度快得多。
function addDivs(element) {
var div;
// Creates a new empty DocumentFragment.
var fragment = document.createDocumentFragment();
for (var i = 0; i < 20; i ++) {
div = document.createElement('a');
div.innerHTML = 'Hi!';
fragment.appendChild(div);
}
element.appendChild(fragment);
}
8. 如有可能,多使用工具方法(静态方法),而不是jQuery对象的方法(实例方法)
var $text = $("#text");
var $ts = $text.text();
也可以使用针对jQuery函数的版本:
var $text = $("#text");
var $ts = $.text($text);
由于后一种针对jQuery函数的版本不通过jQuery对象操作,所以相对开销较小,速度比较快。
JavaScript大杂烩16 - 推荐实践的更多相关文章
- javascript编程的最佳实践推荐
推荐的javascript编程的最佳实践,摘要记录在这里: 可维护的代码保证代码的性能部署代码 1 可维护的代码1.1什么是维护的代码:可理解性——其他人可以接手代码并理解它的意图和一般途径,而无需原 ...
- JavaScript相关图书推荐
JavaScript语言精粹(修订版) 作 者 Douglas Crockford(道格拉斯·克罗克福德) 著:赵泽欣 等 译 出 版 社 电子工业出版社 出版时间 2012-09-01 版 ...
- (译) 《Javascript 24条最佳实践》
(摘录) <Javascript 24条最佳实践> 自己一直偏向于实用主义,不是学院派,不是学究派,只讲究把东西能够很好的做出来,但经过一段时间的开发工作当自己总结出来一些东西时,觉得挺有 ...
- JavaScript大杂烩17 - 性能优化
在上一节推荐实践中其实很多方面是与效率有关的,但那些都是语言层次的优化,这一节偏重学习大的方面的优化,比如JavaScript脚本的组织,加载,压缩等等. 当然在此之前,分析一下浏览器的特征还是很有意 ...
- 《Javascript设计模式与开发实践》--读书笔记
第2章 this call apply bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用. bind( ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- JavaScript设计模式与开发实践 - 观察者模式
概述 观察者模式又叫发布 - 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做 ...
- JavaScript设计模式与开发实践 - 策略模式
引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...
- JavaScript设计模式与开发实践 - 单例模式
引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...
随机推荐
- linux中crontab的使用方法
crontab参数说明: -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv V ...
- 如何在Mac下配置Github和Bitbucket的SSH
--- title: 如何在Mac下配置Github和Bitbucket的SSH date: 2017-12-23 21:10:30 tags: - Mac - Git - Github catego ...
- python zip压缩文件 并移动到指定目录
需要引入的3个包: import os import shutil import zipfile 1. # 创建zip文件对象your_zip_file_obj = zipfile.ZipFile(' ...
- python异步编程--回调模型(selectors模块)
目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分析 3.1 注册 3.2 注销 3.3 查询 4. 别名 5. 总结 6. 代码报错问题 1. 文件描述 ...
- Python 解析har 文件将域名分类导出
前言 作为程序员平时主要是使用 shadowsocks 作为代理工具的.shadowsocks 有个很明显的优点儿就是可以设置白名单和黑名单.白名单是会走shadowsocks的自动代理模式. 遇到的 ...
- MongoDB 系列文章
MongoDB 系列文章 本文的内容是基于 MongoDB 4.0 的. 参考于 MongoDB 4.0 官方文档. 搭建 MongoDB从搭建到优化 MongoDB-副本集搭建与管理 管理 Mong ...
- 第4章 Selenium2-java WebDriver API (二)
4.8 定位一组元素 定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数.定位一组元素一般用于以下场景: ·批量操作元素,例如勾选页面上所有的复选框. ...
- python 浅析格式化输出和深浅copy
一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s (其中s表示string)表示字符串 %d (其中d表 ...
- Jenkins持续集成学习-Windows环境进行.Net开发4
目录 Jenkins持续集成学习-Windows环境进行.Net开发4 目录 前言 目标 Github持续集成 提交代码到Github 从Github更新代码 git上显示构建状态 自动触发构建 Gi ...
- MJPEG 格式分析
MJPEG简介 MJPEG(技术即运动静止图像(或逐帧)压缩技术)是24-bit的"true-color"影像标准.MJPEG的工作是将RGB格式的影像转换成YCrCB格式,目的是 ...