2019-2021 美团技术年货 前端篇是可被业务代 码直接引入的,帮助我们快速开发出跨端应用; ● flutter_tools 是各平台(Android、iOS、Web)的编译入口,它接收 flutter build web 命令和参数并开始编译流程,同时等待处理结果回调,在回调中我 们可对编译产物进行二次加工; ● frontend_server 负责将 Dart 转换为 AST,生成 kernel 中间产物 app. rWeb 依赖的这些 SDK 中包含了一些使用频率较低的功能,例如:蓝牙、USB、WebRTC、陀螺仪等 功能的支持。为此,我们提供了对这些长尾功能的定制能力(这些功能默认不开启, 但业务可配置),将未被启用长尾的功能进行裁剪。 通过上述分析可得,我们的思路就是对 Dead Code 进行二次剔除,以及对这些长 尾功能做裁剪。基于这样的思路,我们深入 Dart-SDK、Framework DOMContentLoaded 之后,对网络资源、事件、DOM 变动 进行监听,并对监听结果根据特定规则进行分析加权,得到一个首屏加载完成 的状态标识; ● 运行阶段,在首屏加载完成之后对配置平台下发的云端 JSON 文件进行解 析,对符合配置规则的资源进行 HTTP XHR 预加载,从而实现文件的预缓存 功能。 下图为预缓存的整体方案设计: 48 > 2021年美团技术年货 图 15 预缓存方案设计 编译阶段0 码力 | 738 页 | 50.29 MB | 1 年前3
阮一峰 《ECMAScript 6入门》 第三版}); 上面的原始代码用了箭头函数,Babel 将其转为普通函数,就能在不支持箭头函数 的 JavaScript 环境执行了。 配置文件 .babelrc Babel 的配置文件是 .babelrc ,存放在项目的根目录下。使用 Babel 的第一步, 就是配置这个文件。 该文件用来设置转码规则和插件,基本格式如下。 { "presets": [], "plugins": 或 -o 参数指定输出文件 $ babel example.js --out-file compiled.js # 或者 $ babel example.js -o compiled.js # 整个目录转码 # --out-dir 或 -d 参数指定输出目录 $ babel src --out-dir lib # 或者 $ babel src -d lib # -s 参数生成source map, ast } // Babel AST转码 babel.transformFromAst(ast, code, options); // => { code, map, ast } 配置对象 options ,可以参看官方文档http://babeljs.io/docs/usage/options/。 下面是一个例子。 var es6Code = 'let x = n => n0 码力 | 679 页 | 2.66 MB | 1 年前3
阮一峰 JavaScript 教程console.log('i 当前为:' + i); 7. } 上面代码只有在 i 为奇数时,才会输出 i 的值。如果 i 为偶数, 则直接进入下一轮循环。 如果存在多重循环,不带参数的 break 语句和 continue 语句都只针对 最内层循环。 JavaScript 语言允许,语句的前面有标签(label),相当于定位 符,用于跳转到程序的任意位置,标签的格式如下。 null 和 undefined ,大致可以像下面这样理解。 null 表示空值,即该处的值现在为空。调用函数时,某个参数未设置 任何值,这时就可以传入 null ,表示该参数为空。比如,某个函数接 受引擎抛出的错误作为参数,如果运行过程中未出错,那么这个参数就 会传入 null ,表示未发生错误。 undefined 表示“未定义”,下面是返回 undefined 的典型场景。 的典型场景。 1. // 变量声明了,但没有赋值 2. var i; 3. i // undefined 4. 5. // 调用函数时,应该提供的参数没有提供,该参数等于 undefined 6. function f(x) { 7. return x; 8. } 9. f() // undefined 10. 11. // 对象没有赋值的属性 12. var o = new0 码力 | 540 页 | 3.32 MB | 10 月前3
Hello 算法 1.1.0 JavaScript版是找一台计算机,运行这两个算法,并监控记录它们的运行时间和内存占用情况。这种评估方式能够反映真 实情况,但也存在较大的局限性。 一方面,难以排除测试环境的干扰因素。硬件配置会影响算法的性能。比如在某台计算机中,算法 A 的运行 时间比算法 B 短;但在另一台配置不同的计算机中,可能得到相反的测试结果。这意味着我们需要在各种机 器上进行测试,统计平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费资源。 1. 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归: // === File: recursion.js === /* 尾递归 */ function tailRecur(n, res) { // 终止条件 if (n ===0 码力 | 379 页 | 18.46 MB | 1 年前3
Hello 算法 1.0.0 JavaScript版是找一台计算机,运行这两个算法,并监控记录它们的运行时间和内存占用情况。这种评估方式能够反映真 实情况,但也存在较大的局限性。 一方面,难以排除测试环境的干扰因素。硬件配置会影响算法的性能。比如在某台计算机中,算法 A 的运行 时间比算法 B 短;但在另一台配置不同的计算机中,可能得到相反的测试结果。这意味着我们需要在各种机 器上进行测试,统计平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费资源。 1. 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归: // === File: recursion.js === /* 尾递归 */ function tailRecur(n, res) { // 终止条件 if (n ===0 码力 | 376 页 | 17.57 MB | 1 年前3
Hello 算法 1.0.0b5 JavaScript版是找一台计算机,运行这两个算法,并监控记录它们的运行时间和内存占用情况。这种评估方式能够反映真 实情况,但也存在较大局限性。 一方面,难以排除测试环境的干扰因素。硬件配置会影响算法的性能表现。比如在某台计算机中,算法 A 的 运行时间比算法 B 短;但在另一台配置不同的计算机中,我们可能得到相反的测试结果。这意味着我们需要 在各种机器上进行测试,统计平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费 1. 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无需继续执行其他 操作,因此系统无需保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归。 // === File: recursion.js === /* 尾递归 */ function tailRecur(n, res) { // 终止条件 if (n ===0 码力 | 375 页 | 30.68 MB | 1 年前3
Hello 算法 1.2.0 简体中文 JavaScript 版法的效率。最直接的方法 是找一台计算机,运行这两个算法,并监控记录它们的运行时间和内存占用情况。这种评估方式能够反映真 实情况,但也存在较大的局限性。 一方面,难以排除测试环境的干扰因素。硬件配置会影响算法的性能表现。比如一个算法的并行度较高,那 么它就更适合在多核 CPU 上运行,一个算法的内存操作密集,那么它在高性能内存上的表现就会更好。也 就是说,算法在不同的机器上的测试结果可能是 1. 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归: // === File: recursion.js === /* 尾递归 */ function tailRecur(n, res) { // 终止条件 if (n ===0 码力 | 379 页 | 18.47 MB | 10 月前3
Hello 算法 1.0.0b1 JavaScript版的最直接的方式,就是找一台计算机,把两个算法都完整跑一遍,并监控记录运行时间和内存占用情况。这种 评估方式能够反映真实情况,但是也存在很大的硬伤。 难以排除测试环境的干扰因素。硬件配置会影响到算法的性能表现。例如,在某台计算机中,算法 A 比算法 B 运行时间更短;但换到另一台配置不同的计算机中,可能会得到相反的测试结果。这意味着我们需要在各种机 器上展开测试,而这是不现实的。 展开完整测试非常耗费资源。随着输入数据量的大小 2. 时间复杂度 2.2.1. 统计算法运行时间 运行时间能够直观且准确地体现出算法的效率水平。如果我们想要 准确预估一段代码的运行时间,该如何做 呢? 1. 首先需要 确定运行平台,包括硬件配置、编程语言、系统环境等,这些都会影响到代码的运行效率。 2. 评估 各种计算操作的所需运行时间,例如加法操作 + 需要 1 ns ,乘法操作 * 需要 10 ns ,打印操作需要 5 ns 等。 // 在邻接矩阵中删除索引 index 的列 for (const row of this.adjMat) { row.splice(index, 1); } } /* 添加边 */ // 参数 i, j 对应 vertices 元素索引 addEdge(i, j) { // 索引越界与相等处理 if (i < 0 || j < 0 || i >= this.size() || j >=0 码力 | 185 页 | 14.70 MB | 1 年前3
廖雪峰JavaScript教程null 表示一个空的值,而 undefined 表示值未定义。事实证明,这 并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用 null 。 undefined 仅仅在 判断函数参数是否传递的情况下有用。 数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型。 例如: 1. [1, 2, 3.14, 'Hello', null, 'B', 'C'] 3. arr.slice(3); // 从索引3开始到结束: ['D', 'E', 'F', 'G'] 注意到 slice() 的起止参数包括开始索引,不包括结束索引。 如果不给 slice() 传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复 制一个 Array : 1. var arr = ['A', 'B', 'C', 'D', 'E' Array 类似,但 Set 没有索引,因此回调函数的前两个参数都是元素本身: 1. var s = new Set(['A', 'B', 'C']); 2. s.forEach(function (element, sameElement, set) { 3. alert(element); 4. }); Map 的回调函数参数依次为 value 、 key 和 map 本身:0 码力 | 264 页 | 2.81 MB | 10 月前3
ECMAScript规范 第三版 中文版........................................................................................57 10.1.8 参数对象................................................................................................. 15 Boolean 对象 Boolean 对象是 Object 类型的一个成员,内置 Boolean 对象的实例。也就是说,在 new 表 达式中使用 Boolean 构造函数提供一个布尔值参数创建出 Boolean 对象。结果对象拥有一个隐 含(无命名的)属性是那个布尔值。一个 Boolean 对象可被强制为一个布尔值。 4.3.16 字符串值 字符串值是 String 类型的一 4.3.18 String 对象 String 对象是 Object 类 型的一个成员,内置 String 对象的实例。也就是说,在 new 表达式 中使用 String 构造函数提供一个字符串参数创建出 String 对象。结果对象拥有一个隐含(无命 名的)属性是那个字符串值。通过以函数的方式调用 String 构造函数可以把一个 String 对象强 制为一个字符串值。 4.3.190 码力 | 58 页 | 563.06 KB | 1 年前3
共 19 条
- 1
- 2













