-
下面列出的值被当作假(falsy):
false
null
undefined
空字符串' '
数字0
数字NaN
其他所有值都被当作真,包括true,字符串"false",以及所有对象。 -
检索: 使用
[]
或者.
(优先考虑使用.
,可读性更好)
尝试检索一个并不存在的成员属性的值, 将返回undefined flight.status //undefinded
flight["status"] //undefinded
|| 运算符可以用来填充默认值:
var status = flight.status || "unhnown";
尝试从undefined的成员属性中获取值将会导致TypeError异常。这时候可以通过&&运算符来避免错误
flight.equipment //undefined
flight.equipment.model //throw "TypeError"
flight.equipment && flight.equipment.model //undefined
-
引用
var x = stooge;
x.nickname = 'Curly';
var nick = stooge.nickname;
//x 和stooge 指向同一个对象的引用,=> nick为 'Curly'var a = {}, b = {}, c = {};
//a, b, c 每个都引用一个不同的空对象a = b = c = {};
//a, b, c 每个都引用同一个的空对象 -
反射
typeof 操作符确定属性的类型:
typeof flight.number //'number'
typeof flight.status //'string'
typeof flight.arrival //'object'
typeof flight.mainifest //'undefined'
原型链中的任何属性都会产生值:
typeof flight.toString //'function'
typeof flight.constructor //'function'
有两种方法去处理掉这些不需要的属性:
- 让你的程序做检查并丢弃值为函数的属性;
- 使用
hasOwnProperty
方法,如果对象拥有独有的属性,将返回true。hasOwnProperty
方法不会检查原型链。
flight.hasOwnProperty('number')//true
flight.hasOwnProperty('constructor')//false
- 枚举
for in
语句可以用来遍历一个对象中的所有属性名,可以通过hasOwnProperty
方法,以及typeof
来排除函数:
var name;
for (name in another_stooge) {
if (typeof another_stooge[name] !== 'function') {
document.writeln (name + ':'+another_stooge[anme]);
}
}
属性名出现的顺序是不确定的,要以特地顺序出现, 需要完全避免使用for in
语句, 而是创建一个数组,在其中以正确的顺序包含属性名:
var i;
var properties = [
'first-name',
'middle-name',
'last-name',
'profession'
];
for (i=0;i<properties.length;i+=1) {
document.writeln(properties[i]+':'+another_stooge[properties[i]]);
}
使用for
而不是for in
,可以得到我们想要的值而不用担心可能发掘出原型链中的属性,并且按照正确的顺序取得了它的值。
-
删除
delete 运算符可以删除对象的属性。
如果对象包含该属性,那么该属性就会北移除。
它不会触及原型链中的任何对象。
删除对象的属性可能会使原型链中的属性透现出来。
another_stooge.nickname // 'Moe'
delete another_stooge.nickname ; another_stooge.nickname //'Curly' -
减少全局变量污染
削弱了程序的灵活性,避免使用
方法之一:为你的应用值创建一个唯一的全局变量: var MYAPP = {};
该变量成为了你的应用容器:
MYAPP.stooge = {
"first-name":"Joe",
"last-name":"Howard"
};
MYAPP.flight = {
"number":815,
"arrival": {
IATA:"LAX",
"city":"Los Angeles"
}
};
只要全局性的资源都纳入一个名称空间下, 你的程序雨其他应用程序、组件或类库之间发生冲突的可能性就会显著降低。
- 作用域
尽管JavaScript的代码块语法貌似支持块级作用域,但实际上,JavaScript并不支持。这个混淆之处可能成为错误之源。
var foo = function() {
var a = 3 , b = 5;
var bar = function() {
var b = 7, c = 11;
//此时a为3,b为7,c为11
a += b + c;
//此时a为21,b为7,c为11
};
bar();
//此时 a为21,b为5
};
所以最好的做法是在函数体的顶部声明函数中可能用到的所有的变量。