URL
URL (Uniform Resource Locator)
中译:统一资源定位符(其实就是网址)
语法规则
1 | scheme://host.domain:port/path/filename |
1:scheme - 定义网络服务的类型. 比如:https
2:host - 定义域主机(http默认主机 www)
3:domain - 定义域名,比如 baidu.com
4:port -定义主机上的端口号(http默认是 80)
5:path - 定义服务器路径(如果省略,文档必须在网站根目录下)
6:filename - 定义文档/资源的名称
css相关
css解析顺序
从上到下,从右到左。如果是这样的一个结构,浏览器会从右向左开始解析。因为一般来说,最右侧的节点范围反而会比较大,越向左限定的条件就越多。也因此 CSS 的选择器设计上不宜嵌套过多,会带来性能上的问题。
字符串转驼峰
1 | // 转化为驼峰命名 |
css实现三角型
就是把想要的三角型左右两边隐藏起来(transparent)。
1 | .kailong{ |
数组方法
- 创建一个新数组根据传入多少拉平
- 默认拉平一层,如果想要不管多少层都拉平就传入Infinity。
- 如果有空位会跳过空位
解决浮点数运算不准确
考虑到每次浮点数运算的偏差非常小(其实不然),可以对结果进行指定精度的四舍五入,比如可以parseFloat(result.toFixed(12));
将浮点数转为整数运算,再对结果做除法。比如0.1 + 0.2,可以转化为(1 + 2)/10。(转化后的两个整数相乘的结果有可能超过 MAX_SAFE_INTEGER)
把浮点数转化为字符串,模拟实际运算的过程。
set,map,weakset,weakmap
set
- 在js中Set 对象允许存储任何类型的唯一值,无论是原始值或者是对象引用。
- 顶层数据结构不具备key—>value特征,内部会自动加index序列。
- 可以存储不同类型的任何数据。
set方法
- size属性: 返回集合的元素个数。(类似数组的长度length)
- add(value)方法: 向集合中添加一个元素value。注意:如果向集合中添加一个已经存在的元素,不报错但是集合不会改变。
- delete(value)方法: 从集合中删除元素value。
- has(value)方法: 判断value是否在集合中,返回true或false.
- clear()方法: 清空集合。
map
map对象保存键值对
方法
- size: 属性,取出字典的长度
- set(key, value):方法,向字典中添加新元素
- get(key):方法,通过键查找特定的数值并返回
- has(key):方法,判断字典中是否存在键key
- delete(key):方法,通过键 key 从字典中移除对应的数据
- clear():方法,将这个字典中的所有元素删除
weakset
和set类似是不可重复的值得集合,但是weakset成员只能是对象
都是弱引用,随时都可能消失
weakmap
依然是键值对的集合,只是键是弱引用对象,而值可以是任意的。
weak这些因为都是弱引用的,所以在没有其他引用和他们引用的是同一对象的时候,该对象就会被垃圾回收,避免内存泄漏。
WeakMap与Map类似,但有几点区别:
1、WeakMap只接受对象作为key,如果设置其他类型的数据作为key,会报错。
2、WeakMap的key所引用的对象都是弱引用,只要对象的其他引用被删除,垃圾回收机制就会释放该对象占用的内存,从而避免内存泄漏。
3、由于WeakMap的成员随时可能被垃圾回收机制回收,成员的数量不稳定,所以没有size属性。
4、没有clear()方法
5、不能遍历
适用场景
- 想要给网页的dom节点进行操作
- 注册监听事件的listener
事件循环的机制
主线程->清空微任务队列->UI(dom)渲染->取一个宏任务执行->清空微任务队列->UI渲染->取一个宏任务执行
宏任务可以有多个任务队列,而微任务只有一个任务队列
前端优化
- 开启压缩
- 图片使用webp
- cdn
- 提取关键帧资源,优先加载
- 代码分片,延迟加载
- 预加载,preload prefetch等
- script defer async
- 域名分片,减少请求数
- 服务端渲染
- 如果已经升级为https,可以考虑使用http2.0。两个点:一个头信息压缩,二是解决了队头阻塞问题,三是增加了服务端push。
- 资源预取,混合应用可以加离线宝
- 在mvvm类框架进行前端渲染,我们可以使用defer加在我们的内容,在配上骨架图,保证用户看到的不是空白的页面。
- 当然少不了我们的业务代码,好的代码会让网站更稳定的运行下去
- 分析network的timing,然后通过本文最开始提及的各字段分析问题
响应式布局
media-query,根据不同的屏幕宽度设置根元素font-size
vw和vh
margin纵向问题
- 相邻元素margin-top和margin-bottom会重叠(开启bfc解决)
- 空白内容的会重叠
BFC开启条件
- float:left|right
- position:absolute|fixed
- display: table-cell|table-caption|inline-block
- overflow: hidden|scroll|auto
line-hight的继承
其他具体数值和比例的时候都是直接继承,若是百分比则继承计算出来的值
圣杯双飞翼
圣杯
设置中间的mid,left,right的父元素float:left
向左浮动,再设置padding-left-right
为留给左右的宽度,中间的mid也可以正好合适了。
然后将left设置margin-left:-100%
和mid重叠,之后再设置position:relative; right:他自身宽度px
来移动到左边。
然后给right设置margin-right:-自身宽度px
双飞翼
浮动后,留白通过margin来留白
给left只要margin-left:-100%
就可以
right只要margin-left:-自身宽度px
即可
clearfix
1 | .clearfix:after { |
三栏布局
position绝对定位,flex直接摆放
gird
1 | .div{ |
闭包相关
所有自由变量的查找是在函数定义的地方,向上级作用域查找。不是在执行的地方!
async和await
执行async函数返回promise对象,如果直接返回的值就会把它封装成promise.resolve(值)
await相当于promise.then
try…catch相当于promise.catch
原理
相当于将generator函数和自动执行器包装到一个函数里,也可以看作自带启动器的 generator 函数的语法糖。
变量提升和函数提升
变量提升是把var a提到前面,然后再将a=10留在原地等赋值;
函数提升是把整个函数体提升到作用域顶部
函数提升优先级更大
1 | foo(); //1 |
函数声明function foo
这种才有函数提升,函数表达式var foo = function()
这种没有,要是在函数表达式前调用就会报错,因为var foo;定义完并不是一个方法。
浏览器的相关问题
求二叉树高度
1 | function H(node){ |
快排的时间和空间复杂度
时间复杂度
在最差情况下,划分由 n 个元素构成的数组需要进行 n 次比较和 n 次移动。因此划分所需时间为 O(n) 。最差情况下,每次主元会将数组划分为一个大的子数组和一个空数组。这个大的子数组的规模是在上次划分的子数组的规模减 1 。该算法需要 (n-1)+(n-2)+…+2+1= O(n^2) 时间。
在最佳情况下,每次主元将数组划分为规模大致相等的两部分。设 T(n) 表示使用快速排序算法对包含 n 个元素的数组排序所需的时间,因此,和归并排序的分析相似,快速排序的 T(n)= **O(nlogn)**。
空间复杂度
最优的情况下空间复杂度为:O(logn) ;每一次都平分数组的情况
最差的情况下空间复杂度为:O( n ) ;退化为冒泡排序的情况
object.defindProperty和proxy的差别
- 使用Object.defineProperty需要遍历对象的每一个属性,对于性能会有一定的影响
- Proxy 作为新标准将受到浏览器厂商重点持续的性能优化
- Proxy 能观察的类型比 defineProperty 更丰富
- Proxy 不兼容IE,也没有 polyfill, defineProperty 能支持到IE9
- Object.definedProperty 是劫持对象的属性,新增元素需要再次 definedProperty。而 Proxy 劫持的是整个对象,不需要做特殊处理
- 使用 defineProperty 时,我们修改原来的 obj 对象就可以触发拦截,而使用 proxy,就必须修改代理对象(new Proxy),即 Proxy 的实例才可以触发拦截
computed和watch
watch擅长处理的场景:一个数据影响多个数据;
computed擅长处理的场景:一个数据受多个数据影响。
https加密过程
- 浏览器发送client_random,加密方法列表
- 服务器接收到,返回server_random、加密方法和数字证书
- 浏览器验证数字证书生成pre_random,用公钥加密pre_random和用最后生成的secret加密secret发送给服务器,
- 私钥解密获得pre_random后,用之前三个random生成secret。
- 服务器用secret发送确定,之后就都用这个对称密钥通信了
获取页面中所有h开头的标签
- 通过
document.getElementByTagName("*")
获取所有标签 - 再通过
startWith("h",可填起止位置)
遍历匹配标签中开头是否符合(返回的是true或false)
怪异盒和标准盒
- 当设置为box-sizing:content-box时,将采用标准模式解析计算,也是默认模式;总宽度=margin+width+border+padding
- 当设置为box-sizing:border-box时,将采用怪异模式解析计算;总宽度=margin+width(包含了padding和border)
图片相关css
- background-size:contain; // 缩小图片来适应元素的尺寸(保持像素的长宽比);
- background-size :cover; // 扩展图片来填满元素(保持像素的长宽比);
- background-size :100px 100px; // 调整图片到指定大小;
- background-size :50% 100%; // 调整图片到指定大小,百分比相对于包含元素的尺寸。
try+catch+finally+throw
1 | try { |
当错误发生时, JavaScript 会停止执行,并生成一个错误信息。使用 throw 语句 来创建自定义消息(抛出异常)。
watch深层监听
- deep: true
- 使用computed+watch来监听深层内部的东西