Skip to content

javascript中关于对象的使用

JavaScript的对象是一些列属性的集合,一个属性包含一个键值对(名称区分大小写A和a是不同属性)。

1.创建对象的方法

let obj = new Object();

let obj = {};

1.1设置对象属性

 //创建时设置
 let obj = {
    name: "张三"
 }

 //直接设置
 let obj = {}
 obj.name = '张三';

1.2访问属性

let obj = {
    name: '张三'
}
obj.name
obj[name]

2.枚举对象的所有属性

  • for in遍历
  • Object.keys(o)
  • Object.getOwnPropertyNames(o)

2.1 for in 循环 访问一个对象及其原型链中所有可枚举属性(不推荐使用)

let obj = {
    name: '张三',
    age: 12
}
for(let k in obj){
    console.log('key-'+k+'-value-'+obj[k])
}
//不推荐的原因 let arr = ['a','b','c']
Array.property.test = 'd';
//使用for in 循环会循环出d

2.2Object.keys(o) 遍历该方法返回一个对象自身(不包含原型中)的所有key的数组集合(推荐使用)。

let obj = {
    name: '张三',
    age: 12
}
let arr = Object.keys(obj);
arr.forEach((val)=>{
    console.log("key-"+val+"-value-"+obj[val])
})

2.3Object.getOwnPropertyNames(o)该方法返回一个数组返回所有属性,无论书否可枚举的名称

let obj = {
    name: '张三',
    age: 12
}

Object.defineProperty(obj,'FnB',{
    enumerable: false,
    value: function(){}
}) //定义一个不可枚举的属性

let arr = Object.getOwnPropertyNames(obj);


arr.forEach((val)=>{
    console.log("key-"+val+"-value-"+obj[val])
})

3.对象的扩展


3.1属性的简洁性

let a = 'aaa';
let b = {a};

3.2Object.is()

判断两个值相等Es5时可以用==或者=== 前者会制动转化类型后者+0 -0 NaN无法判断。


function isEqual(a,b){
    return Object.is(a,b)
}
let a = isEqual(NaN,NaN); //true ===判断时会是false
let a = isEqual(+0,-0); //false ===判断时会是true

3.3Object.assign()

将多个对象的所有可枚举属性合并到同一个对象身上 ,注意如果两个对象有同样的属性,后者会覆盖前者。

let a = {name:'aaa'};
let b = {age:12};
Object.assign(a,b);

3.4Object.values(),Obejct.entries()(Es8)

Object.values()返回值的数组集合,Object.entries返回键值对

let obj = {
    name: 'lee',
    age: 12
}
let a = Object.values(obj); //['lee',12]
let b = Object.entries(obj); //[['name','lee'],['age',12]]

4.对象的扩展运算符

4.1赋值运算

    let {x,y,...z} = {x:1,y:2,a:3,b:4};
    x:1
    y:2
    z: {a:3,b:4}

4.2实现浅拷贝

let a = {a:1}
let b= {b:2}
//Object.assign(a,b)
let c = {...a,...b};

5.可枚举与不可枚举的注意事项

  • for in 遍历所有可枚举属性(包含原型链中 不推荐使用)
  • Object.keys() 返回一个对象本身可枚举属性的数组集合(不包含原型链 推荐使用)
  • JSON.stringify 返回一个对象本身可枚举属性的对象字符串
function Person() {
        this.name ='jack'
    }
    Person.prototype = {
        constructor: Person,
        job: 'student'
    }

    var p = new Person()
    //创建一个不可枚举的属性
    Object.defineProperty(p,'sex',{
        value: 'man',
        enumerable: false
    })
    for(let key in p) {
        console.log(key+'='+p[key])
    }
    console.log(Object.keys(p))
    console.log(JSON.stringify(p))