JS 对象基本用法

162 阅读3分钟

对象

定义

  • 无序的数据集合
  • 键值对的集合('name': 'hello'键表示前面的'name' ,值表示后面的'hello')

写法

let obj = {'name':'frank', 'age':18}
let obj = new Object({'name':'frank'}) //标准语法
console.log({'name':'frank','age':18})
//⚠️ 注意
{ foo:1} 这个不表示对象 ,表示一个代码区块,里面有一个标签foo,指向表达式1

细节(重点)

  • 键名是字符串,不是标识符,可以包含任意字符

  • var obj = {
        '':1
    }
    obj {"": 1}
    var obj = {
        2:'22222'
    }
    obj {2: '22222'} //依然是一个字符串
    Object.keys(obj)
    ["2"]
    
  • 引号可以省略,但是省略之后就只能符合标识符的标

  • obj
    {中文: 22222}
    Object.keys(obj)// ["中文"]
    var obj = {
       a b:22222 //报错必须加引号
    }
    
  • 就算引号省略了,键名也还是字符串

  • obj {2: '22222'} //依然是一个字符串
    Object.keys(obj)
    ["2"]
    

删除对象的属性

delete obj.xxxdelete obj['xxx']

  • 即可删除obj 的 xxx 属性
  • 请区分 「属性值为 undefined」和 「不含属性名」
var obj1 = {
    name:'frank',
    age:18
}
obj1.name = undefined; //还是含有属性名
'name' in obj1 //true

不含属性名: 'xxx' in obj === false

var obj1 = {
    name:'frank',
    age:18
}
delete obj1.name //不含属性名
'name' in obj1 // false

含属性名,但是值为undefined:'xxx' in obj && obj.xxx === undefined

var obj1 = {
    name:'frank',
    age:18
}
obj1.name = undefined; //还是含有属性名
'name' in obj1 && obj1.name === undefined //true
delete obj1.name // 不含属性名
'name' in obj1 && obj1.name === undefined //false

【注】 obj.xxx === undefined (值为undefined)不能判断是否有xxx,这个只能判断属性值,不能判断属性名,所以不能断定'xxx' 是否为obj 的属性, 例:

var obj = {};
var obj2 = {x:undefined} 
obj["x"] === undefined //true
obj2['x'] === undefiend //true

查看对象的属性(读取)

查看自身所有属性的键(key) Object.keys(obj)

var obj1 = {
    'name':'frank',
    age:18
}
Object.keys(obj1) //["name", "age"]

查看自身所有属性的值 Object.values(obj)

var obj1 = {
    'name':'frank',
    age:18
}
Object.values(obj1) //  ["frank", 18]

查看所有属性的键值(可以直接输出obj,或者用Object.entries(obj)

var obj1 = {
    'name':'frank',
    age:18
}
obj1  // {name: "frank", age: 18}
Object.entries(obj1)  //(2) [Array(2), Array(2)]0: (2) ["name", "frank"]1: (2) ["age", 18]length: 2__proto__: Array(0)

查看自身+共有属性

  • console.dir(obj)
  var obj1 = {
    'name':'frank',
    age:18
}
  console.dir(obj1)
  //name: "frank"
  //age: 18
  //__proto__: 
  • 或者自己依次用Object.keys打印出 obj.__ proto __

判断一个属性是自身的还是共有的 obj.hasOwnProperty('toString')

obj1.hasOwnProperty('name') //true

obj1.hasOwnProperty('toString') //false

查看属性

两种方法查看属性

  • 中括号语法:obj['key'](推荐)

  • 【注】数值键名只能使用方括号运算符,在数值键中可加引号,也可不加(会自动转成字符串)

    var obj = {
        name:'frank',
        age:18
    }
    obj['name'] // 'frank'
    obj['age'] // 18
    
    var obj = { 1:'hello wrod'}
    obj[1] //'hello wrod'
    obj['1'] //'hello wrod'
    
  • 点括号:obj.key 【注】数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符

    obj.name // 'frank'
    
  • 【注】obj[key] 这个是变量的key值,不是字符串'key'

请先使用中括号语法

  • 点语法会误导你,让你以为key不是字符串
  • 等你确定不会弄混两种语法,在改点语法

obj.name 等价于 obj['name'], obj.name 不等价于 obj[name]

let name = 'frank' ,obj[name]等价于obj['frank'] 而不是obj['name']obj.name

修改或增加属性(写属性)

直接赋值

let obj = {name:'frank} // name是字符串

obj.name = 'frank' // name是字符串

obj['name']= 'frank'

obj['na' + 'me']= 'frank' // 因为会先求键值

修改和增加是一样的操作

var obj = {name:'frank',age:18}
obj['name'] = 'jack'; //这样也可以直接重新赋值
obj// {name:'jack',age:18}

批量赋值

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

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

  • 'name' in obj 它不会判断一个属性是自身的还是共有的,包含返回 true ,不含返回false
let obj = {
    name:'frank',
    age:18
}
'name' in obj //true
'toString' in obj //true
  • obj.hasOwnProperty('name') 会判断是否为对象自身的属性,包含返回 true ,不含 返回 false
let obj = {
    name:'frank',
    age:18
}
obj.hasOwnProperty('name') //true
obj.hasOwnProperty('toString')//false