JavaScript-数据类型-对象

对象所有的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里无法判断变量是全局的还是局部的,所以不建议使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中小余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值