Javascript中容易被忽略的细节-1 对象(1)

1. 对象字面量中的属性key如果是javascript非既存关键字,可以用双引号括起来,也可以不括,如果是既存关键字,必须用双引号。

2. 对象里面值的检索:

var stooge = {
		"first-name": "aaa",
		"aaa-bbb": "bbb",
		ttt: "fff"
	};

	alert(stooge["first-name"]);
	alert(stooge["aaa-bbb"]);
	alert(stooge.ttt);
	alert(stooge["ttt"]);
        alert(stooge.name || "none");
        alert(stooge.name && stooge.name.aaa);

有特殊字符的属性名只能通过[""]的方式访问,而且定义时必须用“”引用,一般的属性同时可以通过stooge.ttt和stooge["ttt"]两种方式访问

默认值填充:stooge.name || “none”,stooge.name为undefined时,默认值为”none”

尝试对undefined变量检索会抛出TypeError异常,可以用&&避免异常,stooge.name && stooge.name.aaa(出异常的要放到后面)

3. 对象通过引用传递
    var x = stooge; 表示指向同一对象,属性值完全一样。

4.原型

   

if(typeof Object.beget !== "function"){
		Object.beget = function(o){
			var F = function(){};
			F.prototype = o;
			return new F();
		}
	}

	var new_stooge = Object.beget(stooge);
	new_stooge["first-name"] = "ttt";
	new_stooge.ttt = "yhn"

	alert(stooge["first-name"]);
	alert(stooge.ttt);
        stooge.haha = "yyy";
        alert(new_stooge.haha);

可以看出虽然设置了在原型stooge链接的新对象new_stooge,但对新对象属性的修改不会影响到原型对象。

原型对象的新属性对其所有的原型链对象共享。比如c的原型对象是b,b的原型对象是c,如果c.aaa在c找不到,会到b找,如果b找不到再到c找,如果还找不到,就是undefined,这个过程叫委托。

Javascript for-in 慎用

Array.prototype.min = function() {
		var min = this[0];
		for (var i = 1; i < this.length; i++) {
			if (this[i] < min) {
				min = this[i];
			}
		}
		return min;
	};
	var arr = [1, 56, 34, 12];
	var total = 0;
	for (var i in arr) {
		total += parseInt(arr[i]);
	}
	alert(total);

因为为Array附加了min方法后,用for in输出的是NaN,用普通的for循环没有问题