ES6 系列之模块加载方案

2018-11-13
阅读 11 分钟
3.4k
前言 本篇我们重点介绍以下四种模块加载规范: AMD CMD CommonJS ES6 模块 最后再延伸讲下 Babel 的编译和 webpack 的打包原理。 require.js 在了解 AMD 规范之前,我们先来看看 require.js 的使用方式。 项目目录为: {代码...} index.html 的内容如下: {代码...} data-main="vender/main" 表示主模块是 vender 下的 m...

ES6 系列之 defineProperty 与 proxy

2018-11-09
阅读 7 分钟
6k
我们或多或少都听过“数据绑定”这个词,“数据绑定”的关键在于监听数据的变化,可是对于这样一个对象:var obj = {value: 1},我们该怎么知道 obj 发生了改变呢?

ES6 系列之 Babel 是如何编译 Class 的(下)

2018-11-07
阅读 7 分钟
2.5k
前言 在上一篇 《 ES6 系列 Babel 是如何编译 Class 的(上)》,我们知道了 Babel 是如何编译 Class 的,这篇我们学习 Babel 是如何用 ES5 实现 Class 的继承。 ES5 寄生组合式继承 {代码...} 原型链示意图为: 关于寄生组合式继承我们在 《JavaScript深入之继承的多种方式和优缺点》 中介绍过。 引用《JavaScript高级程...

ES6 系列之 Babel 是如何编译 Class 的(上)

2018-11-05
阅读 6 分钟
5.1k
在了解 Babel 是如何编译 class 前,我们先看看 ES6 的 class 和 ES5 的构造函数是如何对应的。毕竟,ES6 的 class 可以看作一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

ES6 系列之 Babel 将 Async 编译成了什么样子

2018-10-31
阅读 8 分钟
4.1k
前言 本文就是简单介绍下 Async 语法编译后的代码。 Async {代码...} Babel 我们直接在 Babel 官网的 Try it out 粘贴上述代码,然后查看代码编译成什么样子: {代码...} _asyncToGenerator regeneratorRuntime 相关的代码我们在 《ES6 系列之 Babel 将 Generator 编译成了什么样子》 中已经介绍过了,这次我们重点来看...

ES6 系列之 Babel 将 Generator 编译成了什么样子

2018-10-30
阅读 9 分钟
3.1k
猛一看,好像编译后的代码还蛮少的,但是细细一看,编译后的代码肯定是不能用的呀,regeneratorRuntime 是个什么鬼?哪里有声明呀?mark 和 wrap 方法又都做了什么?

ES6 系列之异步处理实战

2018-10-25
阅读 5 分钟
2.9k
前言 我们以查找指定目录下的最大文件为例,感受从 回调函数 -> Promise -> Generator -> Async 异步处理方式的改变。 API 介绍 为了实现这个功能,我们需要用到几个 Nodejs 的 API,所以我们来简单介绍一下。 fs.readdir readdir 方法用于读取目录,返回一个包含文件和目录的数组。 fs.stat stat 方法的参数是...

ES6 系列之我们来聊聊 Async

2018-10-23
阅读 8 分钟
7.4k
async ES2017 标准引入了 async 函数,使得异步操作变得更加方便。 在异步处理上,async 函数就是 Generator 函数的语法糖。 举个例子: {代码...} 当你使用 async 时: {代码...} 其实 async 函数的实现原理,就是将 Generator 函数和自动执行器,包装在一个函数里。 {代码...} spawn 函数指的是自动执行器,就比如说 c...

ES6 系列之 Generator 的自动执行

2018-10-18
阅读 8 分钟
2.3k
单个异步任务 {代码...} 为了获得最终的执行结果,你需要这样做: {代码...} 首先执行 Generator 函数,获取遍历器对象。 然后使用 next 方法,执行异步任务的第一阶段,即 fetch(url)。 注意,由于 fetch(url) 会返回一个 Promise 对象,所以 result 的值为: {代码...} 最后我们为这个 Promise 对象添加一个 then 方法...

ES6 系列之我们来聊聊 Promise

2018-10-16
阅读 10 分钟
9.1k
前言 Promise 的基本使用可以看阮一峰老师的 《ECMAScript 6 入门》。 我们来聊点其他的。 回调 说起 Promise,我们一般都会从回调或者回调地狱说起,那么使用回调到底会导致哪些不好的地方呢? 1. 回调嵌套 使用回调,我们很有可能会将业务代码写成如下这种形式: {代码...} 当然这是一种简化的形式,经过一番简单的思...

ES6 系列之 WeakMap

2018-07-26
阅读 4 分钟
22.7k
前言 我们先从 WeakMap 的特性说起,然后聊聊 WeakMap 的一些应用场景。 特性 1. WeakMap 只接受对象作为键名 {代码...} 2. WeakMap 的键名所引用的对象是弱引用 这句话其实让我非常费解,我个人觉得这句话真正想表达的意思应该是: WeakMaps hold "weak" references to key objects, 翻译过来应该是 WeakMaps 保持了对...

ES6 系列之模拟实现一个 Set 数据结构

2018-07-18
阅读 9 分钟
8.3k
基本介绍 ES6 提供了新的数据结构 Set。 它类似于数组,但是成员的值都是唯一的,没有重复的值。 初始化 Set 本身是一个构造函数,用来生成 Set 数据结构。 {代码...} Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。 {代码...} 属性和方法 操作方法有: add(value):添加某个...

ES6 系列之迭代器与 for of

2018-07-10
阅读 8 分钟
6.4k
看着很简单,但是再回顾这段代码,实际上我们仅仅是需要数组中元素的值,但是却需要提前获取数组长度,声明索引变量等,尤其当多个循环嵌套的时候,更需要使用多个索引变量,代码的复杂度就会大大增加,比如我们使用双重循环进行去重:

ES6 系列之模拟实现 Symbol 类型

2018-06-12
阅读 10 分钟
10k
实际上,Symbol 的很多特性都无法模拟实现……所以先让我们回顾下有哪些特性,然后挑点能实现的……当然在看的过程中,你也可以思考这个特性是否能实现,如果可以实现,该如何实现。

ES6 系列之箭头函数

2018-06-04
阅读 5 分钟
12.1k
回顾 我们先来回顾下箭头函数的基本语法。 ES6 增加了箭头函数: {代码...} 相当于: {代码...} 如果需要给函数传入多个参数: {代码...} 如果函数的代码块需要多条语句: {代码...} 如果需要直接返回一个对象: {代码...} 与变量解构结合: {代码...} 很多时候,你可能想不到要这样用,所以再来举个例子,比如在 React ...

ES6 系列之模板字符串

2018-05-30
阅读 7 分钟
6k
基础用法 {代码...} 如果你碰巧要在字符串中使用反撇号,你可以使用反斜杠转义: {代码...} 值得一提的是,在模板字符串中,空格、缩进、换行都会被保留: {代码...} 注意,打印的结果中第一行是一个换行,你可以使用 trim 函数消除换行: {代码...} 嵌入变量 模板字符串支持嵌入变量,只需要将变量名写在 ${} 之中,其...

ES6 系列之 let 和 const

2018-05-21
阅读 5 分钟
6.2k
初学者可能会觉得只有 condition 为 true 的时候,才会创建 value,如果 condition 为 false,结果应该是报错,然而因为变量提升的原因,代码相当于:

underscore 的源码该如何阅读?

2018-04-03
阅读 2 分钟
3.2k
这个系列算是 JavaScript 专题系列的番外篇,总共写了 8 篇,重点介绍了 underscore 中的代码组织、链式调用、内部函数、模板引擎、工具函数等内容,旨在帮助大家阅读源码,以及写出自己的 undercore。

underscore 系列之字符实体与 _.escape

2018-03-29
阅读 7 分钟
4.6k
underscore 提供了 _.escape 函数,用于转义 HTML 字符串,替换 &, <, >, ", ', 和 ` 字符为字符实体。

underscore 系列之实现一个模板引擎(下)

2018-01-25
阅读 10 分钟
3.6k
我们的本意是想打印带 "" 包裹的 Vikings 字符串,但是在 JavaScript 中,字符串使用单引号或者双引号来表示起始或者结束,这段代码会报 Unexpected identifier 错误。

underscore 系列之实现一个模板引擎(上)

2017-12-20
阅读 7 分钟
4.3k
前言 underscore 提供了模板引擎的功能,举个例子: {代码...} 感觉好像没有什么强大的地方,再来举个例子: 在 HTML 文件中: {代码...} JavaScript 文件中: {代码...} 效果为: 那么该如何实现这样一个 _.template 函数呢? 实现思路 underscore 的 template 函数参考了 jQuery 的作者 John Resig 在 2008 年发表的一...

underscore 系列之防冲突与 Utility Functions

2017-12-14
阅读 4 分钟
4.1k
所以 underscore 提供了 noConflict 功能,可以放弃 underscore 的控制变量 _,返回 underscore 对象的引用。

underscore 系列之内部函数 restArgs

2017-12-06
阅读 4 分钟
3.1k
partial 在《 JavaScript 专题之偏函数》中,我们写了一个 partial 函数,用来固定函数的部分参数,实现代码如下: {代码...} rest parameter ES6 为我们提供了剩余参数(rest parameter)语法,允许我们将一个不定数量的参数表示为一个数组。 {代码...} 我们可以利用这一特性简化 partial 实现的代码: {代码...} 写个 ...

underscore 系列之内部函数 cb 和 optimizeCb

2017-11-29
阅读 7 分钟
5.3k
map 方法除了传入要处理的数组之外,还有两个参数 iteratee 和 context,类似于 Array.prototype.map 中的其他两个参数,其中 iteratee 表示处理函数,context 表示指定的执行上下文,即 this 的值。

underscore 系列之链式调用

2017-11-22
阅读 7 分钟
4.3k
前言 本文接着上篇《underscore 系列之如何写自己的 underscore》,阅读本篇前,希望你已经阅读了上一篇。 jQuery 我们都知道 jQuery 可以链式调用,比如: {代码...} 我们写个简单的 demo 模拟链式调用: {代码...} jQuery 之所以能实现链式调用,关键就在于通过 return this,返回调用对象。再精简下 demo 就是: {代...

underscore 系列之如何写自己的 underscore

2017-11-15
阅读 9 分钟
5k
在 《JavaScript 专题系列》 中,我们写了很多的功能函数,比如防抖、节流、去重、类型判断、扁平数组、深浅拷贝、查找数组元素、通用遍历、柯里化、函数组合、函数记忆、乱序等,可以我们该如何组织这些函数,形成自己的一个工具函数库呢?这个时候,我们就要借鉴 underscore 是怎么做的了。

JavaScript专题系列20篇正式完结!

2017-10-25
阅读 3 分钟
9.6k
JavaScript 专题系列共计 20 篇,主要研究日常开发中一些功能点的实现,比如防抖、节流、去重、类型判断、拷贝、最值、扁平、柯里、递归、乱序、排序等,特点是研(chao)究(xi) underscore 和 jQuery 的实现方式。

JavaScript专题之解读 v8 排序源码

2017-10-19
阅读 11 分钟
8.6k
排序采用的算法跟数组的长度有关,当数组长度小于等于 10 时,采用插入排序,大于 10 的时候,采用快速排序。(当然了,这种说法并不严谨)。

JavaScript专题之乱序

2017-10-12
阅读 4 分钟
4.7k
JavaScript 专题系列第十九篇,讲解数组乱序,重点探究 Math.random() 为什么不能真正的乱序? 乱序 乱序的意思就是将数组打乱。 嗯,没有了,直接看代码吧。 Math.random 一个经常会遇见的写法是使用 Math.random(): {代码...} Math.random() - 0.5 随机得到一个正数、负数或是 0,如果是正数则降序排列,如果是负数则...

JavaScript专题之递归

2017-09-13
阅读 5 分钟
6.7k
JavaScript 专题系列第十八篇,讲解递归和尾递归 定义 程序调用自身的编程技巧称为递归(recursion)。 阶乘 以阶乘为例: {代码...} 示意图(图片来自 wwww.penjee.com): 斐波那契数列 在《JavaScript专题之函数记忆》中讲到过的斐波那契数列也使用了递归: {代码...} 递归条件 从这两个例子中,我们可以看出: 构成递归...