《JS 对象基本用法》

303 阅读3分钟

声明对象的两种语法

第一种是简单写法

let obj = {
    'name' : 'long',
    'age' : 18
}

第二种是原始写法

let obj = new Object({
    'name' : 'long',
    'age' : '18'
})

一些特殊的属性名

let obj = {
  1: true,    // 1 --> '1'
  3.2: true,  // 3.2 --> '3.2'
  1e2: true,  // 1e2 --> '100'
  1e-2: true, // 1e-2 --> '0.01'
  .234: true, // .234 --> '0.234'
  0xFF: true  // 0xFF --> '255'
}
  • 注意
  1. 对象都是以键值对的形式出现
  2. 键名是字符串,不是标识符,可以包含任意字符串
  3. 引号可以省略,省略之后只能按标识符的规则写(数字除外)
  4. 就算引号省略了,键名也还是字符串
  5. 当键名有空格,中文等特殊符号是,必须加引号,否则会出错
  6. 没有数字键名,也没有数字下标,因为浏览器会自动把数字转换成字符串

如何删除对象的属性

let obj = {
    name: 'long',
    age: '18',
    gender: 'man'
}
obj.name = undefined //删除name属性里的值
delete obj.name // 删除属性

上述代码要区分属性值为 undefined 和 不含属性名

不含属性名,可以用下面代码验证对象是否含有此属性

'name’ in obj === false

含有属性名,但是值为 undefined 可以用下面代码验证含有属性且属性的值为 undefined

'name' in obj && obj.name === undefined

obj.name === undefined 不能判断 name 是否为 obj 的属性,所以要做一个 && 运算 复制代码注意:把属性设置为 undefined 不是删除此属性,只是改变了属性的值,这个要和 delete 区分开

如何查看对象的属性

  • 查看自身所有属性
let obj = {
    name: 'long',
    age: 18
}
Object.keys(obj) // 查看所有属性
Object.values(obj) // 查看所有属性的值
Object.entries(obj) // 查看所有属性和值
  • 查看自身和共有属性
console.dir(obj)
Object.keys(obj.__proto__) // 不推荐用这种方法

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

obj.hasOwnProperty('toString')

如果返回值为 false,那么这个属性就不是自身的属性 反之,返回 true 的话这个属性就是自身的属性

  • 查看单个属性

中括号语法

obj['key']

点语法

obj.key

上两种方法的变体

let key = ‘xxx’

注意obj[key] // key 为变量
新手建议使用第一种方法,明确且不会入坑 总结一句话,所有 "proto" 代码都是强烈不推荐写的

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

  • 直接赋值
let obj = {
    'name': 'frank'
}
obj.name = 'long' // 修改属性
obj.age = 13 // 增加属性

其他方式

obj.name'frank''
obj['name']='frank'
obj['na'+'me']='frank'
let key='name',obj[key]='frank'//此时的[key]为变量,用以用时需要先声明值

如果对象有此属性就为修改,没有此属性就为增加

这是一个一个赋值,有时候可能会很麻烦,新版的 ES6 就提供了一个 API 用于添加多个属性

  • 批量赋值
let obj = {}
Object.assign( obj, {'name':long', 'age': '18'})
  • 修改隐藏属性(原型)

使用 proto 修改

var common = { '国籍':'中国',hairColor:'black'}
var person = {'name': 'long'}
person.__proto__ = common // 把原型的地址改成 common 的地址

使用 ES6 新的 API 来修改原型

var common = { '国籍':'中国',hairColor:'black'}
var person = {'name': 'long'}
var person = Object.create(common)

推荐使用第二种 ES6 新 API,因为第一种会有性能问题

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

'name' in obj :判断的是对象的所有属性,包括对象实例及其原型的属性; 而hasOwnProperty则是判断对象实例的是否具有某个属性,不包含其原型的属性。 例如:

var obj={
   key:123
   };
   obj.hasOwnProperty('key');                             //true
   obj.hasOwnProperty('toString');                  //false
var obj={
   key:123
    };
    'key' in obj;                                           //true
    'toString' in obj;                                //true