项目中有遇到一些涉及数学集的运算,在网上寻找解决方法的时候顺便总结一下。
假设有数组a = [1, 2, 3]
和b = [2, 4, 5]
ES7 includes
1 | // 并集 |
项目中有遇到一些涉及数学集的运算,在网上寻找解决方法的时候顺便总结一下。
假设有数组a = [1, 2, 3]
和b = [2, 4, 5]
1 | // 并集 |
默认情况下父作用域的不被认作 props 的特性绑定 (attribute bindings) 将会“回退”且作为普通的 HTML 特性应用在子组件的根元素上。当撰写包裹一个目标元素或另一个组件的组件时,这可能不会总是符合预期行为。通过设置 inheritAttrs 到 false,这些默认行为将会被去掉。而通过 (同样是 2.4 新增的) 实例属性 $attrs 可以让这些特性生效,且可以通过 v-bind 显性的绑定到非根元素上。
这个选项不影响 class 和 style 绑定
当我们用 v-for 渲染大量的同样的 DOM 结构时,但是每个上面都加一个点击事件,这个会导致性能问题,那我们可以通过 HTML5 的 data 的自定义属性做事件代理。
总结一下数组去重的几种方式,直接上代码:
1 | var arr = [1, 1, 2, '1'] |
以下为待拷贝对象:
1 | let a = { |
可以转换成树形结构:
1 | a |
用循环遍历一棵树,需要借助一个栈,当栈为空时就遍历完了,栈里面存储下一个需要拷贝的节点
首先往栈里放入种子数据,key 用来存储放哪一个父元素的哪一个子元素拷贝对象
然后遍历当前节点下的子元素,如果是对象就放到栈里,否则直接拷贝。
1 | function cloneLoop(x) { |
1 | function multiply(x, y) { |
macro-task(宏任务):包括整体代码script,setTimeout,setInterval, setImmediate, I/O, UI rendering
micro-task(微任务):Promise,process.nextTick, Object.observe, MutationObserver
事件循环的顺序,决定js代码的执行顺序。进入整体代码(宏任务)后,开始第一次循环。接着执行所有的微任务。然后再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。听起来有点绕,我们用文章最开始的一段代码说明
1 | setTimeout(function() { |
1 | function say(word) { console.log(world); } |
<script src="script.js"></script>
没有defer
或者async
,浏览器会立即加载并执行js文件,立即指的是该script
标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。<script src="test.js" async></script>
有async
,加载和渲染后续文档元素的过程将和script.js
的加载与执行并行进行(异步)<script src="test.js" defer></script>
有defer
,加载后续文档元素的过程将和script.js
的加载并行进行(异步),但是script.js
的执行要在所有元素解析完成之后,DOMContentLoaded
事件触发之前完成。script
标签会停下来,等到执行完脚本,继续向下渲染defer
是“渲染完再执行”,async
是“下载完就执行”,defer
如果有多个脚本,会按照在页面中出现的顺序加载,多个async
脚本不能保证加载顺序async
适合不依赖任何脚本或者不被任何脚本依赖的情况,比如Google Analytics
type=module
,异步加载不会造成阻塞浏览器,页面渲染完再执行,可以同时加上async
属性,异步执行脚本(利用顶层的this
等于undefined
这个语法点,可以侦测当前代码是否在es6模块之中)读完《你不知道的 JavaScript》上卷后,发现里面有个对模块依赖器原理的探究很值得记录。
原理是使用一个myModule
变量接收一个立即执行函数通过闭包返回的函数:
1 | let myModule = (function() { |
从而能通过暴露的 api 完成模块的定义和依赖引用
1 | myModule.define('bar', [], function() { |