简介
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
JavaScript 中的对象也是以 Key-Value 的形式访问,那么 JavaScript 的对象是否以 Hash 的结构存储呢?
我们首先来看一下 Hash 表结构。
more >>哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
JavaScript 中的对象也是以 Key-Value 的形式访问,那么 JavaScript 的对象是否以 Hash 的结构存储呢?
我们首先来看一下 Hash 表结构。
more >>Spark RDD 支持2种类型的操作: transformations 和 actions。transformations: 从已经存在的数据集中创建一个新的数据集,如 map。actions: 数据集上进行计算之后返回一个值,如 reduce。
在 Spark 中,所有的 transformations 都是 lazy 的,它们不会马上计算它们的结果,而是仅仅记录转换操作是应用到哪些基础数据集上的,只有当 actions 要返回结果的时候计算才会发生。
more >>目前前端开发中比较流行的两个框架: Angular 和 Vue 都采用了数据双向绑定的技术。
Angular1 中数据双向绑定是通过「脏检测」的方式实现,每当数据发生变更,对所有的数据和视图的绑定关系进行一次检测,识别是否有数据发生了变化以及这个变化是否会影响其它数据的变化,然后将变更的数据发送到视图,更新页面展示。
Vue 数据双向绑定的原理与Angular有所不同,网上人称「数据劫持」
。Vue使用的是 ES5 提供的 Object.defineProperty() 结合发布者-订阅者模式,通过Object.defineProperty() 来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)©。
柯里化不会调用函数。它只是对函数进行转换。
1 | // 请实现 curry 函数,实现函数柯里化 |
具体实现如下
1 | function curry(fn) { |
JS 把异步任务分为宏任务和微任务。ES5 之后,JavaScript 引入 Promise,不需要浏览器,JavaScript 引擎自身也可以发起异步任务了。
宏任务包括 script,事件,网络请求(AJAX/Fetch),setTimeout,setInterval,setImmediate,I/O、UI 交互事件由宿主发起。
Promise.then, Promise.catch, Promise.finally, MutationObserver 是微任务,由 JS 引擎发起。
注意:Promise 本身是同步的,但是其 then/catch 的回调是异步的。
宏任务、微任务执行过程
一次事件循环 = (同步代码 + 微任务队列 + 宏任务队列) 放入执行栈,先进先出,执行完成。
1 | console.log("a"); |
输出结果:
1 | a |
1 | Promise.resolve().then(() => { |
输出结果:
1 | Promise1 |
最后输出顺序为:Promise1 => setTimeout1 => Promise2 => setTimeout2。具体流程如下:
同步任务执行完毕。微任务 1 进入微任务队列,宏任务 1 进入宏任务队列。
查看微任务队列,微任务 1 执行,打印 Promise1,生成宏任务 2,进入宏任务队列。
查看宏任务队列,宏任务 1 执行,打印 setTimeout1,生成微任务 2,进入微任务队列。
查看微任务队列,微任务 2 执行,打印 Promise2。
查看宏任务队列,宏任务 2 执行,打印 setTimeout2。
1 | const p = new Promise((resolve) => { |
输出顺序:
1 | 0 |
1 | async function async1() { |
输出顺序:
1 | script start |
1 | async function async1() { |
输出顺序
1 | illegalscript start |
1 | new Promise((resolve, reject) => { |
输出结果
1 | 3; |
1 | setTimeout(() => { |
输出结果
1 | 2 |
Node.js 的单线程模型给了它无数的赞美,也带给它无数的诟病。单线程模型,让开发者远离了线程调度的复杂性,使用事件驱动也能开发出一个高并发的服务器;同样也是因为单线程,让CPU密集型计算应用完全不适用。
Node.js 中内建了一个 child_process模块,可以在程序中创建子进程,从而实现多核并行计算。
more >>
假设给你n个红色的水壶和n个蓝色的水壶。它们的形状和尺寸都各不相同。所有的红色水壶盛水量都各不相同,蓝色水壶也是如此。但对于每一个红色水壶来说,都有一个蓝色水壶盛水量和其相同;反之亦然。
你的任务是配对出全部盛水量相同的红色水壶和蓝色水壶。为此,可以执行的操作为,挑出一对水壶,一只红色一只蓝色,将红色水壶灌满水,将红色水壶的水倒入蓝色水壶中,看其是否恰好灌满来判断,这个红色水壶的盛水量大于、小于或等于蓝色水壶。假设这样的比较需要花费一个单位时间。
请找出一种算法,它能够用最少的比较次数来确定所有水壶的配对。
注意:不可直接比较两个红色或者两个蓝色水壶,一次比较必须取一只红色一只蓝色。
tag: