js对象基本用法

62 阅读3分钟

一、声明对象的两种语法

  • 简单版
let obj = { 'name': 'aman', 'age': 25 }
复制代码
  • 规范版
let obj = new Object({ 'name' : 'aman' })
复制代码

重点!!!

  • 键名是字符串,不是标识符,可以包含任意字符;
  • 引号可以省略,省略之后就只能写标识符;
  • 就算引号省略了,键名也还是字符串;
  • 每个key都是对象的属性名(property);
  • 每个value都是对象的属性值
  • Object.keys(obj)可以得到obj的所有key;

二、如何删除对象的属性

(1)delete操作符

①delete obj.['xxx'] :

let obj = { 'name': 'Aman', 'age': 22 }

console.log(obj.name)
delete obj['name']           // 删除"name"属性名和"Aman"属性值 ,反馈为true
console.log(obj['name'])    // 得到: undefined
复制代码

②delete obj.xxx :

let obj = { 'name': 'Aman', 'age': 22 }

console.log(obj.age)    
delete obj.age          // 删除"age"属性名和"22"属性值:,反馈为true
console.log(obj.age)   // 得到: undefined
复制代码

重点!!!

  • 注意区分【属性值为undefined】和【不含属性名】;

(2)不含属性名的情况

① 'xxx' in obj === false:

let obj = {};
delete obj.p; //true
复制代码
  • 上面代码中,对象 obj 并没有 p 属性,但是 delete 命令照样返回 true。因此,不能根据 delete 命令的结果,认定某个属性是存在的;
  • 只有一种情况,delete 命令会返回 false,那就是该属性存在,且不得删除;

(3)含有属性名,但是值为undefined的情况

① obj.xxx = undefined:

let obj = { 'name': 'Aman', 'age': 22 }

obj.name = undefined  //将"name"属性值等于undefined,保留属性名"name"
复制代码

②'xxx' in obj :

'name' in obj //返回为falsy时表示已将'name'删除,
              //返回为true时表示'name'未删除
复制代码

重点!!!

  • delete obj.xxx 和obj.xxx = undefined区别在于:

    delete是删除属性名+属性值;

    obj.xxx = undefined是将属性值改为undefined;

  • 'xxx' in obj 用于查看是否将属性值修改成功;

  • 'xxx' in obj不能断定'xxx'是否为obj的属性;

三、如何查看对象的属性

(1)查看自身所有属性

Object.keys(obj)
复制代码

(2)查看自身+共有属性

console.dir(obj)
复制代码

(3)判断一个属性是自身的还是共有的

obj.hasOwnProperty('toString')
复制代码

(4)两种方法查看属性

中括号语法: obj['key']

点语法: obj.key

(请优先使用中括号语法 点语法会误导你,让你以为key不是字符串 等你确定不会弄混两种语法,再改用点语法)

注意!!!

obj.name`等价于`obj['name']
obj.name`不等价于`obj[name]
复制代码

简单来说,这里的name是字符串,而不是变量

let name = 'Aman'
obj[name] `等价于` obj['Aman']
           而不是
obj['name'] & obj.name
复制代码

(5)查看属性值

let obj = { 'name': 'Aman', 'age': 22 }
obj.name = undefined //将name属性值改为undefined
console.log(obj['name'])  //返回undefined
复制代码

四、如何修改或增加对象的属性

(1)直接赋值

let obj ={name:'frank'} //name是字符串
obj.name='frank' //正确
obj['name']='frank' //正确
obj[name]='frank' //错误,因为name在此处为变量,值不确定
obj['na'+'me']='frank'  //正确
let key='name', obj[key]:'frank' //声明变量
let key='name';obj.key='frank' //错误,因为obj.key等价于obj.['key']
复制代码

(2)批量赋值

Object.assign(obj.{age:18,gender:'man'})
复制代码
  • 无法通过自身修改或增加共有属性
let obj = {},obj2 = {}; //共有属性toString
obj.toString = "xxx"; //'xxx'只会修改obj自身属性
obj2.toString; //还是再原型上
复制代码
  • 修改隐藏属性:Object.create
let obj=Object.create(common),
obj.name='frank',
let obj2=Object.create(common),
obj2.name='jack'
复制代码

五、'name' in obj 和 obj.hasOwnProperty('name') 的区别


'toString' in obj //true,in是查看,但并不知道是自身还是共有属性
obj.hasOwnProperty('toString') //false 说明toString不是自身属性
var obj={name='frank',age:18} //undefined
obj.hasOwnProperty('name') //true
obj.hasOwnProperty('toString') //false
复制代码

注意!!!

  • 'xxx' in obj 并不知道查看的是自身属性还是共有属性;
  • obj.hasOwnProperty(‘xxx')查看的是自身的属性


作者:朔澜