📝Proxy 相较于 Object.defineProperty 有什么优势?
Object.defineProperty 详解 语法:Object.defineProperty(obj, prop, descriptor) 功能:在一个对象上定义一个新属性或修改其现有属性,并返回此对象。 参数: obj 要定义或修改属性的对象 prop 字符串或 Symbol,指定要定义或修改的属性键 descriptor 对象,指定要定义或修改的属性的描述符 通过 descriptor,可以设置 prop 指定的属性值,getter、setter 等等特性。默认情况下,Object.defineProperty 添加的属性是不可写、不可枚举和不可配置的。 属性描述符(descriptor)的语法:descriptor 有两种类型,数据描述符和访问器描述符,其只能是这两种类型之一。根据传入的属性描述符类型不同,给对象中定义或修改的属性的特性也将有所不同。因此,属性也可以分为数据属性和访问器属性。 因为 descriptor...
📝讲讲你对闭包的理解?有什么优缺点?
对闭包的理解 从 JS 作用域链的角度出发,函数外部无法访问到函数中的变量,但函数内部可以访问到其外部的变量。所谓闭包(closure),是一种在函数外部访问函数内部变量的一种方式。通常通过在函数中返回一个新函数的方式实现闭包,这个新函数中可以访问到返回它的函数中的所有执行上下文。 词法作用域:创建闭包时所在的作用域 对于以下示例,A 函数返回了 B 函数,此时 B 函数中可以访问到 A 函数中的所有执行上下文(变量等),将返回的 B 函数赋给一个变量,此时在 A 函数外也可以访问到 A 函数中定义的变量(包括为了得到 B 函数传给 A 函数的参数)。 1234567891011function A(n){ function B(){ n++; console.log(`n=${n}`) } return B;}let x = A(0);x(); // n=1x(); //...
📝说说你对 JS 中 this 指向的了解
JS 的代码执行环境分为严格模式和非严格模式,可以通过 use strict 打开严格模式,此时 JS 在语法检查上会更加严格。要讨论 JS 中的 this 指向问题,也要分为严格模式和非严格模式进行讨论。这里先讨论非严格模式下的 this 指向,然后再讨论严格模式下的不同之处,未谈到的地方默认与严格模式相同。 非严格模式下的 this 指向 函数独立调用:此时函数中的 this 指向全局对象(浏览器环境是 window,Node.js 环境是 globalThis) 函数作为对象的方法调用:此时函数中的 this 指向该对象。 函数通过 call、apply 调用:call 和 apply 方法可以用于直接调用函数,同时指定 this 和传入参数。 如果 call、apply 传入的表示 this 的参数不是对象(原始值),其会被隐式转换为对应的包装对象。 123const obj = new Object();fun_name.call(obj, param1, param2,...); // 调用 fun_name 函数,同时指定 this 为...
📝谈谈你对 JS 内存泄漏与内存溢出的理解
内存泄漏(Memory Leak)指的是程序不需要使用的内存没有被正确释放,从而导致内存占用逐渐增加,最终可能会耗尽所有可用内存。 内存泄漏即不想用的内存没被释放 内存溢出(Memory Overflow)指的是程序请求的内存超出了系统所能提供的最大限制。 内存溢出即想要申请内存却不足够 内存泄漏场景 全局变量的使用会导致内存泄漏。全局变量指的是未使用 var、let、const 声明的变量,其在整个应用程序的生命周期中始终存在。 闭包也会导致内存泄漏。闭包变量引用闭包,闭包引用其词法作用域中的变量。只要闭包变量不为 null,其相关的引用全部无法被垃圾回收。 DOM 操作可能会导致内存泄漏。如果 JS 变量存储着对 DOM 元素的引用,当对应的 DOM 元素从 document 中移除后,对应变量仍存在着对应的引用,而不是被回收。 123const element = document.getElementById("leakyElement");document.body.removeChild(element);// 但...
📝说说浏览器的缓存机制
1 缓存过程简要分析 浏览器使用缓存中的数据与将数据存入缓存中的大致流程为: 浏览器每次发起请求时,首先在浏览器缓存中查找是否存在要请求的资源及其缓存标识(浏览器缓存资源时,通常会附带相应的缓存标识)。 如果存在缓存资源及其缓存标识,则浏览器根据缓存控制策略(例如 Cache-Control 头信息)确定是否可以使用该缓存资源。 如果根据缓存控制策略不能使用缓存资源,浏览器会向服务器请求该资源。同时,如果服务器在响应中指示可以缓存该资源,则浏览器会将响应资源及其缓存标识存入浏览器缓存中。 2 浏览器的缓存策略 浏览器通过强制缓存和协商缓存这两种策略实现资源的缓存。 2.1 强制缓存 解释:当浏览器向服务器发送请求时,服务器返回资源的同时,会使用 Expires 或 Cache-Control 响应头来控制是否缓存对应的资源。其中 Expires 的优先级 < Cache-Control ...
📝谈谈你对 JS 原型链的理解
JavaScript 是一种基于原型的语言,即每个对象都拥有一个原型对象,对象通过其原型对象继承方法和属性。原型对象也有其原型对象,依次类推,就构成了原型链。当对象访问一个属性或方法后,首先需要在其本身上查找,查找不到才去其原型对象中查找,查找不到再去其原型对象的原型对象中查找,···,一直到顶层原型,即 Object 的原型对象身上去,Object 的原型对象的原型对象则为 null。这就是原型链实现继承的原理。 原型对象分为显式原型对象和隐式原型对象。函数的原型对象是显式原型对象,通过 .prototype 的方式可以访问到其原型对象。实例对象的原型对象是隐式原型对象,通过 [[Prototype]] 或 .__proto__ 的方式可以访问到其原型对象。 这里的函数指的是构造函数,class 语法的类名也可以作为这里的函数看待;这里的实例对象是由对应的函数通过 new 关键字创建的,其原型对象是一个私有属性,__proto__...
📝说一下 http 报文都有哪些东西?
HTTP 是传输超文本(实际上除了 HTML,可以传输任何类型的文件,如视频、音频、文本等)的协议,是一组用于浏览器-服务器之间数据传输的规则。 HTTP 位于 OSI 七层模型的顶层(应用层),应用程序可以在其中交换数据。HTTP 是 TCP/ICP 协议族的一部分。 HTTPS 是另一种传输协议,这里的 S 表示安全(Secure)。其与 HTTP 的区别在于,消息在传递前会被加密。 浏览器和服务器之间通过 HTTP 报文进行通信。浏览器向服务器发送请求报文,服务器返回给浏览器响应报文。解释如下。 一. 请求报文 报文结构 请求报文(request)分为四部分:请求行(request line)、请求头(request headers)、空行(blank line)、请求体(request body) 请求行:任何一个 HTTP 请求的第一行都称之为请求行,包含三部分内容:请求方法(method)、请求路径(request url)、HTTP 版本(HTTP...
📝说明 1px、1em、1rem、1vw、1vh 的区别
px 是绝对单位,em、rem、vw、vh 是相对单位 1px 表示 1 像素;1em 相当于父元素字体大小;1rem 相当于根元素(html)字体大小;1vw 相当于视口宽度的 1%;1vh 相当于视口高度的 1%。 单位(units) px em rem vw vh 相对/绝对单位 绝对 相对 相对 相对 相对 含义 像素 相对于父元素字体大小(倍数) 相对于根元素字体大小(倍数) 相对于视口的宽度(百分之 1 的倍数) 相对于视口的高度(百分之 1 的倍数) 举例 - 父元素字体大小 16px,则子元素中 1em=16px 根元素字体大小 16px,则当前元素中 1rem=16px 视口宽度为 1000px,则 1vw=10px 视口高度为 500px,则 1vh=5px 通常来说,html 元素是根元素 1 vw 相当于视口宽度的 1%;1 vh 相当于视口高度的 1%
📝谈谈你对观察者和订阅发布的理解
1. 观察者设计模式 场景引入之杂志订阅:小王想要购买一本尚未出版的杂志,他向出版社预订该杂志并提供联系方式,一旦该杂志出版,出版社就会根据小王预留的联系方式通知他可以来购买了。这个简单的场景就是一个简单的观察者模式,可以将小王扩充到任意数量的消费者,一旦某个杂志出版了,出版社就可以根据维护的订阅该杂志的消费者列表进行逐一通知。 观察者模式的解释:观察者模式定义了一种一对多的依赖关系,使得当一个对象(主题,被观察者,Subject)的状态改变时,所有依赖它的对象(观察者,Observer)都会得到通知并自动更新。观察者模式中,观察者和被观察者的关系是通过被观察者建立的。 被观察者身上必须有三个方法:添加观察者(addObserver)、删除观察者(delObserver)、通知观察者(notifyObserver)。被观察者维护一个观察者列表,使用其自身的 addObserver 和 delObserver 方法添加或删除观察者。 观察者身上必须有一个方法:更新(update)。一旦被观察者的状态改变,就会调用 notifyObserver...
📝Cookies 和 WebStorage
Cookies 和 WebStorage(包括 LocalStorage、SessionStorage)是三种常见的将数据存储在客户端的方式。在任意一个网页中打开开发者工具(F12),我们可以在 Application 选项卡的中看到 LocalStorage、SessionStorage、Cookies ——这些存储于当前域名(Current Domain)下的数据。下边我们对这三种数据存储方式进行介绍,并比较分析他们的共性与区别。 一、Cookies 1.1 简要介绍 Cookies 有一系列别名,如 HTTP Cookies、Internet Cookies、Browser Cookies、Web Cookies,这些名词指向的都是同一个含义。 Cookies 是服务器发送给浏览器的少量数据。同时,服务器端存储着该数据以及对应的用户 ID。通过 Cookie 请求头,每次浏览器发送 HTTP 请求时, Cookies 都会被自动发送给服务端。 Cookies 是以键值对(key-value)形式存储的数据。我们也可以设置 Cookies 的过期时间(expiry...