js对象基本用法

251 阅读3分钟

对象的定义

  • 无序的数据集合
  • 键值对的集合 声明对象的两种写法
  let obj={name:'ross',age:18}
  let obj=new Object({'name':'ross','age':18})

注意:

  • 键名是字符串,不是标识符,可以包含任意字符
  • 引号可以省略,省略后就只能写标识符
  • 引号省略后,键名还是字符串 我们可以通过Object.keys(obj)来查看键名的类型为字符串

每个key值也称为对象的属性名,每个value也称为对象的属性值。

变量如何做属性名
之前都是用常量做属性名

let p1='name'
let obj={p1:'ross'}//属性名为'p1'
let obj={[p1]:'ross'}//属性名为'name'

注意区别:

  1. 不加[]的属性名会自动变成字符串
  2. 加了[]则会当作变量求值
  3. 值不是字符串,则会自动变成字符串

对象的增删改查

语法:delete obj.xxxdelete obj['xxx']即可删除对象属性

let obj={
  name:'jack',
  age:'18'
}
console.log(obj) //name:"jack",age:"18"
delete obj.name //true
console.log(obj) //age:"18"
'name' in obj//false
'age' in obj //true

注意:要明白属性值为undefined不含属性名的区别
不含属性名:'xxx' in obj===false
含有属性名,但值为undefined:'xxx' in obj&&obj.xxx===undefined
obj.xxx===undefined不能判定'xxx'是否为obj的属性
来个例子加深印象:

查看所有属性名:Object.keys(obj)
查看所有属性值:Object.values(obj)
查看属性名和属性值:Object.entries(obj)
查看自身+共有属性:console.log(dir)

查看特定属性:
1.中括号语法:obj['key']
2.点括号语法:obj.key

  let obj={
  name:'jack',
  age:'18'
 }
console.log(obj['name'])//jack
console.log(obj.age)//18

in和hasOwnproperty的区别

区别:
in 属性用来判断对象拥有的自身属性和共有属性,但是,不能区别该属性来自自身还是共有属性
hasOwnProperty用于判断对象是否来自自身属性,是自身属性返回true,否则返回false

let obj={
  name:'jack',
  age:'18'
}
console.log('name' in obj) //true
console.log('toString' in obj)//true
console.log(obj.hasOwnProperty('name'))//true
console.log(obj.hasOwnProperty('toString'))//false

解析:
name 是自身拥有的属性,所以,用in和hasOwnproperty检测都为true toString是公共属性,in能检测出来,所以结果为true;toString用hasOwnProperty检测为false,因为 hasOwnProperty只检测自身的属性,所以为false。

改或者增

1.直接赋值

let obj={name:'jack}//这里的name是字符串
obj.name='ross'//name是字符串
obj['name']='jack'

2.批量赋值

修改或增加共有属性

无法通过自身修改或增加共有属性

  let obj={}
  let obj2={}
  obj.toString='xxx'//只会修改自身的属性
  obj2.toString

上述代码中,obj和obj2都含共有属性toString,obj.toString='xxx'只会修改自身属性,从而不会影响obj2的toString,obj2的toString还在原型上。


通过上图,得知obj和obj2它们的toString都是在原型上


从上图可以得出结论:修改自身属性,无法影响到共有属性。

如果偏要修改的话,那就修改原型上的属性吧

  obj.__proto__.toString='xxx'
  Object.prototype.toString='xxx'//推荐这种写法

修改隐藏属性

修改隐藏属性推荐使用Object.create

let obj={name:'ross'}
let obj2={name:'jack'}
let common={kind:'human',hairColor:'black'}
obj.__proto__=common
obj2.__proto__=common

 let common={kind:'human',hairColor:'black'}
 let obj=Object.create(common)
 obj.name='ross'
 let obj2=Object.create(common,{
 name:{value:'jack'}
 })


有没有很像原型链的感觉?