面试时候的一道算法题。
给出新旧两个数组,找出旧数组演变成新数组的一个可行的operations。operations可能包含的操作有remove/insert/swap三种。
思路:先通过remove/insert使得旧数组和新数组有一样的元素,然后再通过swap演变成和新数组一样。
给出brute force的解法:
1 | const findOperations = function(oldArr, newArr) { |
前端小天才智多星班进修中
面试时候的一道算法题。
给出新旧两个数组,找出旧数组演变成新数组的一个可行的operations。operations可能包含的操作有remove/insert/swap三种。
思路:先通过remove/insert使得旧数组和新数组有一样的元素,然后再通过swap演变成和新数组一样。
给出brute force的解法:
1 | const findOperations = function(oldArr, newArr) { |
面试的时候遇到的一道题,写一下自己的理解,不一定正确。
浏览器实现了同源策略,目的肯定是为了网络安全。如果没有SOP,恶意站点可以随意获取、请求别的站点的内容,真“裸奔”在互联网上。
那为什么浏览器不实现彻底的SOP,而允许了像script
、img
这类标签可以请求其他站点的资源呢?
这个问题google了一圈没有一个明确的说法,stackoverflow上有类似的问题,但是没有给出明确的答案。把各种观点总结下,先说结论:
浏览器没有实现彻底的SOP,是一个多方协商、折中、相对稳妥的方案:
这道题没搞懂面试官是想考察什么,当时的回答是一个站点很难完全不依赖跨域资源,如果完全SOP,像现在很常见的CDN就用不了了。但是面试官貌似对这个答案不是很满意= =。。。说SOP的出现比CDN早很多。。
先暂且记录下现有的理解,后面有新的体会再补充。。
记录下touchstart、touchmove、touchend、click的触发顺序
实验环境:mac chromium模拟器,iPhoneX Safari
1 | const evts = ["touchstart", "touchmove", "touchend", "click"] |
touchstart -> touchend -> click
touchmove事件不触发
touchstart -> touchmove(可能触发多次) -> touchend
click事件不触发
iPhone: touchstart -> touchend
mac: touchstart (在mac上长按呼出了force touch,没触发touchend。。)
touchmove和click事件不触发
今天研究了下this的指向会不会被改变
用例均在node下执行
1 | class A { |
bind
/call
/apply
可以改变成员方法this的指向;hexo的yilla模板没有整合lazyload,导致首屏加载了一堆图片,又慢又卡。。
引入 hexo-lazyload-image
,发现除了首屏图片外,其他图片都没有加载。
往hexo-lazy-image/lib/simple-lazyload.js
的监听window scoll句柄中增加log,发现句柄完全没执行。
随后在console里面调试:
1 | window.addEventListener('scroll', function() {console.log('scroll')}) |
怀疑是框架在文章dom上阻止了scroll的冒泡,先简单处理:
1 | // node_modules/hexo-lazy-image/lib/simple-lazyload.js |
成功解决。
今天被Promise.finanlly的兼容性坑了一波,记录一下。。
先看Promise.finally
的兼容性,其实和Promise.all
、Promise.race
不是同期的东西。。
用户反馈在微信公众号上无法输入,自己用iOS10的设备试了一下确实能复现,查看控制台发现提示undefined is not a function
,看了下log最新的改动是增加了Promise.finanlly,再结合caniuse的兼容性报告,引入promise.prototype.finally
。
然而,还是报一样的错。。。= =
翻了下这个polyfill包的issue,唯三的issue都是开着的,里面还真找到了一样的反馈,创建与2017年8月。。。
shim() not shimming on karma/phantomJS
参照里面的解决方法新建了一个模块:
1 | //@webSrc/utils/promiseFinallyShim.js |
面试的时候遇到的一道题。原生fetch api不支持timeout,需要放fetch支持timeout。
一开始的想法是直接把fetch包一层,返回一个新的promise,这个promise受一个setTimeout的reject控制:
1 | const myFetch = function(url, options, timeout) { |
但是感觉面试官对这个答案不是很满意,想了下再写了一版:
1 | const timeoutFetch = function(url, args, timeout) { |
持续改进:
1 | //通过高阶函数,保持了fetch的参数列表不变,对业务代码的侵入性更低 |
原先一直觉得Promise.race
在工作中用得比较少(平时Promise.all
用得比较多),没啥用。。看了这个后真的只能真香“女少啊” :)
今天发现某些情况下append进body的script标签不一定执行,记录一下。
下面的例子在FF和Chrome上均表现一致
1 | const container = document.createElement("div") |
1 | const script = document.createElement("script") |
script
标签,标签内容才会被执行script
标签内容最多只会被执行一次,即使内容发生了变化或被重新插入domdisplay:flex
设置成flex布局,子元素的float, clear, vertical-align属性失效。
决定主轴方向
如何换行
flex-direction和flex-wrap的简写
1 | flex-flow: <flex-direction> <flex-wrap> |
决定项目在主轴上的对齐方式
决定项目在交叉轴上的对齐方式
1 | .flex-box { |
1 | <div class="flex-box"> |
定义多根轴线对齐方式,如果只有一根轴线(一行),该属性不起作用
对齐的参照物是 交叉轴
定义项目的排列顺序,数字越小越靠前。默认为0,允许为负数。
定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大
如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小
如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
如果尽可能缩小后还是行宽过长,会突破容器。
定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为
auto
,即项目的本来大小。
是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto
。后两个属性可选。建议优先使用这个属性。
0 1 auto
1 1 auto
0 0 auto
允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch
1 | //最简单的正则过滤 |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true