最小覆盖子串 /** * 解题思路 * - 包含所有的包含 T 的子串 * - 找出长度最小的那个字串,返回即可。 * * 解题步骤 * - 用双指针维护一个滑动窗口。 * - 移动右指针,找到包含 T 的子串,移动左指针,尽量减少包含 T 的子串的长度. *//** * @param {string} s * @param {string} t * @return {string} */var minWindow = function(s, t) { let l = 0, .
V8执行原理和优化策略 V8执行原理和优化策略浏览器内核Gecko: 早起被 Netscape 和 Mozila firefox 浏览器使用。Trident: 微软开发,被 IE4~IE1 浏览器使用,但是 Edge 浏览器使用 Blink.Webkit: 评估给予 KHTML 开发、开源的,用来Safari、Google Chrome 之前也是使用的。Blink: 是 Webkit 的一个分支,Google 开发,应用于 Google Chrome、Edge 、Opera。浏览器内核主要是负责浏览器的排版引擎,也称
V8垃圾回收机制 垃圾回收垃圾回收分为手动回收和自动回收两种策略。js 需要垃圾回收吗?js 不像 java,c 对内存的管控可以自己来操作,不需要就可以通过 free 就释放即可。何时分配,何时销毁内存都是由代码来控制的。如果创建了内存,而没有进行 free 回收。这种情况就被称为内存泄露。js 中如何回收js 的数据的存放是存储在栈和堆两种内存空间的。 自然,也就分为栈中的垃圾回收和堆中的垃圾回收。栈中垃圾回收function foo() { var name = '小明'; function
从V8来看数组动态扩容以及对数组的优化 V8对数组的优化在 c++、java 中的数组的特点是:是通过在内存中划分一串连续的、固定长度的空间。来存放一组有限的并且是相同类型的数据结构。js中的数组var arr = [100, 12.3, 'a', function () {return 1}, {a: 1}];arr[arr.length] = '12334';arr.length = 1;js 中的数组可以存放任意的类型。 可以动态的来给数组修改长度。支持任意的类型。js数组可以动态的的改变容量,根据数组的数据来扩容、
利用栈来解决博客目录生成 在开发博客项目中,需要使用 markdown 生成了对应的文章,生成文章之后提取出来 h1 和 h2 标签来组成对应的目录结构。示例 1:输入: ['H1', 'H1', 'H2', 'H2', 'H2', 'H1', 'H2']输出: [{tag: 'h1', children: [{}, {}, {}]}, {tag: 'h1', children: []}] 解题思路:使用栈结构,stack 来进行存放 h1 标签。 使用另一个栈 o_stack 来保存当前所处的 h1 标签
vue源码--$set/$delete $set用法set 是全局 Vue.set 的别名。set(target, propertyName/index, value)作用Vue 中对于对象新增的属性或者是数组新增的下标都是不能够监听到的,为了保障新的属性同样是响应式的,且触发视图更新,需要借助 this.$set 来新增属性。对象不能是 Vue 实例或者是 Vue 实例的根数据对象。原理// src/core/observer/index.jsfunction set (target: Array<any> |
Vue源码---$nextTick $nextTickvm.$nextTick(callback)用法在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后使用它,然后等待 DOM 更新。2.1.0 ,如果没有提供回调且在支持 promise 的环境中,则返回一个 promise。原理Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 会开启一个事件队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到事件循环队列中一次。在缓冲时去除重复数据对于避免不必要的计算和
Vue 模版编译 模版编译如何识别用户自己定义的模版,也就是 标签中类似于原生 HTML,还会有一些变量插值,或一些 Vue 指令,如 v-on、v-if 等。这些不属于元素的语法,归功于 Vue 的模版编译。把原生 HTML 提取出来,把非原生 HTML 找出来,经过一系列的逻辑处理生成渲染函数,也就是 render 函数。抽象语法树 AST如何将 template 中的一堆字符串解析为元素标签、属性、变量。需要借助抽象语法树.模版解析阶段:使用正则的方式解析成抽象语法树 AST。优化阶段:遍历 AS
vue--虚拟DOM 虚拟 DOM虚拟DOM是什么?虚拟 DOM 就是用一个 JS 对象来描述一个 DOM 节点。<div class="a" id="b">我是内容</div>{ tag: 'div', attrs: { class: 'a', id: 'b' }, text: '我是内容', children: []}Vue为什么采用虚拟DOM,而不直接操作真实DOM呢?Vue是数据驱动视图,数据发生变化视图就
Vue响应式原理 响应式原理口述Vue 的响应式是通过 Object.defineProperty 进行数据劫持 + 发布订阅模式 进行依赖收集及更新实现响应式。通过递归的形式将 data 数据(函数/对象)将数据变为可监测的,在 new Vue 初始化 Vue 实例的时候,通过创建一个 Watcher 实例(依赖),进行解析模版中(template)用到的数据,会触发 getter ,每一个对象里面都通过闭包的形式保存一个 Dep 实例(依赖收集者), Dep 会去收集全局的 Watcher 实例,这样就可以在数据改
继承的方式 继承的方式原型链继承function Person() { this.data = [1, 2, 3];}function Teacher() {}Teacher.__proto__ = Person.prototype;var teacher = new Teacher();teacher.data; // [1, 2, 3];问题:对于引用类型的将会共享。改变之后会引用到父的数据。不能够给父构造函数传值。构造函数继承function Person(d
创建对象的方法 创建对象的方法1. 通过 Object 构造器var obj = new Object();obj.name = 'xxx'obj...问题:需要写大量的重复代码2. 字面量创建var obj = {};obj.name = 'xxx';问题:需要写大量的重复代码3. 工厂模式function createObj(name, age) { var obj = new Object(); obj.name = name; obj.age = age;
js 事件委托 事件委托定义何为事件委托,事件委托就是我们可以把本身应该在自己身上的事件触发,委托给别的元素上,让它来代替事件触发。原理主要是通过事件冒泡的特性,触发点击事件之后,PC 端的点击事件是由 300 毫秒的延迟的,当前元素触发之后,会一直向上冒泡,直到 document 才会停止冒泡。注意:任意一层阻止冒泡将会停止。好处当我们有大量的子元素,我们为了点击它,需要在它的身上都加上一个点击事件,知道个数还好,假如我们不知道个数,想绑定事件都没法绑定。所以我们需要借助它的父亲来实现点击事件。只需要指定
instanceof instanceof定义obj instanceof Constructor; 我们用 instanceof 来检测 Constructor.prototype 是否存在于参数 obj 的原型链上。使用function Person() {};var person1 = new Person();person1 instanceof Person; // true;person1 instanceof Object; // true我们可以看到 person1 同时还属于 Object 类
toString toStringtoString 可以用来判断数据类型. 可以把它看作是 typeof 的加强版,因为它不仅可以检测原始类型,还可以区分 object。[[Class]]我们需要先来说一下 [[Class]] 这个内部属性(只要是 [[]] 都是 js的内部属性,是不能够直接访问的),你不要认为它是与类有关系的内部属性,你可以把它看作是一种分类的方法。我们可以间接地通过在这个值上借用默认的 Object.prototype.toString() 来调用展示。Object.prototype.toSt
ie最小高度 ie最小高度chrome 下最小字体为 16px,而 ie 下最小高度为 12px如果设置一个盒子的话,设置盒子的高度,ie 下最小高度为 19px;我们想要设置更小的高度的话,需要给盒子的父盒子设置 font-size: 0;即时可以设置宽度, ie 下也设置不了 0px。...
移动端禁止默认行为 全面禁止默认行为在移动端上,文字默认会被选中,会使用浏览器默认的滚动条,有默认的右键菜单。那么怎么才能禁止呢?禁止方式document.addEventListener('touchstart', function (ev ) { ev = ev || event; ev.preventDefault();})这样子就可以了,那么怎么才能知道是否可以阻止默认事件?ev.cancelable;那么我们阻止了默认行为,怎么才能单独的使用?如果我们不想在 document
实现1物理像素 实现1物理像素我们写的1css像素都会跨越好几个物理像素,并且显示出来是按1像素的。那我们怎么实现1物理像素。(淘宝实现)通过缩放(function () { var dpr = window.devicePixelRatio || 1; const styleNode = document.createElement('style'); let size = document.documentElement.clientWidth * dpr / 16; styleN