JS中的对象

  对象

概念:简单说,所谓对象,就是一种无序的数据集合,有若干个“键值对”(key-value)构成。

var obj = {
    name : 'tom',
    sex : 'man'
};

上面代码中,大括号就定义了一个对象,这是一种字面量的写法,它被复制给变量 obj 。 这个对象内部包含了一个键值对(又称为“成员”), name 和 sex 是“键名”(成员的名称),字符串“tom”和“man”是“键值”(成员的值)。键名和键值之间用冒号分割。如果对象内部包含多个键值对,每个键值对之间用逗号分割。

  键名

对象的所有键名都是字符串,可以加引号也可以不加引号。如果键名是数值,会被自动转换成字符串。

var o = {
    1 : 'a',
    3.2 : 'b'
}

  上面以数值作为键名都会转换成字符串

如果键名不符合标识符的命名规则(比如第一个字符为数字,或者含有空格或运算符),也不是数字,则必须加上引号,否则会报错。

var o ={
    '1p' : "Hellow World",
    'h w' : "Hellow World",
    'p+q' : 'Hellow World'
};

  上面的键值不符合标识符的命名规则,所以必须要加引号

对象的每一个“键名”又称为“属性”(property),它的“键值”可以是任何的数据类型。如果一个属性的值为函数,通畅把这个属性成为“方法”,它可以像函数那样调用。

var obj = {
    p: function(){...}
};

  关于属性的操作

对象的属性有两种方法可以读取:

var obj = {
    name: 'tom',
    sex:'man'
};
obj.name  //"tom"
obj['sex']  //"man"

  可以通过对象名后面加点“.”的方式,也可以对象名后面加['']。

  注意:如果键名是数值的话,不能用“.”的方式获取对象的属性,这样会报错,而用方括号的方式引号加不加上都可以。

对象的属性可以动态的创建

var obj = {
    name: 'tom',
    sex:'man'
};

obj.age = 20;
obj.age    //20

  上面代码对对象动态创建了一个属性且赋值。

  对象的操作

1)查看所有属性

可以用 Object.keys 方法查看对象的所有属性。

var obj = {
    name: 'tom',
    sex:'man'
};

Object.keys(obj)    //["name", "sex"]

2)删除对象的属性

用delete方法可以删除对象的属性,删除成功后返回true。

var obj = {
    name: 'tom',
    sex:'man'
};

delete obj.sex  //true
obj.sex  //undefined
Object.keys(obj)  //["name"]

注意!删除一个本来就没有的属性是不会报错的,还是会返回true

3)in运算符

in运算符可以检查对象是否包含某种属性,如果包含返回true,反之返回false。

var obj = {
    name: 'tom',
    sex:'man'
};

'name' in obj    //true

4)for...in 循环

for...in 循环可以遍历对象的所有属性

var obj = {
    name: 'tom',
    sex:'man'
};

for(var keys in obj){
    console.log(obj[i]);
}

//"tom"
//"man"

  其他要点

对象的引用

如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。

var o1 = {};
var o2 = o1;

o1.a = 1;
console.log(o2.a);    //1

o2.b = 2;
console.log(o2.b);    //2

上面代码中,o1o2指向同一个对象,因此为其中任何一个变量添加属性,另一个变量都可以读写该属性。

此时,如果取消某一个变量对于原对象的引用,不会影响到另一个变量。

var o1 = {};
var o2 = o1;

o1 = 1;
o2 // {}

上面代码中,o1o2指向同一个对象,然后o1的值变为1,这时不会对o2产生影响,o2还是指向原来的那个对象。

但是,这种引用只局限于对象,如果两个变量指向同一个原始类型的值。那么,变量这时都是值的拷贝。

var x = 1;
var y = x;

x = 2;
y // 1

上面的代码中,当x的值发生变化后,y的值并不变,这就表示yx并不是指向同一个内存地址。

参考资料:http://javascript.ruanyifeng.com/grammar/object.html#toc4

猜你喜欢

转载自www.cnblogs.com/ianyanyzx/p/9225751.html