Skip to content
On this page

Meeting Objects and Functions

在前面的模块中,我们已经了解了原始值:Undefined、Null、Booleans、Numbers、BigInts、Strings 和 Symbols 。现在我们将介绍非原始值—这些类型可以让我们创建自己的值。

image-20220326184330896

Objects

数组、正则等等非原始值都属于对象类型

console.log(typeof({})); // "object"
console.log(typeof([])); // "object"
console.log(typeof(new Date())); // "object"
console.log(typeof(/\d+/)); // "object"
console.log(typeof(Math)); // "object"

与以前不同,对象不是原始值。这也意味着默认情况下,它们是可变的(我们可以更改它们)。我们可以用.[]

let rapper = { name: 'Malicious' };
rapper.name = 'Malice'; // Dot notation
rapper['name'] = 'No Malice'; // Bracket notation

创建我们自己的对象

在前面介绍的原始值,我们只能召唤它们,而不能自己创造它们,但是对象类型,是我们可以创造的

每次使用{}对象字面量时,都会创建一个全新的对象值

let shrek = {};
let donkey = {};

image-20220326184851319

我们创造的对象会消失么?

会的,当我们将指向对象的变量(线)指向null原始值的时候,我们创造的对象就没有变量指向,JavaScript的垃圾回收机制就在不经意间去回收掉它♻️

Functions

我们定义函数是为了以后可以调用它们并在其中运行代码。然而,要真正理解JavaScript中的函数,我们需要暂时忘记它们为什么有用。相反,我们将把函数看作另一种类型的值:数字、对象、函数。

让我们来看看下面的代码,用你现在的心智模型思考一下🤔,它们有什么区别么

for (let i = 0; i < 7; i++) {
  console.log(2);
}

传递给log函数的永远只有一个value值就是2

for (let i = 0; i < 7; i++) {
  console.log({});
}

这里会创建7个不同的对象类型的值

for (let i = 0; i < 7; i++) {
  console.log(function() {});
}

这里同样也会创建7个不同对象类型的值,因为函数也是对象

从技术上讲,函数是JavaScript中的对象。我们将继续将它们作为一个独立的基本类型,因为与常规对象相比,它们具有独特的功能。但一般来说,如果你能对一个对象做些什么,你也能对一个函数做些什么。它们很特别

函数调用

let countDwarves = function() { return 7; };
let dwarves = countDwarves(); // () is a function call
console.log(dwarves);

添加()会改变代码的含义:

  • let dwarves = countDwarves表示“将dwarves指向countDwarves当前指向的值。”
  • let dwarves = countDwarves()表示“将 dwarves指向countDwarves当前指向的函数返回的值。”

事实上,countDwarves()也是一个表达式。它被称为调用表达式。要“回答”一个调用表达式,JavaScript在函数内部运行代码,并将返回值作为结果交给我们(在本例中是7)。

回顾

在前两个模块中,我们已经了解了JavaScript中的每种值类型。让我们回顾一下我们遇到的每种类型的值,从不同的原始类型开始

image-20220326190008951

  • Undefined
  • Null
  • Booleans
  • Numbers
  • BigInts
  • Strings
  • Symbols

然后这里还有两个特殊的类型,可以自己创造值的类型

image-20220326190115441

  • Objects

  • Functions

  • 原始值(字符串、数字等等)一直存在于我们的宇宙中。例如,写2或“hello”总是“召唤”相同的数字或字符串值。

  • 对象和函数的行为不同,并允许我们生成自己的值。编写{}或function(){}总是会创建一个全新的、不同的值。这个想法对于理解是至关重要的

Released under the MIT License.