定义
对象就是一组键值对(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}
对象创建
- 直接创建
let obj = {
p: 123,
m: function () { ... },
}
- 间接创建
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"
PS:obj['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 遍历
- 遍历
所有属性(不可遍历属性除外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
- 只遍历
自身属性
var person = { name: '老张' }; //这里不可以用let,因为作用域和下面不一样
for (let key in person) {
if (person.hasOwnProperty(key)) {
console.log(key);
}
}
// name
---未完待续---