Appearance
Meeting Objects and Functions
在前面的模块中,我们已经了解了原始值:Undefined、Null、Booleans、Numbers、BigInts、Strings 和 Symbols 。现在我们将介绍非原始值—这些类型可以让我们创建自己的值。
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 = {};
我们创造的对象会消失么?
会的,当我们将指向对象的变量(线)指向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中的每种值类型。让我们回顾一下我们遇到的每种类型的值,从不同的原始类型开始
- Undefined
- Null
- Booleans
- Numbers
- BigInts
- Strings
- Symbols
然后这里还有两个特殊的类型,可以自己创造值的类型
Objects
Functions
原始值(字符串、数字等等)一直存在于我们的宇宙中。例如,写2或“hello”总是“召唤”相同的数字或字符串值。
对象和函数的行为不同,并允许我们生成自己的值。编写{}或function(){}总是会创建一个全新的、不同的值。这个想法对于理解是至关重要的