摘要:可迭代(Iterable) 对象是数组的泛化。这个概念是说任何对象都可以被定制为可在 for..of 循环中使用的对象。 数组是可迭代的。但不仅仅是数组。很多其他内建对象也都是可迭代的。例如字符串也是可迭代的。 如果从技术上讲,对象不是数组,而是表示某物的集合(列表,集合),for..of 是一个能
阅读全文
摘要:添加/移除数组元素 我们已经学了从数组的首端或尾端添加和删除元素的方法: arr.push(...items) —— 从尾端添加元素, arr.pop() —— 从尾端提取元素, arr.shift() —— 从首端提取元素, arr.unshift(...items) —— 从首端添加元素。 这里
阅读全文
摘要:对象允许存储键值集合,这很好。 但很多时候我们发现还需要 有序集合,里面的元素都是按顺序排列的。例如,我们可能需要存储一些列表,比如用户、商品以及 HTML 元素等。 这里使用对象就不是很方便了,因为对象不能提供能够管理元素顺序的方法。我们不能在已有的元素“之间”插入一个新的属性。这种场景下对象就不
阅读全文
摘要:在 JavaScript 中,文本数据被以字符串形式存储,单个字符没有单独的类型。 字符串的内部格式始终是 UTF-16,它不依赖于页面编码。 引号(Quotes) 让我们回忆一下引号的种类。 字符串可以包含在单引号、双引号或反引号中: let single = 'single-quoted'; l
阅读全文
摘要:在现代 JavaScript 中,数字(number)有两种类型: JavaScript 中的常规数字以 64 位的格式 IEEE-754 存储,也被称为“双精度浮点数”。这是我们大多数时候所使用的数字,我们将在本章中学习它们。 BigInt 用于表示任意长度的整数。有时会需要它们,因为正如我们在前
阅读全文
摘要:JavaScript 允许我们像使用对象一样使用原始类型(字符串,数字等)。JavaScript 还提供了这样的调用方法。我们很快就会学习它们,但是首先我们将了解它的工作原理,毕竟原始类型不是对象(在这里我们会分析地更加清楚)。 我们来看看原始类型和对象之间的关键区别。 一个原始值: 是原始类型中的
阅读全文
摘要:当对象相加 obj1 + obj2,相减 obj1 - obj2,或者使用 alert(obj) 打印时会发生什么? JavaScript 不允许自定义运算符对对象的处理方式。与其他一些编程语言(Ruby,C++)不同,我们无法实现特殊的对象处理方法来处理加法(或其他运算)。 在此类运算的情况下,对
阅读全文
摘要:根据规范,只有两种原始类型可以用作对象属性键: 字符串类型 symbol 类型 否则,如果使用另一种类型,例如数字,它会被自动转换为字符串。所以 obj[1] 与 obj["1"] 相同,而 obj[true] 与 obj["true"] 相同。 到目前为止,我们一直只使用字符串。 现在我们来看看
阅读全文
摘要:❗️ 最近新增的特性 这是一个最近添加到 JavaScript 的特性。 旧式浏览器可能需要 polyfills. 可选链 ?. 是一种访问嵌套对象属性的安全的方式。即使中间的属性不存在,也不会出现错误。 “不存在的属性”的问题 如果你才刚开始读此教程并学习 JavaScript,那可能还没接触到这
阅读全文
摘要:常规的 {...} 语法允许创建一个对象。但是我们经常需要创建很多类似的对象,例如多个用户或菜单项等。 这可以使用构造函数和 "new" 操作符来实现。 构造函数 构造函数在技术上是常规函数。不过有两个约定: 它们的命名以大写字母开头。 它们只能由 "new" 操作符来执行。 例如: functio
阅读全文
摘要:通常创建对象来表示真实世界中的实体,如用户和订单等: let user = { name: "John", age: 30 }; 并且,在现实世界中,用户可以进行 操作:从购物车中挑选某物、登录和注销等。 在 JavaScript 中,行为(action)由属性中的函数来表示。 方法示例 刚开始,我
阅读全文
摘要:垃圾回收 对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。 当我们不再需要某个东西时会发生什么?JavaScript 引擎如何发现它并清理它? 可达性(Reachability) JavaScript 中主要的内存管理概念是 可达
阅读全文
摘要:对象引用和复制 对象与原始类型的根本区别之一是,对象是“通过引用”存储和复制的,而原始类型:字符串、数字、布尔值等 —— 总是“作为一个整体”复制。 如果我们深入了解复制值时会发生什么,就很容易理解了。 让我们从原始类型开始,例如一个字符串。 这里我们将 message 复制到 phrase: le
阅读全文
摘要:对象 JavaScript 中有八种数据类型。有七种原始类型,因为它们的值只包含一种东西(字符串,数字或者其他)。 相反,对象则用来存储键值对和更复杂的实体。在 JavaScript 中,对象几乎渗透到了这门编程语言的方方面面。所以,在我们深入理解这门语言之前,必须先理解对象。 我们可以通过使用带有
阅读全文
摘要:简洁是智慧的灵魂 把代码尽可能写得短。展示出你是多么的聪明啊。 在编程中,多使用一些巧妙的编程语言特性。 例如,看一下这个三元运算符 '?': // 从一个著名的 JavaScript 库中截取的代码 i = i ? i < 0 ? Math.max(0, len + i) : i : 0; 很酷,
阅读全文
摘要:正如我们在 代码结构 一章所了解到的那样,注释可以是以 // 开始的单行注释,也可以是 /* ... */ 结构的多行注释。 我们通常通过注释来描述代码怎样工作和为什么这样工作。 乍一看,写注释可能很简单,但初学者在编程的时候,经常错误地使用注释。 糟糕的注释 新手倾向于使用注释来解释“代码中发生了
阅读全文
摘要:我们的代码必须尽可能的清晰和易读。 这实际上是一种编程艺术 —— 以一种正确并且人们易读的方式编码来完成一个复杂的任务。一个良好的代码风格大大有助于实现这一点。 语法 下面是一个备忘单,其中列出了一些建议的规则(详情请参阅下文): 现在,让我们详细讨论一下这些规则和它们的原因吧。 ❗️ 没有什么规则
阅读全文
摘要:在浏览器中调试 调试 是指在一个脚本中找出并修复错误的过程。所有的现代浏览器和大多数其他环境都支持调试工具 —— 开发者工具中的一个令调试更加容易的特殊用户界面。它也可以让我们一步步地跟踪代码以查看当前实际运行情况。 在这里我们将会使用 Chrome(谷歌浏览器),因为它拥有足够多的功能,其他大部分
阅读全文
摘要:JavaScript 特性 代码结构 语句用分号分隔: alert('Hello'); alert('World'); 通常,换行符也被视为分隔符,因此下面的例子也能正常运行: alert('Hello') alert('World') 这就是所谓的「自动分号插入」。但有时它不起作用,例如: ale
阅读全文
摘要:箭头函数,基础知识 创建函数还有另外一种非常简单的语法,并且这种方法通常比函数表达式更好。 它被称为“箭头函数”,因为它看起来像这样: let func = (arg1, arg2, ..., argN) => expression; 这里创建了一个函数 func,它接受参数 arg1..argN,
阅读全文