对象(ES6)

135 阅读2分钟

定义

对象就是一组键值对(key-value)的集合。
如下列代码,变量obj指向这个对象的内存地址。

let obj = {
  a: 'Hello',
  b: 'World'
};

2个键值对:a: 'Hello'b: 'World'
键名:a b
键值:'hello' 'world'
键值对之间用,隔开。

键名(属性)

对象的所有键名都是字符串,会自动转换为字符串。

键值

键值可以为任何数据类型;如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。可以理解为在存放整个对象的内存中,有一小块内存名为键名,存放的是键值。(用键名指向这块存放键值的内存)

let obj = {
  p: function (x) {
    return x * x;
  }
};

obj.p(2) //调用方式
// 4

不用变量保存对象,{}是表达式还是语句?

{foo:123}

JavaScript 引擎的做法是,如果遇到这种情况,无法确定是对象还是代码块,一律解释为代码块。 解释为对象方法:加()

eval('{foo: 123}') // 123
eval('({foo: 123})') // {foo: 123}

对象创建

  1. 直接创建
let obj = {
  p: 123,
  m: function () { ... },
}
  1. 间接创建
let obj = {};
obj.foo = 123;

obj
//{foo: 123}

属性(键名)的增删改查、判断、遍历

属性读取(查)

let obj = {
  key1: 1,
  key2: 2
};

Object.keys(obj);
// ['key1', 'key2']

Object.keys()可以查看所有键名

let obj = {
  p: 'Hello World'
};

obj.p // "Hello World"
obj['p'] // "Hello World"

PSobj['p'],p最好加引号;如果外面还有一个p变量,那么obj[p]便是p变量。

let foo = 'bar';

let obj = {
  foo: 1,
  bar: 2
}

obj[foo] //2
obj['foo'] //1

由此可见:obj[foo]=obj['bar']
PS:键名是数字(number)的话,便只能用obj[1]这种格式。obj[1]里面的1会被转换为字符串'1'

let obj = {
  0.7: 'Hello World'
};

obj['0.7'] // "Hello World"
obj[0.7] // "Hello World"
obj.0.7 //报错

属性赋值(改)

let obj = { p: 1 };

// 等价于

let obj = {};
obj.p = 1;

属性的删除(删)

delete命令

let obj = { p: 1 };
Object.keys(obj) // ["p"]

delete obj.p // true
obj.p // undefined
Object.keys(obj) // []


Object.keys(obj) instanceof Array  //true

Object.keys返回的是一个数组
PS
1.无法删除不允许删除的属性
2.只能删除自身属性,无法删除继承属性

in运算符与hasOwnProperty方法(判断)

in检查对象是否包含相应的属性(键名),包括继承属性。由于属性是字符串,判断也要用字符串判断

let obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
var obj = {};
if ('toString' in obj) {
  console.log(obj.hasOwnProperty('toString')) // false
}

hasOwnProperty判断对象是否拥有自己的属性.由于属性是字符串,判断也要用字符串判断

let obj = {};
if ('toString' in obj) {
  console.log(obj.hasOwnProperty('toString')) // false
}

for...in 遍历

  1. 遍历所有属性(不可遍历属性除外toString),包括继承属性。
let obj = {a: 1, b: 2, c: 3};

for (var i in obj) {
  console.log('键名:', i);
  console.log('键值:', obj[i]);
}
// 键名: a
// 键值: 1
// 键名: b
// 键值: 2
// 键名: c
// 键值: 3
  1. 只遍历自身属性
var person = { name: '老张' }; //这里不可以用let,因为作用域和下面不一样

for (let key in person) {
  if (person.hasOwnProperty(key)) {
    console.log(key);
  }
}
// name

---未完待续---