JS对象&&属性读取.与[]的区别

2,056 阅读3分钟
javascript对象也有属性来定义它的特征。也可以用无序的数据集合或键值对的集合来定义javascript对象。

声明对象的两种写法

  • let obj = { 'name': 'frank', 'age': 18 }或者let obj =new Object ({'name': 'frank', 'age': 18 })
  • console.log({'name':'frank','age':18})
  1. 上面name、age代表属性名也就是键,frank、18代表属性值也就是值。
  2. 键名是字符串,不是标识符,可以包括任意字符。
  3. 引号可以省略,省略之后只能写标识符。
  4. 就算引号省略了,键名也还是字符串。

删除对象的属性

  • delete obj.xxx或delete obj['xxx']

即可删除obj的xxx属性

  • 'xxx' in obj ===false

说明obj里面没有xxx属性

  • 'xxx' in obj &&obj.xxx===undefined

说明obj里面有xxx属性,但是没有定义

  • 注意obj.xxx===undefined时,不能断定obj是否含有xxx属性

var obj={}
var obj2={xxx:undefined}


我们可以看到obj2含有xxx属性但是还是返回undefined,所以当返回值返回undefined时无法判断是否含有该属性。此时我们应该用'xxx' in obj看他的返回值是ture还是false。


查看对象的属性

  • 查看所有属性
  1. 查看自身所有属性

      Object.keys(obj)

   2.查看自身+共有属性

console.dir(obj)/Object.key打印出obj.__proto__

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

obj.hasOwnProperty('toString')

如果不是自身的就返回false,是自身的返回ture。

  • 查看属性
  1. 两种方法查看属性
  • 中括号语法

        obj['key']

  • 点语法

        obj.key

两种语法建议使用中括号语法(针对新手),点语法会误导你以为key不是字符串。


修改或增加对象的属性

  • 直接赋值

let obj = {name: 'frank'} 
obj.name = 'frank' 
obj['na'+'me'] = 'frank' 
let key = 'name'
obj[key] = 'frank'
let key = 'name'; 
  • 批量赋值

Object.assign(obj,{age:18;gender:'man'})

  • 修改或增加共有属性

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

let obj={}
let obj2{}
obj.toString='xxx'


2.强行修改或增加原型上的属性

obj.__proto__.toString='xxx'
Object.prototype.toString='xxx'

一般来说不要修改原型,会引起很多问题。

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

共同点是两种查看属性是不是在对象里的方法
前者自身属性和共有属性都返回true,后者仅仅是自身属性才返回true

属性读取.与[]的区别

js在属性读取的时候可以用到.语法和[ ]语法,但是[ ]语法可以取代.语法,而.语法却不能取代功能更强大的[ ]语法,在下列情况下就只能用[ ]语法了:

  1. 可以用变量作为属性名或访问,而点方法不可以

    let obj={}
    obj.name = 'leehome'
    let attr ='name'
    obj.attr
    //undefined
    obj[attr]
    //leehome


  2. []中括号法--可以用数字作为属性名,而点语法不可以

    let obj = {1:'周一',2:'周二',3:'周三',4:'周四',5:'周五',6:'周六',7:'周日'}
    
    console.log(obj[1])
    // 周一
  3. [ ] 可以动态访问的属性名,可以在程序运行时创建和修改属性,点操作符就不行 

    const obj={};
    const message=['leehome','handsome','man'];
    for(i=0;i<3;i++){
      obj['attr'+i]=message[i];
    }
    console.log(obj);
    //{attr0: "leehome", attr1: "handsome", attr2: "man"}
  4. 如果属性名中包含会导致语法错误的字符,或者属性名是关键字或者保留字,也可以使用方括号表示法。

const obj ={'first name':'liu','last name':'chuanfeng' ,if'test'}
console.log(obj['first name'])
//liu
console.log(obj.first name)
//语法错误



详细可查询:使用对象MDN