29. ? 除非是紧急bug,或者小范围的修改,否则不要用
浏览器检测,而应该用功能检测:
// 正确
if (document.all) {
// do something with document.all
}
// 错误
if (browser.isIE) {
// do something with document.all
} else {
// do nothing with document.all
}
30. ? 获取 html 元素:
document.documentElement
document.firstChild
document.childNodes[0]
40. ? 判断参数是否传入:
function foo(param1, param2)
{
if (param1) {
// bad
}
if (typeof param1 != 'undefined') {
// good, go on
}
if (param2 instanceof Function) {
// better, go on do with function
}
}
41. ? instanceof, typeof 等等都不是100%正确的,
最实际的做法是直接判断该对象,或者该
方法是否可用,比如:
if (document.all) {
// do something with document.all
}
61. ? 最快的数组循环:
var i = arr.length - 1;
if (i > -1) {
do {
// do something with arr[i]
} while (--i >= 0);
}
62. ? 尽量不用 with 语句,容易出 bug。
? with 延长了作用域,js编译时识别不了这个
附加作用域的,通常都可以直接用
obj.property 来代替。
63. ? new String 的应用场景,如果需要多次调用字符串对象的属性时:
// 共创建21个变量,每次调用都会创建一个临时字符串变量
var s = '0123456789';
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}
// 只创建一个对象
var s = new String('0123456789');
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}
84. ? 减少 reflow/repaint :
// 使用 DocumentFragment 一次性创建多个DOM节点
var span1 = document.createElement('span');
var span2 = document.createElement('span');
span1.appendChild(document.createTextNode("hi"));
span2.appendChild(document.createTextNode("kim"));
var fragment = document.createDocumentFragment();
fragment.appendChild(span1);
fragment.appendChild(span2);
var div = document.getElementById("divContainer");
div.appendChild(fragment);