一、js基础知识
-
标签script
-
外部脚本
<script scr=""><script> -
语句 :执行行为(action)的语法结构和命令。 格式:alert('---') ;
-
"use strict":保证旧的功能能够使用,大部分的修改是默认不生效的,需要一个特殊的指令 —— "use strict" 来明确地激活。(只能放在脚本文件最顶部,只有注释可以出现在其上面)
-
变量:数据的“命名存储”,来保存商品、访客和其他信息。(格式:let ---="")旧版是var
- 常量 const ---=""(也可以使变量无法修改)
- 数据类型:
七种原始数据类型(基本数据类型):
-
number 用于任何类型的数字:整数或浮点数,在** ±(253-1) 范围内的整数。数字可以有很多操作,比如,乘法 * 、除法 / 、加法 + 、减法 - 等等。除了常规的数字,还包括所谓的“特殊数值”(“ special numeric values ”)”也属于这种类型: Infinity 、 -Infinity 和 NaN 。
-
bigint 用于任意长度的整数。
-
string 用于字符串:一个字符串可以包含 0 个或多个字符,所以没有单独的单字符类型。 1.双引号: "Hello",2.单引号: 'Hello', 3.反引号:``。
-
boolean 用于 true 和 false 。
-
null 用于未知的值 —— 只有一个 null 值的独立类型。(例: let age = null;)
-
undefined 用于未定义的值 —— 只有一个 undefined 值的独立类型。(1. let age; 2.alert(age); // 弹出"undefined")
-
symbol 用于唯一的标识符。 一种非原始数据类型(复杂数据类型):
-
object 用于更复杂的数据结构。
-
- 类型转换..?没看懂
- 数学运算:加法 +, 减法 -,乘法 *, 除法 /,取余 %(a % b 的结果是 a 整除 b的余数, 求幂 **(求幂运算 a ** b 将 a 提升至 a 的 b 次幂).
- 布尔转换??
- 条件分支:以使用 if 语句和条件运算符 ?(也称为“问号”运算符)来实现
- 空值合并运算符 ‘??’(例a ?? b 的结果是:如果 a 是已定义的,则结果为 a,如果 a 不是已定义的,则结果为 b)“|| ”返回第一个真值,“??” 返回第一个 已定义的值。
- 循环:1.while (condition) { } 2.do {// 循环体} while (condition); 循环首先执行循环体,然后检查条件,当条件为真时,重复执行循环体。3.for (begin; condition; step) {// ……循环体……}(如果 condition 成立 → 运行 body 然后运行 step) 4.无限循环while(true) 可以通过 break 指令来终止,如果不想在当前迭代中做任何事,并且想要转移至下一次迭代,可以使用 continue 指令。
- “switch”语句??
- 函数??
二、代码质量
1.JavaScript 库进行测试:
- Mocha —— 核心框架:提供了包括通用型测试的主数 describe 和 it,以及用于运行测试的主函数。
- Chai —— 提供很多断言(assertion)支持的库。它提供了很多不同的断言,现在我们只需要用 assert.equal。
- Sinon —— 用于监视函数、模拟内建函数和其他函数的库。
2.行为驱动开发BDD:
(1)作为测试 —— 保证代码正确工作。
(2)作为文档 —— describe 和 it 的标题告诉我们函数做了什么。
(3)作为案例 —— 测试实际工作的例子展示了一个函数可以被怎样使用。
3.格式:
describe("title", function() { ... })
表示我们正在描述的功能是什么。在我们的例子中我们正在描述函数 pow。用于组织“工人(workers)” —— it 代码块。
it("use case description", function() { ... })
it 里面的描述部分,我们以一种易于理解的方式描述特定的用例,第二个参数是用于对其进行测试的函数。
assert.equal(value1, value2)
it 块中的代码,如果实现是正确的,它应该在执行的时候不产生任何错误。
assert.* 函数用于检查 pow 函数是否按照预期工作。
4.转译器(Transpilers):是一种可以将源码转译成另一种源码的特殊的软件。它可以解析(“阅读和理解”)现代代码,并使用旧的语法结构对其进行重写,进而使其也可以在旧的引擎中工作。
5.垫片(Polyfills):更新/添加新函数的脚本。
三、Object
1.文本和属性:创建对象的时候,立即将一些属性以键值对的形式放到 {...}
2.计算属性:创建一个对象时,我们可以在对象字面量中使用方括号。(例:[fruit] 含义是属性名应该从 fruit 变量中获取。)
3.属性命名没有限制。属性名可以是任何字符串或者 symbol,其他类型会被自动地转换为字符串。
4.对象是具有一些特殊特性的关联数组。
它们存储属性(键值对),其中:
- 属性的键必须是字符串或者 symbol(通常是字符串)。
- 值可以是任何类型。
我们可以用下面的方法访问属性:
- 点符号: obj.property。
- 方括号 obj["property"],方括号允许从变量中获取键,例如 obj[varWithKey]。
其他操作:
- 删除属性:delete obj.prop。
- 检查是否存在给定键的属性:"key" in obj。
- 遍历对象:for(let key in obj) 循环。
5.“this”:this 的值就是在点之前的这个对象,即调用该方法的对象。(this不受限制 : 在 JavaScript 中,this 关键字与其他大多数编程语言中的不同。JavaScript 中的 this 可以用于任何函数,即使它不是对象的方法。)
6.可选链(?.):?. 检查左边部分是否为 null/undefined,如果不是则继续运算。换句话说,例如 value?.prop:
- 如果 value 存在,则结果与 value.prop 相同,
- 否则(当 value 为 undefined/null 时)则返回 undefined。
7.symbol:唯一标识符的基本类型;是使用带有可选描述(name)的 Symbol() 调用创建的:总是不同的值,即使它们有相同的名字。
两个主要的使用场景:
(1)“隐藏” 对象属性。
如果我们想要向“属于”另一个脚本或者库的对象添加一个属性,我们可以创建一个 symbol 并使用它作为属性的键。symbol 属性不会出现在 for..in 中,因此它不会意外地被与其他属性一起处理。并且,它不会被直接访问,因为另一个脚本没有我们的 symbol。因此,该属性将受到保护,防止被意外使用或重写。
(2)JavaScript 使用了许多系统 symbol,这些 symbol 可以作为 Symbol.* 访问。我们可以使用它们来改变一些内建行为。
8.原始值转换?