JavaScript学习笔记(1)

1. for in语句

会枚举一个对象的所有属性名或键名,在每次循环中,对象的另一个属性名字字符串会被赋值给for和in之间的变量。

循环对象的所有属性:

var o = {a:'aa', b:'bb', c:'cc'};
for(var p in o)
{
   alert(eval("o." + p));
}

循环数组的所有元素:

var arr = ['11', '22', '33'];
for(var i in arr)
{
   alert(arr[i]);
}

for in语句会列出所有的属性,包括函数和原型中的属性。可以使用hasOwnProperty方法来区分是否自己的属性还是原型中的属性,也可以使用typeof来排除函数。

2. 检索对象值

要检索对象中包含的值,可以采用在[ ]后缀中括住一个字符串表达式,如果字符串表达式是一个常数,且是一个合法的javascript标识符而非保留字,那么也可以采用.表达式

var flight={
            airline:"Oceanic",
            number: 815,
            departure: {
                IATA: "SYD",
                time: "2012-07-24 10:23",
                city: "Sydney"
            },
            arrival: {
                IATA: "LAX",
                time: "2012-07-24 18:23",
                city: "Los Angeles"
            }
        };
                                                      
flight["airline"] //"Oceanic"
flight.airline //"Oceanic"

如果你尝试检索一个并不存在的成员元素的值,将返回一个undefined值。

    flight.flightname //undefined

技巧:

||运算符除了可以用来逻辑判断之外,还可以用来填充默认值:

    var name = flight.flightname || "unknown"; //"unknown"

当尝试检索一个undefined 值将会导致TypeError异常,可以通过&&运算符来避免错误。

flight.equipment  //undefined
flight.equipment.model  //throw "TypeError"
flight.equipment && flight.equipment.model  //undefined

3. 更新对象值

对象中的值可以通过赋值语句来更新。

如果属性名已经存在于对象中,那么这个属性的值被替换。

    flight.number=800;

如果对象之前没有拥有这个属性,那么该属性就被扩充进这个对象中。

    flight.equipment = {model: "Boeing 777"};

4. 对象通过引用来传递。它们永远不会被拷贝。

    var flight={
            airline:"Oceanic",
            number: 815,
            departure: {
                IATA: "SYD",
                time: "2012-07-24 10:23",
                city: "Sydney"
            },
            arrival: {
                IATA: "LAX",
                time: "2012-07-24 18:23",
                city: "Los Angeles"
            }
        };
        var x = flight;
        x.number = 800;
        var number = flight.number;  //因为x和flight是指向同一个对象的引用,所以number为800
                                       
        var a = {}, b = {}, c = {};  //a,b,c每个都引用一个不同的空对象
        a = b = c = {};  //a,b,c都引用同一个空对象

5. 原型

每个对象都连接到一个原型对象,并且它可以从中继承属性。

所有通过对象字面量创建的对象都连接到Object.prototype这个JavaScript中标准的对象。

当你创建一个新对象时,你可以选择某个对象作为它的原型。

下面,我们将给Object增加一个create方法,这个create方法创建一个使用原对象作为其原型的新对象。

    if (!Object.create) {
            Object.create = function(o) {
                var F = function(){};
                F.prototype = o;
                return new F();
            };
        }
    var x = Object.create(flight);

原型连接在更新时是不起作用的。当我们对某个对象作出改变时,不会触及到该对象的原型。

var x = Object.create(flight);
x.number = 800;
var number = flight.number;  //仍然是815

原型连接只有在检索值的时候才被用到。如果我们尝试去获取对象的某个属性值,且该对象没有此属性名,那么JavaScript会从原型对象中获取属性值,如果那个原型对象也没有,那么再从它的原型对象中寻找,依此类推,直到该过程到达终点 Object.prototype。如果想要的属性完全不存在于原型链中,那么返回undefined值。这个过程称为委托

原型关系是一种动态的关系。如果添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。

var x = Object.create(flight);
flight.name = "Air Flight";
x.name  //"Air Flight"


6. hasOwnProperty

检查属性是否该对象所有,而不是其原型链中的。

var x = Object.create(flight);
x.hasOwnProperty("number")  //false
var x = Object.create(flight);
x.number = 800;
x.hasOwnProperty("number")  //true

7. 删除对象的属性

delete运算符可以用来删除对象的属性。它将会移除对象中确定包含的属性,不会触及原型链中的任何对象。

delete flight.number;
flight.number;  //undefined
var x = Object.create(flight);
delete x.number;
x.number;  //815 这是x的原型flight对象的number属性的值。 因为x本身没有number属性,delete不会触及原型。

删除对象的属性可能会让来自原型链中的属性浮现出来。

var x = Object.create(flight);
x.number = 800;
x.number;  //800
delete x.number;  //移除x的number属性,从而暴露出原型的number属性
x.number;  //815

8. 减少全局变量污染

JavaScript可以随意的定义那些可保存所有应用资源的全局变量。不幸的是,全局变量削弱了程序的灵活性,所以应该避免。

最小化使用全局变量的一个方法是在你的应用中只创建唯一的一个全局变量:

    var MYAPP = {};

该变量此时变成了你的应用容器:

    MYAPP.flight={
            airline:"Oceanic",
            number: 815,
            departure: {
                IATA: "SYD",
                time: "2012-07-24 10:23",
                city: "Sydney"
            },
            arrival: {
                IATA: "LAX",
                time: "2012-07-24 18:23",
                city: "Los Angeles"
            }
        };

只要把多个全局变量都整理在一个名称空间下,将显著降低与其他应用程序、组件或类库之间产生糟糕的相互影响的可能性。以后,会看到使用闭包来进行信息隐藏,它是另一个有效减少全局变量污染的方法。

原创文章,转载请注明: 转载自闲云博客

本文链接地址: JavaScript学习笔记(1)

发表评论

电子邮件地址不会被公开。 必填项已用*标注