Wendy
Wendy
## 题目 - 实现随机抽奖程序 接受一个数组 arr, n , 从数组中抽出n个人 - 实现 sleep(5).then(console.log), sleep(4), sleep(5).then(console.log); 执行.then的时候才输出,执行sleep函数的时候不输出 - 实现一个发布订阅模式和观察者模式 - 斐波那契数列 - 不使用新的变量交换两个变量的值 - 实现一个Promise.all - 手写call/apply/bind - 手写函数防抖和节流 - 实现一个 iterator...
# 前言 ## 无状态的HTTP协议 很久很久之前, Web基本都是文档的浏览而已。既然是浏览, 作为服务器, 不需要记录在某一段时间里都浏览了什么文档, 每次请求都是一个新的HTTP协议,就是请求加响应。不用记录谁刚刚发了HTTP请求, 每次请求都是全新的 ## 如何管理会话 随着交互式Web应用的兴起, 像在线购物网站,需要登录的网站等,马上面临一个问题,就是要管理回话,记住那些人登录过系统,哪些人往自己的购物车中放商品,也就是说我必须把每个人区分开。 本文主要讲解cookie,session, token 这三种是如何管理会话的; # cookie cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据。跟服务器没啥关系,仅仅是浏览器实现的一种数据存储功能。 cookie由服务器生成,发送给浏览器,浏览器把cookie以KV形式存储到某个目录下的文本文件中,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间。所以每个域的cookie数量是有限制的。 ## 如何设置 ### 客户端设置 ```js document.cookie = "name=xiaoming;...
## 常见布局的实现 - 水平垂直居中 - 宽度和高度都固定 - 宽度和高度都不固定 - 两列布局 - 左边宽度固定, 右边宽度自适应 - 右边宽度固定, 左边宽度自适应 - 三列布局 - 中间自适应, 左右两边固定 ## 水平垂直居中 1. flex布局, 父元素设置 `display: flex;justify-content: center;align-items: center;`...
## 目录 1. setState原理,什么时候同步,什么时候异步 2. JSX原理,为什么自定义的React组件必须大写 3. 虚拟DOM,diff算法 - 虚拟DOM是什么 - React diff原理,如何从 O(n^3)变成 O(n) - 为什么要使用Key,key有什么好处 4. 生命周期(16版本之前和之后的) 5. React事件机制 - React如何实现自己的事件机制 - React事件和原生事件有什么区别 - React 事件中为什么要绑定 this 或者...
## 目录 - HTTP1.x、HTTP2、HTTP3 - HTTP1.0 和HTTP1.1的一些区别 - HTTP2.0和HTTP1.X相比的新特性 - 为什么 HTTP1.1 不能实现多路复用 - 多路复用和 keep alive区别 - HTTPS - HTTP和HTTPS的区别 - HTTPS握手过程 - HTTPS通过什么保证是安全的 - 三次握手,四次挥手,为什么是三次和四次 - HTTP 的请求方法有哪些?GET和POST区别?...
## 前言 之前写过一篇文章[为什么使用v-for时必须添加唯一的key?](https://juejin.im/post/5aae19aa6fb9a028d4445d1a "为什么使用v-for时必须添加唯一的key?"),但是解释的不是很深刻,其实真正的原因还需要从Virtual DOM的实现上解释;本篇文章从简单实现一个Virtual DOM入手,去解释一下Virtual DOM的实现思想; 源码地址:[github](https://github.com/funnycoderstar/simple-virtual-dom "github") ## 思路 1.定义一个类,用来创建 DOM 元素(element.js); 2.比较新旧 DOM 树的差异(diff.js); 3.将差异的部分渲染到DOM树即只渲染变化了的部分(patch.js) ## virtural-dom的模型 一个DOM标签所需的基本元素 - 标签名 - 节点属性,包含样式,属性,事件 - 子节点 - 标识id ```js...
## Vue.use用法 `vue`提供了 `Vue.use` 的全局`api`来注册插件,比如 `vuex`、`vue-router`等 ### 用法 Vue.use(plugin) - 参数如果是一个对象,必须提供 install 方法 - 参数如果是一个函数,自身会被当做install方法,方法调用的时候,会将vue作为参数传入 - Vue.use(plugin) 调用之后,插件会的 install方法会默认接受第一个参数,这个参数是vue 这个方法需要在 `new vue()` 之前调用。 `Vue.use` 会自动阻止多次注册相同插件,即使调用多次也只会注册一次。 ## Vue.use源码分析 我们可以从源码入手分析一下,基于vue 2.6.11 版本,源码地址为:[src/core/global-api/use.js](https://github.com/vuejs/vue/blob/dev/src/core/global-api/use.js)...
## 目录 01. 伪类和伪元素 02. 实现固定宽高比(`width: height = 4: 3`)的div,怎么设置 03. CSS选择器 04. CSS解析规则 05. `flex: 1` 完整写法 06. `display: none`和 `visibility:hidden`的区别 07. `em` `rem` `vh` `vw` `calc()` `line-height` 百分比...
## 前言 这个问题也可以变为 commonjs模块和ES6模块的区别;下面就通过一些例子来说明它们的区别。 先来一道面试题测验一下:下面代码输出什么 ```js // base.js let count = 0; setTimeout(() => { console.log("base.count", ++count); // 1 }, 500) module.exports.count = count; // commonjs.js const { count }...
## JS运行机制 JS执行是单线程的,它是基于事件循环的。事件循环大致分为以下几个部分: 1. 所有同步任务在主线程上执行,形成一个执行栈。 2. 主线程之外,还存在一个“任务队列”。只要异步有了运行结果。就在"任务队列"中放置一个事件。 3. 一旦"执行栈"中所有的同步任务执行完毕,系统就会读取“任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。 4. 主线程不断重复上面的第三步。 主线程的执行过程就是一个tick,而所有的异步结果都是通过 "任务队列" 来调度。消息队列中存放的是一个个 macro task 结束后,都要清空 所有的 micro task。 ```js for (macroTask of macroTaskQueue) { // 1. Handle current...