JS笔记《数据类型—对象》

113 阅读2分钟

对象概述

  • 对象是一组无序的相关属性和方法的集合,所有的事物都是对象。
    • 利用对象字面量(对象直接量)方式创建对象:
var obj = {  
    name'张三',   // 键值对  
    age18,  
    sayHifunction(arg){  // 匿名函数  
        console.log('Hello!' + arg);  
    }  
}

var obj = {
    1: 1,     // '1': 1
    1.3: 2,   // '1.3': 2
    true: 3   // 'true': 3
}

对象的所有键名都是字符串(除了Symbol)。即使键名是数值也会被自动转为字符串。

对象的引用

var obj = {};
var obj2 = obj;

obj.a = 1;
obj2.a;      // 1  
obj2.b = 2;  
obj1.b;      // 2

obj = [];
obj2;       // {a: 1, b: 2}

obj和obj2指向同一个内存地址,修改其中任何一个对象的属性都会影响另一个,但如果给obj重新赋值,则不会影响obj2,因为obj2仍然指向之前的内存地址

属性的操作

读取

var obj = { a: 1}

obj.a    // 1
obj['a'] // 1

var obj2 = { 0.7: 1}
obj2[0.7]  // 1 数值键名只能使用[]读取,使用 . 读取会报错

如果使用[]读取属性,则键名必须放在引号内(字符串),否则会被当做变量。但数值键名可以不加引号,因为会自动转成字符串

赋值

var obj = {};

obj.a = 1;
obj['b'] = 2;

obj  // {a: 1, b: 2}

.[]符号跟着赋值运算符=就是给属性赋值。

删除

var obj = { a: 1 }
delete obj.a  // true
obj.a  // undefined 

delete obj.b  // true

// 只有这一种情况delete会返回 false
var obj = Object.defineProperty({}, 'a', {
    value: 1,
    configurable: false  // 可配置性为false时不可删除
})
obj           // {a: 1}
delete obj.a  // false

删除一个不存在的属性也返回truedelete只能删除对象本身的属性,无法删除继承(原型链)的属性。

运算符 in

  • in运算符用于检查对象是否包含某个属性,返回boolean
var obj = {a: 1}
'a' in obj  // true
'toString' in obj // true  in 运算符无法识别哪些属性是自身的,那些是原型链上继承的
obj.hasOwnProperty('toString')  // false 使用 hasOwnProperty判断是否为对象自身的属性

for…in 循环

  • 用来遍历一个对象自身及原型链上的所有的可遍历属性,会跳过不可遍历的属性。
Object.prototype.grade = '一年级';  // obj的原型  
var obj = {  
    name'peter',  
    age18,  
    sex'男'  
}  
for (var prop in obj) {     // 变量定义可以写在外面  
    console.log(prop);      // 键: 'name' 'age' 'sex' 'grade'  
    console.log(obj[prop]); // 值: 'peter' 18 '男' '一年级'  
      
    if (obj.hasOwnProperty(prop)) { // 判断 prop 属性是否是自己身上的属性,返回 boolean   
        console.log(obj[prop]);     // 'peter' 18 '男'  
    }  
}

一般配合obj.hasOwnProperty()使用,只遍历对象自身属性。