JS学习笔记

82 阅读8分钟

HTML语义化

  • 让人更容易读懂(增加代码的可读性)
  • 让搜索引擎更容易读懂(SEO)

box-sizing:border-box 整体长度

margin纵向重叠问题

相邻元素的margin-top和margin-bottom会重叠,选大的作为margin,空内容也会被忽略

margin负值问题

margin-top和margin-left负值,元素向上,向左移动

margin-right负值,右侧元素左移,自身不受影响

margin-bottom负值,下方元素上移,自身不受影响

BFC的理解与应用

Block format context,块级格式化上下文

一块独立渲染区域,内部元素的渲染不会影响边界以外的元素

圣杯布局和双飞翼布局

使用 float 布局

两侧使用 margin 负值,以便和中间内容横向重叠

防止中间内容被两侧覆盖,一个用 padding 一个用 margin

flex最常用的语法
flex-direction:主轴的方向(可横向可纵向)
justify-content:主轴对齐方式(开始对齐、两边对齐...)
align-items:交叉轴对齐方式(和主轴垂直的轴)
flex-wrap:什么时候换行
align-self:子元素在交叉轴的对齐方式(开始对齐、居中对齐...)

absolute 和 relative 分别依据什么定位

relative依据自身定位 且对外界元素不会有什么影响

absolute 依据最近一层的定位元素定位

定位元素:absolute relative fixed 或 body

line-height 如何继承

写具体数值,如30px,则继承该值

写比例,如2/1.5,则继承该比例(直接继承与继承本身的font-size相乘的值)

写百分比,如200%,则继承计算出来的值(考点)(先与本身的font-size相乘后,再继承)

rem的弊端

阶梯型(对于不同尺寸范围需要指定相应的根元素标准,不方便指定到每个尺寸)

网页视口尺寸

window.screen.height:屏幕高度

window.innerHeight: 网页视图高度

document.body.clientHeight: body的高度,网页内容决定

vh: 网页视图高度的1/100

vw:网页视图宽度的1/100

vmax:取网页视图的width和height的最大值的1/100

vmin:取网页视图的width和height的最小值的1/100

值类型和引用类型

值类型: undefined、string、number、boolean、symbol【Symbol是JavaScript中的一种新的基本数据类型,引入自ECMAScript 6(ES6)标准。它是一种不可变且唯一的数据类型,可以用来创建独一无二的键(key)。】

引用类型:object、array、null、函数function

typeof运算符 识别所有值类型,识别函数,判断是否是引用类型

手写深拷贝 第一步:判断值类型和应用类型 第二步:判断是数组还是对象 第三步:递归(hasOwnProperty保证Key不是原型链属性)

function deepClone(obj = {}) {
    if (typeof obj !== 'object' || obj == null) {
        // obj 是 null, 或者不是对象和数组,直接返回
        return obj
    }
    // 初始化返回结果
    let result
    if (obj instanceof Array) {
        result = []
    } else {
        result = {}
    }
    
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            // 保证 key 不是原型的属性
            // 递归调用
            result[key] = deepClone(obj[key])
        }
    }
    // 返回结果
    return result
}

如何用class实现继承?

声明一个父类  然后用extends 来继承这个父类  super来传递父类声明的值

理解原型与原型链 每个class都有显示原型 prototype

每个实例都有隐式原型 proto

每个实例的隐式原型指向class的显式原型

原型链的执行规则

先找自身的_proto_如果没有 则一直找 只到找到为止

InstanceOf 这个方法 就是判断这个实例有没有在圆形链里面

作用域与闭包的理解

作用域:变量的合法使用范围;

全局作用域: window、document

函数作用域: 函数内部的作用域,函数之外不可用函数内部变量

块级作用域:const、let声明变量

自由变量:一个变量在当前作用域中使用单未被声明,则会沿作用域一级一级往上查找知道找到该变量 所有的 自由变量的查找,是在函数定义的地方,向上级作用域查找,不是在执行的地方

this理解

在class 方法中调用和箭头函数

this的取值是在执行时确定的,不是定义时候确定的

应用场景

作为普通函数 -> window

使用call、apply、bind(返回新的函数)(都可以改变this指向) -> 传入的对象

作为对象方法被调用 -> 调用的对象

在class方法中被调用 -> 实例对象

箭头函数 -> 永远取上级作用域this

event loop

js单线程运行

异步要基于回调实现

event loop就是异步回调的实现原理

Promise 初始化的时候传入的函数会立刻执行

三种状态

pending(初始化状态),resolved(成功状态),rejected(失败状态)

pending ->resolved 或 pending->rejected

变化不可逆

状态的表现

pending状态,不会触发then和catch

resolved状态,会触发后续的then回调函数

rejected状态,会触发后续的catch回调函数

reslove只会触发then的回调,不会触发catch

reject只会触发catch的回调,不会触发then

Promise的基本原理

Promise是一个类

Promise类在执行时会传入一个执行器函数,该函数会立即执行

Promise具有三种状态

Pending

Fulfilled

Rejected

Promise状态一旦确定就不可以改变,且状态只能由

Pending => Fulfilled

Pending => Rejected

状态的改变由resolve,reject两个方法改变

then方法内部做的事情是状态判断

如果是Fulfilled状态则执行成功的回调

如果是Rejected状态则执行失败的回调

Promise的链式调用需要在then方法中返回一个Promise实例

async/await 和 Promise的关系

async/await是消灭异步回调的终极武器

但和Promise并不互斥

反而,两者相辅相成(结合起来用)

执行async函数,返回的是Promise对象

await相当于Promise的then

try...catch可捕获日常,代替了Promise的catch

宏任务与微任务

宏任务: setTimeout, setInterval,Ajax, DOM事件

微任务: Promise Async await

微任务执行时机比宏任务要早

*setInterval和setTimeout的主要区别在于执行次数和执行频率。 *以下是相关介绍:12

  • 执行次数。setTimeout是延迟指定时间后只执行一次回调函数,常用于需要延迟执行的场合;setInterval则是每隔指定的时间间隔重复执行回调函数,直到被取消,常用于需要定时执行的场合。
  • 执行频率。setTimeout在指定的延迟后执行回调函数,只执行一次;setInterval每隔指定的时间间隔就执行一次回调函数,直到被取消。

此外,它们在使用场景和取消方式上也存在差异。setTimeout通常用于处理如动画延迟、按钮防抖等场景;setInterval则适用于轮播图切换、时钟更新等需要定时执行的任务。在取消方式上,setTimeout可以通过clearTimeout函数取消执行,而setInterval则通过clearInterval函数取消执行。

event loop和DOM渲染

JS是单线程的,而且和DOM渲染共用一个线程

JS执行的时候,得留一些时机供DOM渲染

当Call Stack空闲的时候,先尝试DOM渲染,再去触发Event Loop机制

DOM节点操作

获取dom节点:

documen.getElementById()

document.getElementsByClassName

document.getElementsByTagName

docuement.querySelectorAll  // css选择器

attribute // 对html属性进行修改

property  // js操作属性的一种形式   对dom元素的js变量进行修改

事件代理(也称事件委托)——基于事件冒泡

指定一个事件处理程序,就可以管理某一类型的所有事件,减少dom交互(不需要给每一个子元素都绑定监听),提高性能

优点:1.代码简洁;2.减少浏览器内存占用;3.不要滥用(常用于瀑布流子节点很多的情况)

同源策略

ajax请求时,浏览器要求当前网页和sever必须同源(安全)

同源:协议、域名、端口,三者必须一致

加载图片css js 可无视同源策略

<img src = 跨域的图片地址/>

<link href = 跨域的css地址/>

<script src = 跨域的js地址></script>

<script>可实现JSONP

跨域

所有的跨域,都必须经过sever端允许和配合

未经sever端允许就实现跨域,说明浏览器有漏洞,危险信号

手写一个ajax

function ajax(url) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest() || new ActiveXObject();
    xhr.open('GET', url, true);
    xhr.onreadystatechange = function () {
      if(xhr.readystate === 4) {
        if(xhr.status === 200) {
          resolve(JSON.parse(xhr.responseText))
        } else if (xhr.status === 404) {
          reject(new Error('404 not found'))
        }
      }
    }
    xhr.send(null)
  })
}

cookie localStorage sessionStorage的区别

cookie: 本身用于浏览器和server通讯;被“借用”到本地存储。(本身并不是被用来做存储的)。最大存储4k; 请求时会将cookie中的数据发送到服务端

localStorage和sessionStorage是HTML专门为存储而设计的,最大可存5M

localStorage数据会永久存储,除非手动清除;sessionStorage数据只存在于当前会话,浏览器关闭则清空

HTTP缓存 ① 缓存是什么?

保存资源副本并在下次请求时直接使用该副本的技术。当Web缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。

② 为什么需要缓存

减少不必要的网络请求,使得页面加载更快; 网络请求是不稳定,加大了页面加载的不稳定性; 网络请求的加载相比于cpu加载 & 页面渲染都要慢.

③ 哪些资源可以被缓存?

静态资源 js css img , 因为静态资源加上hash名打包后是不会修改的

http与https的区别:http明文加密,不安全

https加密方式:对称加密、非对称加密

https安全性验证:https证书