对象(Object)
一些平常的笔记,希望有所帮助
含义
可以理解为:一组"键值对"(key-value)的集合,是一种无序的复合数据集合。
let obj = {
foo:"Hello",
bar:"world"
}
//对象的所有键名都是字符串(ES6又引入了Symbol值也可以作为键名)
//所以不加引号也行
let obj2 = {
"foo":"Hello",
"bar":"World"
}
对象的所有键名都是字符串,不用引号也是可以的。
如果键名是数值 会被自动转为字符串
var a = {
1: 'a',
3.2: 'b',
1e2: true,
1e-2: true,
.234: true,
0xFF: true
};
console.log(a)
/* Object {
1: "a",
3.2: "b",
100: true,
0.01: true,
0.234: true,
255: true
}*/
console.log(a["100"]);// true
//看上去键名是数值,但是会全部自动转换为字符串
看上面键名是数值,但是会全部自动转换为字符串
键名不符合标识符,必须加上引号否则会报错
// 不报错
let b = {
'1p': 'Hello World',
'h w': 'Hello World',
'p+q': 'Hello World'
};
对象的每一个键名又称为“属性(property)”,他的键值(value)可以是任何数据类型
let c= {
p: function (x) {
return 2 * x;
}
};
console.log(c.p(3));//6
// c对象的属性p,指向一个函数
上面c对象的属性p,指向一个函数
对象也可以动态创建,不必在对象声明时就指定
let d = {};
d.foo = 123;
console.log(d.foo);//123
1.1属性的读取
let e = {
p:"hello world"
}
console.log(e.p);//hello world
console.log(e["p"]);//hello world
使用[]时键名必须放在引号里面,否则会被当做变量处理
let f = {
123: 'hello world'
};
// fff.123 // 报错
f[123] // "hello world"
数字键可以不用引号。但是不能用点运算
1.2属性的查看
// js允许属性后绑定
let g = {};
g.foo = "Hello";
g["bar"] = "World";
let h ={p:1};
//等价于
let j={};
j.p =1;
1.3属性的查看
let i = {
key1:1,
key2:2
}
console.log(Object.keys(i));
1.4属性的删除
let k={p:1};
console.log(Object.keys(k));//["p"]
delete k.p;
console.log(k.p);//1
console.log(Object.keys(k));//[]
值得注意的,删除不存在的属性,照样返回true
let l = {};
console.log(delete obj.p);//true
注意:delete无法删除继承属性
1.5判断属性是否存在
// in运算符有一个问题,他不能识别哪些属性是对象自身的,哪些是继承的
let m = {p:1};
console.log("p" in m);//true
console.log('toString' in m);//true
// 这时需要hasOwnProperty的方法判断一下,是否为对象自身属性
let n ={};
if('toString' in obj){
console.log(n.hasOwnProperty('toString'));//false
}
1.6属性的遍历
var o = {a: 1, b: 2, c: 3};
for (let i in o) {
console.log('键名:', i);
console.log('键值:', o[i]);
}
// 键名: a
// 键值: 1
// 键名: b
// 键值: 2
// 键名: c
// 键值: 3
// for in需要注意的两个点
// 1:他遍历的是对象所有可遍历的属性,会跳过不可遍历的属性
// 2:不仅遍历自身的属性,还遍历继承的属性
只遍历自身属性
let person = {name:"123"}
for(let key in person){
if(person.hasOwnProperty(key)){
console.log(key);
}
}