时间:2021-07-01 10:21:17 帮助过:10人阅读
“如果两个比较对象有着同样的类型和值,===返回true,!==返回false。”不过,如果使用==和!=,在操作不同数据类型时, 你可能会遇到一些意想不到的问题。在进行相等判断前,JavaScript会试图将它们转换为字符串、数字或 Boolean量。
– JavaScript: The Good Parts
if(someVariableExists)
x = false
不过,如果是这样的呢:
复制内容到剪贴板
if(someVariableExists)
x = false
anotherFunctionCall();
你可能会认为它和下面的语句相等:
复制内容到剪贴板
if(someVariableExists) {
x = false;
anotherFunctionCall();
}
不幸的是,事实并非如此。现实情况是它等价于:
复制内容到剪贴板
if(someVariableExists) {
x = false;
}
anotherFunctionCall();
如您注意到的,再漂亮的缩进也不能代替这华丽的花括弧。在所有情况下都请写清楚花括号和句尾分号。在只有一行语句的时候能偶尔省略掉,虽然下这么做也是极度不被推荐的:
复制内容到剪贴板
if(2 + 2 === 4) return 'nicely done';
多考虑下将来吧,孩子“JSLint扫描接收的代码。发现问题,描述问题,并给出其在源码中的大概位置。可发现的问题包括但不限于语法错误,虽然语法错误确实是最常见的。JSLint也会用完成代码之前,把它放到JSLint里检查一下,快速消灭你的无心之过。
约定俗成的习惯检查代码的格式化风格,以及结构错误。通过JSLint的扫描并不能保证你的程序就完全正确。它只是为您提供了额外一双发现错误的眼睛。”
– JSLint 文档
<p>超哥是世界上最帅的人。benhuoer.com是世界上最好看的博客。</p>
<script type="text/javascript" src="path/to/file.js"></script>
<script type="text/javascript" src="path/to/anotherFile.js"></script>
</body>
</html> <!--0--><!--1-->
6. 在 For 语句外部声明变量for(var i = 0; i < someArray.length; i++) {
var container = document.getElementById('container');
container.innerHtml += 'my number: ' + i;
console.log(i);
}
这段代码每次都重新定义数组长度,每次都在遍历DOM寻找container元素 —— 太傻了!var container = document.getElementById('container');
for(var i = 0, len = someArray.length; i < len; i++) {
container.innerHtml += 'my number: ' + i;
console.log(i);
}
我要给留言改进这段代码的人额外惊喜!欢迎大家留言讨论!var arr = ['item 1', 'item 2', 'item 3', ...];
var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';
“没那么多繁文缛节来烦你;你就信我一次好了(或者你也可以自己试一试)—— 这真的是迄今能找到的最快办法了!8. 减少全局变量
用点土办法,也别管它背后究竟发生了什么抽象的东西,通常土办法都比那些优雅的办法要快捷得多!”
– James Padolsey, james.padolsey.com
“把你踩在全局的那些乱七八糟的脚印都归于一人名下,能显著降低与其他应用、小工具或JS库冲突的可能性。”复制内容到剪贴板
– Douglas Crockford
var name = 'Jeffrey';
var lastName = 'Way';
function doSomething() {...}
console.log(name); // Jeffrey -- or window.name
更好的写法
复制内容到剪贴板
var DudeNameSpace = {
name : 'Jeffrey',
lastName : 'Way',
doSomething : function() {...}
}
console.log(DudeNameSpace.name); // Jeffrey
注意看,我们是如何戏剧化地把“乱七八糟的脚印”都归到“DudeNameSpace”这对象之下的。// 遍历数组,输出各自名称
for(var i = 0, len = array.length; i < len; i++) {
console.log(array);
}
10. 试试渐进增强setInterval(
"document.getElementById('container').innerHTML += 'My new number: ' + i", 3000
);
不仅执行不高效,而且和 eval 函数有着同样的高风险。千万不要把字串传递给 setInterval 和 setTimeout。恰当的做法是,传递一个函数名:
复制内容到剪贴板
setInterval(someFunction, 3000);
12. 不要使用with语句with (being.person.man.bodyparts) {
arms = true;
legs = true;
}
– 等价于 —
复制内容到剪贴板
being.person.man.bodyparts.arms = true;
being.person.man.bodyparts.legs= true;
不幸的是,测试表明,若你要为对象插入新成员,with的表现非常糟糕,它的执行速度非常缓慢。替代方案是声明一个变量:
复制内容到剪贴板
var o = being.person.man.bodyparts;
o.arms = true;
o.legs = true;
13. 使用 {},而不用New Object()var o = new Object();
o.name = 'Benhuoer';
o.lastName = 'Yang';
o.someFunction = function() {
console.log(this.name);
}
不过,这一方法读起来却比较糟糕。我强烈建议你采用下面这种在文字样式上更为强健的写法:var o = {
name: 'Jeffrey',
lastName = 'Way',
someFunction : function() {
console.log(this.name);
}
};
注意,如果你想新建一个空对象,用 {} 就能行:
复制内容到剪贴板
var o = {};
“对象字面符(Objects literals)帮助我们写出支持很多特性,同时又关联性强、简明直接的代码。没必要直接调用新建语句,然后再费心维护声明变量和传递变量的语句之间的正确顺序,等等。” – dyn-web.com14. 使用[],而不用New Array()
var a = new Array();
a[0] = "Joe";
a[1] = 'Plumber';
更好的写法
复制内容到剪贴板
var a = ['Joe','Plumber'];
“在JavaScript编程中经常遇到的一个错误是,该用数组时却用了对象,该用对象时却用了数组。规则其实很简单:当属性名是小的连续整数时,你应该使用数组。其他情况,使用对象。” – Douglas Crockford15. 一长列变量声明?别写那么多var,用逗号吧 复制内容到剪贴板
var someItem = 'some string';
var anotherItem = 'another string';
var oneMoreItem = 'one more string';
更好的写法
复制内容到剪贴板
var someItem = 'some string',
anotherItem = 'another string',
oneMoreItem = 'one more string';
…不言自明。我不知道这样做能否提升代码执行速度,但是确实让你的代码干净许多。var someItem = 'some string'
function doSomething() {
return 'something'
}
之前已经说过,这样做会造成潜在的更大、更难以发现的问题:var someItem = 'some string';
function doSomething() {
return 'something';
}
18. “For in” 语句for(key in object) {
if(object.hasOwnProperty(key) {
...then do something...
}
}
引自[/i][i] Douglas Crockford 所作:[/i][i] JavaScript: The Good Parts function TimeTracker(){
console.time("MyTimer");
for(x=5000; x > 0; x--){}
console.timeEnd("MyTimer");
}
20. 读,读,读……Read, Read, Read…(function doSomething() {
return {
name: 'jeff',
lastName: 'way'
};
})();
22. 原生 JavaScript 总是会比使用代码库来的快var response = JSON.parse(xhr.responseText);
var container = document.getElementById('container');
for(var i = 0, len = response.length; i < len; i++) {
container.innerHTML += '<li>' + response.name + ' : ' + response.email + '</li>';
}
关于JSON,请查看更多介绍。<script type="text/javascript" language="javascript">
...
</script>
不过现在,这属性已经没啥用很久了…… 所以,删掉算啦!