1. JavaScript 基础

  2. 深入数据和类型

  3. 函数进阶

  4. 运算符

  5. 浏览器存储

  6. Document

  7. Web API

  8. 事件

  9. 工具与规范

  10. 实例

  11. 练习

对象

对象是 JavaScript 中功能最多,也是最复杂的一种类型。不用怕,这个章节只是简单地入门一下。

对象是一个储存着多个键值对的类型,键是一个对象内唯一的字符串,而值可以是任意类型任意值,键与值一一对应,通过键可以找到对应的值。

比如下面的例子定义了包含人相关信息的对象,包含了姓名和身份证两个键值对。

let person = {
    name: "小明", // 姓名
    "identity card": 123456789123, // 身份证件
}

在以下的例子中定义了一个有着属性与方法(一般将属性值为函数的属性称之为方法)的对象。

$$edit$$
$$jsdemo$$
let mingren = {
    name: "鸣人",
    height: 1.8,
    eat: function () {
        alert("吃拉面。")
    },
    fight: function () {
        alert("螺旋丸。")
    },
}
alert(mingren.name)
mingren.fight()

$$tip

在其他语言中也有类似对象的类型,被称为字典(dict)。

$$

定义对象

定义一个对象的语法如下:

let object = {
    key: value,
    key2: value2,
}

由冒号分割的键值对被放在大括号当中,每一个键值对之间用逗号分隔。

  • key:键(属性名),键为字符串类型(如果属性符合变量命名规范或是可默认转换为字符串的数据值,则可省略引号),键名不能重复。
  • value:值(属性值),属性值可以为任意类型。

以下是一个小例子:

let person = {
    name: "鸣人",
    height: 1.8,
}
  • 定义了 person 对象。
  • person 对象中有 nameheight 键,分别对应 "鸣人"1.8

以下这个例子中,使用对象来组织数据明显比使用多个变量来得清晰明了。

$$edit$$
// 多个变量组织数据
let mingrenName = "鸣人"
let mingrenHeight = 1.8
let mingrenFight = function () {
    alert("螺旋丸")
}

let lufeiName = "路飞"
let lufeiHeight = 1.75
let lufeiFight = function () {
    alert("橡胶子弹")
}

// 使用对象组织数据

let mingren = {
    name: "鸣人",
    height: 1.8,
    fight: function () {
        alert("螺旋丸")
    },
}

let lufei = {
    name: "路飞",
    height: 1.75,
    fight: function () {
        alert("橡胶子弹")
    },
}

属性简写

在定义一个对象时,如果用已存的变量作为属性值,并且属性名与变量名相同的情况下则可以省略属性值。

$$jsdemo$$
$$edit$$
let name = "鸣人"
let person = {
    name, // 等同于 name: name
    height: 1.8,
}

alert(person.name)

获取与赋值

点操作符

只要在对象后接点操作符再接属性名即可获取属性值。

$$jsdemo$$
$$edit$$
let person = {
    name: "鸣人",
    height: 1.8,
}
alert(person.name)

同样的点操作符也可以修改属性值或赋新值。

$$jsdemo$$
$$edit$$
let person = {
    name: "鸣人",
    height: 1.8,
}
person.name = "路飞"
alert(person.name)
person.address = "木叶村"
alert(person.address)

方括号操作符

方括号操作符与点操作符类似,也可以取值与赋值。

$$jsdemo$$
$$edit$$
let person = {
    name: "鸣人",
    height: 1.8,
}
person["name"] = "路飞"
alert(person["name"])

点操作符与方括号操作符的区别在于:

  • 点操作符的属性名必须符合变量命名规范
  • 方括号操作符可以采用任何字符串属性名(非字符串类型会被默认转成字符串)或者变量。
$$jsdemo$$
$$edit$$
let person = {
    name: "鸣人",
    height: 1.8,
}
person[123] = 123
person["a b"] = 456

let str = "key"
person[str] = 789

alert(person["123"]) // 123
alert(person["a b"]) // 456
alert(person[str]) // 789

// person.123 = 123 // Unexpected number

获取所有的键

Object.keys() 方法可以数组的形式返回所有给定对象的键。

$$jsdemo$$
$$edit$$
let mingren = {
    name: "鸣人",
    height: 1.8,
    fight: function () {
        alert("螺旋丸")
    },
}
let keys = Object.keys(mingren)
console.log(keys) // ['name', 'height', 'fight']

获取所有的值

Object.values() 方法可以数组的形式返回所有给定对象的值。

$$jsdemo$$
$$edit$$
let mingren = {
    name: "鸣人",
    height: 1.8,
    fight: function () {
        alert("螺旋丸")
    },
}
let values = Object.values(mingren)
console.log(values) // ['鸣人', 1.8, ƒ]

获取所有的键值对

Object.entries() 方法可以数组的形式返回所有给定对象的键值对。

$$jsdemo$$
$$edit$$
let mingren = {
    name: "鸣人",
    height: 1.8,
    fight: function () {
        alert("螺旋丸")
    },
}
let entries = Object.entries(mingren)
console.log(entries) // [['name', '鸣人'], ['height', 1.8], ['fight', ƒ]]

for in 作用于对象

for in 作用于对象时,会循环对象的所有键。

$$jsdemo$$
$$edit$$
let mingren = {
    name: "鸣人",
    height: 1.8,
    fight: function () {
        alert("螺旋丸")
    },
}

for (let key in mingren) {
    alert(key)
    alert(mingren[key])
}

$$tip

与数组不同, for of 不能作用于对象。

$$

判断属性是否存在

in 操作符可以判断对象中是否存在对应的属性。

$$jsdemo$$
$$edit$$
let mingren = {
    name: "鸣人",
    height: 1.8,
    fight: function () {
        alert("螺旋丸")
    },
}

alert("name" in mingren) // true
alert("sex" in mingren) // false

删除属性

delete 操作符可以帮助我们删除对象中的属性。

$$jsdemo$$
$$edit$$
let person = {
    name: "鸣人",
    height: 1.8,
}
delete person.name
alert(person.name)

实例

对象最常用场景之一就是用来保存一些具有相同属性,同一类型的数据,并在之后批量处理。

$$jsdemo$$
$$edit$$
// 学生信息收集程序
let students = []
while (true) {
    let name = prompt("输入同学的姓名(空为退出)")
    if (!name) break
    let skill = prompt("输入同学的技能(空为退出)")
    if (!skill) break

    students.push({
        name,
        skill,
    })
}

alert(`共收集了${students.length}名同学的信息。`)
for (let item of students) {
    alert(`${item.name}同学的技能是${item.skill}。`)
}

console.log(students)

练习

  1. 写一个函数 highestFreq() ,接收一个数值数组作为参数,返回出现频率最高的值,比如:
let array = [4, 2, 3, 3, 2, 3, 1]

alert(highestFreq(array)) // 3

2.写一个函数 isEmpty(),接收一个对象作为参数,如果对象没有属性值时返回 true ,否则返回 false

let mingren = {}
alert(isEmpty(mingren)) // true
mingren.name = "鸣人"
alert(isEmpty(mingren)) // false

3.写一个函数 sum(),接收一个属性值全为数字的对象,并求出所有属性值的和。

let damages = {
    悟空: 800,
    贝吉塔: 660,
    农夫: 5,
}

alert(sum(damages)) // 1465