JavaScript对象之初探

31次阅读

共计 1602 个字符,预计需要花费 5 分钟才能阅读完成。

初探对象

(一)定义:

  • 无序的数据集合
  • 声明方式:

    • let obj = new Object();
    • let obj = {};

(二)属性名

  • Object.keys (obj):可以得到 obj 的所有属性名
  • 变量作为属性名:
let a='name'
var obj = {a: jack;    // 属性名为 'a'}
var obj2 = {[a]: jack; // 属性名为 'name'}
  • 对比:不加 [] 的属性名会自动变成字符串;反之则会当成变量求值;值如果不是字符串则自动转换为字符串

(三)对象的隐藏属性

  • JS 中每一个对象都有一个隐藏属性
  • 这个隐藏属性储存这个对象的共有属性组成的对象的地址
  • 这个共有属性组成的对象就叫做原型。
  • 也就是说隐藏属性储存原型的地址。
  • 因为原型其实是共有属性组成的对象,所以原型也是一个对象,所以原型也有它的原型。

(四)属性的增删改查

1)删除

  • delete obj.xxx:删除 obj 中的 xxx 属性
  • 'xxx' in obj:若 xxx 在 obj 中返回 true,否则返回 false
  • obj.xxx === undefined

    • 结论:不能证明 xxx 是否为 obj 的属性
    • 原因:xxx 属性可能不存在,或者 xxx 属性存在但是值为 undefined

2)查看

  • Object.keys(obj):查看自身所有属性名

    • Object.values(obj):查看自身所有属性值
    • Object.entries(obj):查看所有属性和值
  • console.dir(obj):以目录形式查看自身 + 共有属性
  • 判断一个属性是否是自身的属性(非共有属性):obj.hasOwnProperty('xxx')
  • 查看属性

    • obj.xxx
    • obj['xxx']:与第一种等价
    • obj[xxx]:xxx 为变量,与上述两种完全无关

一道代码题区分开上述三种情况:

let list = ['name', 'age', 'gender']
        let person = {name: 'frank', age: 18, gender: 'man'}
        for (let i = 0; i < list.length; i++) {let name = list[i]
            console.log(???) // 这里 ??? 替换成什么使 person 所有属性被打印出来
        }
        // 1.console.log(person.name) 2.console.log(person[name])
        // 答案:console.log(person[name])

3)增改

  • 直接赋值:obj.name="xxx";
  • 批量赋值:
    //es6 新增语法,推荐使用
Object.assign(obj,{ name: xxx, age: xxx , gender: xxx})
  • 无法通过自身修改或修改原型:

    • obj.toString='xxx';只会作用在 obj 自身属性上
  • 修改原型:

    • 修改 obj.__proto__:不推荐
    • 必须要修改可以用Object.prototype
  • 将一个对象的原型设置为另一个对象:

    1. let obj2.__proto__ == obj (不推荐)
    2. let obj2 == Object.create(obj):推荐,es6 新写法,效果等同于第一种、
    3. create 配合 assign 创建对象

4)一些问题

  • 'x' in objobj.hasOwnProperty('x') 的区别:

    • 'xxx' in obj只能检查 xxx 是否在 obj 中而无法区分是否是自身属性
    • 相反地 obj.hasOwnProperty()可以对自身属性进行区分并返回 true,非自身属性返回 false
  • Object.create 和 new Object()的区别:
    // a 中的 name 为原型中的属性
var a = Object.create ({name: 'A'});
    // b 中的 name 为自身的属性
var b = new Object ({name:'A'})

正文完
 0