对象所有的key都是字符串,所以key加不加引号都无所谓。
但如果键名不符合标识名的条件(第一个字符是数字,或者有空格 运算符),也不是数字,key必须加引号。
let obj = {
1:true,
1x:'xx' // 报错
}
// property 属性
//属性的值是一个对象,就形成了一个链式引用
var o1 = {};
var o2 = { bar: 'hello' };
o1.foo = o2;
o1.foo.bar // "hello"
对象的引用
- 如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。
let obj1 = {a:'xx'};
let obj2 = obj1;
obj1.b = 123;
obj1 // {a: "xx", b: 123}
obj2 // {a: "xx", b: 123}
obj2.cc = 'abc';
obj1 //{a: "xx", b: 123, cc: "abc"}
obj2 //{a: "xx", b: 123, cc: "abc"}
- 取消某一个变量对于原对象的引用,不会影响到另一个变量。
obj1= 55;
obj1 // 55
obj2 // {a: "xx", b: 123, cc: "abc"}
// 这种引用局限于对象,如果两个变量指向同一个原始类型的值,那么这时都是值的拷贝。
let x = 1;
let y = x;
x = 2;
y // 1
属性的操作
obj2.a; // xx
obj2['a']; //xx
*************************************************
-方括号引用需加引号,数字键可以不加引号 它会自动转换成字符串
let foo = 'bar';
let obj = {
foo: 1,
bar: 2
};
obj.foo // 1
obj[foo] // 2 foo没有加引号 所以他指向的是bar 相当于obj['bar']
- 方括号内可以有表达式
obj = {5:'hello'};
obj[2+3]; //hello
- 如果键名是数值,不能用点运算符
obj.5 //报错
obj[5]// hello
- 查看一个对象本身所有的属性
let obj3 = {
5:'hello',
bb:123
}
Object.keys(obj3); // ['5','bb']
- delete 可以删除对象的属性
delete obj3[5] //true 删除成功返回true
Object.keys(obj3)// ['bb']
/* 删除一个不存在的属性也会返回true 且不报错
* 只能删险对象本身的属性,不能删除继承的属性 就算返回true继承属性也还是没有被删除
*/
in运算符
语法:字符串 in 对象名
let obj = {p: 1};
'p' in obj; //true
'toString' in obj; //true 无法辨别是对象自身的属性还是继承的属性
- 通过 hasOwnProperty方法判断属性是不是继承的
let obj ={};
if('toString' in obj){
console.log(obj.hasOwnPreperty('toString')) //false
}
for… in
- 遍历所有可遍历的属性,跳过不可遍历的属性
- 不仅遍历对象自身的属性,还遍历继承属性,如果继承属性是可以遍历的就会被for…in遍历到
// 可以得用hasOwnProperty方法内部判断属性是否为对象自身的属性
var person = { name: '老张' };
for (var key in person) {
if (person.hasOwnProperty(key)) {
console.log(key);
}
}
// name
function isEmpty(obj) {
for (var name in obj) {
return false;
}
return true;
}
let obj = {};
let obj1 = {
name: "xx"
};
isEmpty(obj); // true 判断对象是不是null
isEmpty(obj1); //true
with语句
作用:操作同一个对象的多个属性时,提供一些书写的方便
语法: with(对象){
语句
}
let obj ={
a:1,
b:2,
c:3
}
with(obj){
a = 4;
b = 5;
c = 6;
}
//等同于
obj.a = 4;
....
- 如果with区块内部有变量的赋值操作,必须是当前对象已经存在的属性,否则会创造一个当前作用域的全局变量。
var obj = {};
with (obj) {
p1 = 4;
p2 = 5;
}
obj.p1 // undefined
p1 // 4
// 由于with里无法判断变量是全局的还是局部的,所以不建议使用