JS 对象基本用法
声明对象的两种语法
let obj={'name':'winter','age':18}//程序员习惯写法
let obj=new Object({'name':'winter','age':18})//规范写法
对象属性的增删查改
删
- delete obj.xxx 或者delete obj[‘xxx’]
obj.name=undefined
和delete obj.name
前者其实是把name赋值为undefined,并没有删除,后者删除
以下=>为输出的意思
let obj={'name':'aa','age':11}
=>undefined
obj.name=undefined
=>undefined
obj
=>Object { name: undefined, age: 11 }
delete obj.name
=>true
obj
=>Object { age: 11 }
查看是否删成功
'name' in obj
=>false 删成功,若为true没有成功
obj
=>Object { age: 11 } 没有name则成功
查
查看自身所有属性Object.keys(obj)
var obj={'name':'qq','age':11}
=>undefined
Object.keys(obj)
=>Array [ "name", "age" ]
查看自身+共有属性
console.dir(obj)//推荐
obj.__pro__//两个_,不推荐
查看一个属性是自身的还是共有的
obj.hasOwnProperty('属性名')
var obj={'name':'qq','age':11}
=>undefined
obj.hasOwnProperty('toString')
=>false
obj.hasOwnProperty('name')
=>true
查看对象有没有这个属性
var obj={'name':'qq','age':11}
'name' in obj
=>true
'ww'in obj
=>false
查看属性的值obj[‘key’]或者obj.key
obj.name
=>"qq"
查看所有属性的值
Object.values(obj)
=>Array [ "qq", 11 ]
查看属性名和值obj或者Object.entries(obj)
obj
=>{…}
=>age: 11
=>name: "qq"
=><prototype>: Object { … }
Object.entries(obj)
=> […]
=>0: Array [ "name", "qq" ]
=>1: Array [ "age", 11 ]
=>length: 2
=> <prototype>:Array[…]
写(修改和增加)
直接赋值
let obj = {name: 'frank'} // name是字符串
obj.name = 'frank' // name 是字符串
obj['name'] = 'frank'
obj['na'+'me'] = 'frank'
obj[name] = 'frank'//错误, name是变量,值不确定
let key = 'name'; obj[key] = 'frank'//key定义了,可以这样使用,key的值为name
let key = 'name';obj.key = 'frank'//错
因为obj.key等价于 obj['key']
批量赋值
Object.assign(obj,{name:'ww',age:18,gender:'man'})
修改或增加共有属性
let obj={},obj2={}//共有toString
obj.toString='xxx' //只会在改obj自身属性
obj2.toString还是在原型上
修改原型的原型属性(不推荐改)
obj.__proto__.toString='xxx'//不推荐用__proto__
window.Object.prototype.toString='yyy'
修改原型(上面是修改属性)
- 区别:原型本质是对象,共有属性是属性,依附于原型
obj.__proto__=null
- 除了把原型改为null,也可以改其他值,原型链(可加原型)
let common={'国籍':'中国','hairColor':'black'}
=>undefined
let person={'name':'winter'}
=>undefined
person.__proto__=common
console.dir(person)
=>{…}
=>name: "winter"
=><prototype>: {…}
=>hairColor: "black"
=>"国籍": "中国"//person的原型被改为common对象,原型里面还有原型
=><prototype>: Object { … }
ES6新写法
let common={'国籍':'中国',hairColor:'black'}
let person=Object.create(common)//()的位置写要加的原型,对象名
person.name='winter'
person.age=18
person
=>{name:"winter",age:18}
‘name’ in obj和obj.hasOwnProperty(‘name’) 的区别
- ‘name’ in obj是查看这个对象有没有这个属性
- obj.hasOwnProperty(‘name’) 是判断属性是自身的还是共有的
能否断定’xxx’是obj的属性
- 不能
代码示例:
let obj={}
let obj2={x:undefined}
obj.x===undefined
=>true
obj2.x===undefined
=>true
'x' in obj
=>false
'x' in obj2
=>true
区别示例一和示例二
示例一:let obj1=Object.create({name:'winter'})//对象obj1={},加原型{name:'winter'},name为共有属性
示例二:let obj2=new Object({name:'winter'})//对象obj2={name:'winter'},name为自身属性