for in 语句可以用来遍历一个对象中的所有属性名。这个枚举过程将会列出所有的属性——包括函数和可能不关心的原型中的属性,所以有必要过滤那些不想要的值。最常用的过滤器是 hasOwnProperty 方法,以及使用 typeof 来排除函数:
delete 运算符可以用来删除对象的属性。如果对象包含该属性,那么该属性就会被移除,它不会触及原型链中的任何对象。
减少全局变量污染
var name;
for (name
in another_stooge) {
if (typeof another_stooge[name] !== 'function') {
document.writeln(name + ': ' + another_stooge[name]);
}
}
属性名出现的顺序是不确定的,因此要对任何可能出现的顺序有所准备。如果想要确保属性以特定的顺序出现,最好的办法就是完全避免使用 for in 语句,而是创建一个数组,在其中以正确的顺序包含属性名:
var i;
var properties = [
'first-name',
'middle-name',
'last-name',
'profession'
];
for (i = 0; i < properties.length; i++) {
document.writeln(properties[i] + ': ' + another_stooge[properties[i]]);
}
通过使用 for 而不是 for in,可以得到我们想要的属性,而不用担心可能发掘出原型链中的属性,并且我们按正确的顺序取得了它们的值。
delete 运算符可以用来删除对象的属性。如果对象包含该属性,那么该属性就会被移除,它不会触及原型链中的任何对象。
删除对象的属性可能会让来自原型链中的属性透现出来。
delete another_stooge.nickname;
减少全局变量污染
JavaScript可以很随意的定义全局变量来容纳应用的所有资源。但是全局变量削弱了程序的灵活性,应避免使用。
最小化使用全局变量的方法之一是为应用只创建一个唯一的全局变量:
var MYAPP = {};
这时这个变量编程了应用的容器:
MYAPP.stooge = {
"first-name": "Joe",
"last-name": "Howard"
};
MYAPP.flight = {
airline: "Oceanic",
number: 815,
departure: {
IATA: "SYD",
time: "2014-11-18 16:50",
city: "Beijing"
},
arrival: {
IATA: "SYD",
time: "2014-11-18 16:50",
city: "Beijing"
}
};
只要把全局性的资源都纳入一个名称空间之下,你的程序与其他应用程序、组件或类库之间发生冲突的可能性就会显著降低。