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}=>undefinedobj.name=undefined=>undefinedobj=>Object { name: undefined, age: 11 }delete obj.name=>trueobj=>Object { age: 11 }
查看是否删成功
'name' in obj=>false 删成功,若为true没有成功obj=>Object { age: 11 } 没有name则成功
查
查看自身所有属性Object.keys(obj)
var obj={'name':'qq','age':11}=>undefinedObject.keys(obj)=>Array [ "name", "age" ]
查看自身+共有属性
console.dir(obj)//推荐obj.__pro__//两个_,不推荐
查看一个属性是自身的还是共有的
obj.hasOwnProperty('属性名')
var obj={'name':'qq','age':11}=>undefinedobj.hasOwnProperty('toString')=>falseobj.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的值为namelet key = 'name';obj.key = 'frank'//错因为obj.key等价于 obj['key']
批量赋值
Object.assign(obj,{name:'ww',age:18,gender:'man'})
修改或增加共有属性
let obj={},obj2={}//共有toStringobj.toString='xxx' //只会在改obj自身属性obj2.toString还是在原型上
修改原型的原型属性(不推荐改)
obj.__proto__.toString='xxx'//不推荐用__proto__window.Object.prototype.toString='yyy'
修改原型(上面是修改属性)
- 区别:原型本质是对象,共有属性是属性,依附于原型
obj.__proto__=null - 除了把原型改为null,也可以改其他值,原型链(可加原型)
let common={'国籍':'中国','hairColor':'black'}=>undefinedlet person={'name':'winter'}=>undefinedperson.__proto__=commonconsole.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=18person=>{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=>trueobj2.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为自身属性
