Object–JavaScript世界的起源
JavaScript的世界中「一切皆是对象」,而所有对象的起源就是 Object 对象。
神說:「要有光」。就有了光。
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个蓝色的水壶。它们的形状和尺寸都各不相同。所有的红色水壶盛水量都各不相同,蓝色水壶也是如此。但对于每一个红色水壶来说,都有一个蓝色水壶盛水量和其相同;反之亦然。
你的任务是配对出全部盛水量相同的红色水壶和蓝色水壶。为此,可以执行的操作为,挑出一对水壶,一只红色一只蓝色,将红色水壶灌满水,将红色水壶的水倒入蓝色水壶中,看其是否恰好灌满来判断,这个红色水壶的盛水量大于、小于或等于蓝色水壶。假设这样的比较需要花费一个单位时间。
请找出一种算法,它能够用最少的比较次数来确定所有水壶的配对。
注意:不可直接比较两个红色或者两个蓝色水壶,一次比较必须取一只红色一只蓝色。
Cookie,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。
html5 中的 Web Storage 包括了两种存储方式:sessionStorage和localStorage。
sessionStorage 用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此 sessionStorage 不是一种持久化的本地存储,仅仅是会话级别的存储。
而 localStorage 用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。浏览器中同一个域下的窗口可以共享 localStorage 数据。
more >>ECMAScript 5 引入了严格模式(strict mode)的概念。严格模式为JavaScript定义了一种不同的解析与执行模型。在严格模式下,ECMAScript 3中的一些不确定的行为将得到处理,而且对于某些不安全的操作也会抛出错误。(JavaScript高级程序设计)
more >>tag: