# 算法与数据结构 **Repository Path**: Shale/algorithm_and_data_structure ## Basic Information - **Project Name**: 算法与数据结构 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-07-31 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 算法与数据结构 ####2018滴滴老哥面试 call 实现 bind 实现 new flex:1 移动端点击穿透 延迟 继承 判断object类型 混合开发 js android 通信 access-control-allow-origin const a = []; a.push(a); bfc 触发bfc git branch 查看分支; ##继承 ####原型链继承 在创建子类型的实例时,不能向超类型的构造函数中传递参数,实例共享引用对象 ``sub.prototype = new super()`` ####借用构造函数 方法在构造函数中定义,无法复用 `` function sub(){ super.call(this) } `` ####组合继承 分别拥有自己的属性,也可以使用相同的方法 `` function sub(){ super.call(this) } sub().prototype = new super(); sub().prototype.constructor = sub; `` ####原型式继承 包含引用类型值的属性始终都会共享相应的值,就像使用原型模式一样。 Object.create() 两个参数一个用作新对象原型的对象和(可选的)一个为新对象定义额外属性的对象 `` function object(o){ function F(){} F.prototype = new o(); return new F(); } sub = object(super); `` ####寄生式继承 考虑对象而不是自定义类型和构造函数的情况下使用 `` function createAnother(original){ var clone = object(original); //通过调用函数创建一个新对象 clone.sayHi = function(){ //以某种方式来增强这个对象 alert("hi"); }; return clone; //返回这个对象 } `` ####寄生组合式继承 即通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。本质上,就是使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。 `` function inheritPrototype(subType, superType){ var prototype = object(superType.prototype); //创建对象 prototype.constructor = subType; //增强对象 subType.prototype = prototype; //指定对象 } `` 这个函数接收两个参数:子类型构造函数和超类型构造函数。在函数内部,第一步是创建超类型原型的一个副本。第二步是为创建的副本添加constructor 属性,从而弥补因重写原型而失去的默认的constructor 属性。 `` function SubType(name, age){ SuperType.call(this, name); } inheritPrototype(SubType, SuperType); `` ##缓存 缓存机制:https://www.jianshu.com/p/54cc04190252 service worker: https://developer.mozilla.org/zh-CN/docs/Web/API/Service_Worker_API/Using_Service_Workers ##BigNumber js 精度 https://www.cnblogs.com/snandy/p/4943138.html 乘法 https://blog.csdn.net/hx1298234467/article/details/49853141 加法 https://www.jianshu.com/p/c51d63028371 流转string做大数据运算 https://www.cnblogs.com/it-deepinmind/p/7430025.html ##nodejs事件循环 https://www.cnblogs.com/jasonxuli/p/6074231.html https://nodejs.org/zh-cn/docs/guides/event-loop-timers-and-nexttick/ 应用层: 即 JavaScript 交互层,常见的就是 Node.js 的模块,比如 http,fs V8引擎层: 即利用 V8 引擎来解析JavaScript 语法,进而和下层 API 交互 NodeAPI层: 为上层模块提供系统调用,一般是由 C 语言来实现,和操作系统进行交互 。 LIBUV层: 是跨平台的底层封装,实现了 事件循环、文件操作等,是 Node.js 实现异步的核心 。 无论是 Linux 平台还是 Windows 平台, Node.js 内部都是通过 线程池 来完成异步 I/O 操作的, 而 LIBUV 针对不同平台的差异性实现了统一调用。 因此,Node.js 的单线程仅仅是指 JavaScript 运行在单线程中,而并非 Node.js 是单线程。 ##meta标签 https://www.cnblogs.com/wangyang108/p/5995379.html keywords http-equiv content-Type description viewport robots copyright renderer revisit-after(爬虫重访问时间) cache-control expires refresh Set-Cookie viewport https://www.cnblogs.com/2050/p/3877280.html layout viewport 浏览器默认的viewport 。这个layout viewport的宽度可以通过 document.documentElement.clientWidth 来获取。 然而,layout viewport 的宽度是大于浏览器可视区域的宽度的。 visual viewport 代表 浏览器可视区域的大小,visual viewport的宽度可以通过window.innerWidth 来获取,但在Android 2, Oprea mini 和 UC 8中无法正确获取。 ideal viewport 移动设备的理想viewport。ideal viewport并没有一个固定的尺寸,不同的设备拥有有不同的ideal viewport。 ##prototype prototype是函数的属性,属于函数,只有函数能够引用他,并且函数的prototype属性返回的是一个对象 ##栈和队列性能 shift 性能低于 pop ##浏览器渲染过程 回流 当render树中的一部分或者全部因为大小边距等问题发生改变而需要重建的过程叫做回流 重绘 当元素的一部分属性发生变化,如外观背景色不会引起布局变化而需要重新渲染的过程叫做重绘 现在我们大概都能得出的结论是:回流比重绘的代价要高,至于具体的花销跟render树有多少节点需要重新构建有关。还有就是,回流一定会伴随着重绘,但是重绘不一定会引起回流。 ##git merge rebase 1.采用merge和rebase后,git log的区别,merge命令不会保留merge的分支的commit 2.处理冲突的方式: (一股脑)使用merge命令合并分支,解决完冲突,执行git add .和git commit -m'fix conflict'。这个时候会产生一个commit。 (交互式)使用rebase命令合并分支,解决完冲突,执行git add .和git rebase --continue,不会产生额外的commit。这样的好处是,‘干净’,分支上不会有无意义的解决分支的commit;坏处,如果合并的分支中存在多个commit,需要重复处理多次冲突。 3.git pull和git pull --rebase区别:git pull做了两个操作分别是‘获取’和合并。所以加了rebase就是以rebase的方式进行合并分支,默认为merge。 ##http2.0 多路复用 图片异源优化 ## post & get https://www.cnblogs.com/logsharing/p/8448446.html ##深复制问题 https://www.jb51.net/article/140928.htm ##vue 属性依赖 异步更新队列 Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的 router history 模式 history.pushState 组件沟通 new 一个全局实例 computed 响应式原理 https://segmentfault.com/a/1190000016368913?utm_source=tag-newest https://www.jianshu.com/p/e6e1fa824849 ##canvas & webgl 定位canvas物体 拾取坐标 isPointInPath 这个方法接收x 和y 坐标作为参数,用于在路径被关闭之前确定画布上的某一点是否位于路径上 优化: 分层和局部重绘 worker计算 主线程: postMessage onmessage worker.terminate() worker: self.addEventListener() 接收参数 self.close() http://www.ruanyifeng.com/blog/2018/07/web-worker.html 跨域图片 img.setAttribute('crossOrigin','anonymous'); 离屏canvas 缓冲 创建canvas 内存,然后调用drawImage 绘制 贝塞尔曲线 https://www.jianshu.com/p/0c9b4b681724 ##typeof instanceOf toString instanceof:用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置 toString:所有typeof 返回值为"object" 的对象(如数组)都包含一个内部属性[[Class]] (我们可以把它看作一个内部的分类,而非传统的面向对象意义上的类)。这个属性无法直接访问,一般通过Object.prototype.toString(..) 来查看。 ##沙雕 && || 逻辑或 || : var a = 表达式1 || 表达式2       表达式1    表达式2    a取值        1      0      表达式1结果值        1        1      表达式1结果值        0        1      表达式2结果值        0        0      表达式2结果值 逻辑与 && : var a = 表达式1 && 表达式2       表达式1    表达式2    a取值        1      0      表达式2结果值        1        1      表达式2结果值        0        1      表达式1结果值        0        0      表达式1结果值