Archive for the ‘Javascript’ Category

JavaScript: Bad Practices 翻译+笔记

原文:http://james.padolsey.com/javascript/javascript-bad-practices/
例子请参考原文,这里仅对某些点展开,并有一些额外链接
无需进行构造的变量使用大写字母开头

任何一种编程语言都有特有的代码风格,命名体系中JavaScript中最常用的是驼峰式
而一般来讲普通变量首字母应该小写,而作为对象/函数而言首字母则最好大写,以作区分

不使用var声明来定义变量

var 定义的变量有作用域限制,如果不使用var,则变量全局可用
全局可用的最大弊端就是难于控制,如果下文或上文有相同命名的变量的话会被覆盖,导致无法预估的结果

在同一作用域里把var用于所有的新变量的声明前面

var声明变量只在同一作用域中生效
为了代码简洁,也为了程序运行过程中无需再创建新变量(性能问题),使用一个var定义完所有所需变量
一般可在重构阶段对变量进行整理

使用非全等的等性运算符,进行不同类型的比较

==和!=是非全等号,使用这两个进行比较时会进行内部类型转换,只要转换后的值相等,即返回true
===和!==是全等号,使用这两个进行比较时会进行类型比较,只有类型和值(引用)都相同时才返回true

在复杂的对象中没有对不变的变量(衡量)进行缓存

每次调用对象时都会重新创建这些变量
如果对这些变量进行缓存的话,每次调用对象时则可以重用原来的变量
使用闭包,避免变量在函数执行完毕后被回收

使用太多循环和递归函数

循环和递归的滥用会导致不可预估的性能问题
尽可能将一些不变的变量先缓存起来,避免每次循环都要进行计算

不理解、然后不对重复使用的代码进行抽象,导致大量重复、可读性差的代码

抽象出相同的函数,避免自己重复代码,这个基本上所有语言都要做到。

不理解什么叫做DRY(Don’t Repeat Yourself),不知道怎么用在JavaScript上面

跟上面一个相似

为了精简代码而放弃可读性

JavaScript用在Web开发,需要考虑带宽问题,所以开发时尽可能地精简代码可减少带宽占用
但是代码是写给人看的,书写易读的代码后期维护也方便
可以使用适当的注释,以及发布时的对代码进行压缩

每一行代码都加上注释

每一行都注释说明你的代码基本不可读……
注释要适当,除非你的代码是写给一个JavaScript初学者看的

鉴别浏览器,而不是测试方法是否可用

浏览器的兼容性问题永远没有止境
我们需要以一种标准来衡量,所以检查方法是否被标准所支持,以及浏览器是否支持此标准方法,单独考虑某些特殊浏览器支持的特殊方法,会比每个浏览器都进行鉴别要好得多

在某个循环中不断创建DOM元素

创建DOM元素所消耗的时间很大
尽可能地先在数组里面操作,然后再一次性插入到文档中(性能问题非常明显)

来看看下面的例子:(建议用高级一点的浏览器,IE下最好改小times值)

<script type="text/javascript">
var times = 100000;
Test(ArrayTest, times);
Test(FragmentTest, times);
Test(ForTest, times);
function Test(testMethod, times){
var elem = document.createElement("div"),i,j;
i = +new Date;
testMethod(elem, times);
j = +new Date;
document.write(j-i + ";<br/>");
elem = ""; //防止IE秀逗
}
function FragmentTest(elem, times){
[...]

关于正则的一道应用题

考试的时候没有签保密协议,所以继续发一道题,当时用的不是正则的解法——正则表达式俺只能看不能写——所以下午无聊又用正则写了一遍。
题目要求是将CSS中的16进制颜色转换成rgb10进制,题目比较贴合实际。要考虑字符串的合理处理,如果只是用if判断会死人,所以还是用正则来做比较好。

function toRGB(HEX){
var rgb = “rgb(“,
rgbArray = [],
tmp,
isHash = /^#/,
//正则判断格式是否正确
//这里区分开来#,以及下面有点累赘的表达式,只是为了后面的代码少一些,充分利用exec/match生成的数组
[...]

一道Javascript笔试题

看不到输入框和运行按钮的童鞋请直接点击标题查看原文。

<script type="text/javascript">
function F(){
function C(){ return this;};
return C();
}
var a = new F();
alert(a == window);
</script>

Tips:You can change the code before run.

运行一下,发现结果是True的。这是为什么呢?
首先我们先确定 return C(); 在这里构成一个闭包,即返回了对C方法的引用,F()有返回值,所以这里new不能当做创建一个F对象来理解,我们先调试一下,看看这里怎么把 this 给弄走了。

<script type="text/javascript">
function F(){
alert(this.constructor);
function C(){
alert(this.constructor);
[...]

 1 2 3 Next »