事件循环(Event Loop)是 JavaScript 异步编程实现的核心机制之一。它负责在同步任务执行完毕后,从任务队列中取出异步任务并执行。
JavaScript 代码分为同步任务和异步任务两种类型。同步任务直接按顺序执行;异步任务会先被放入任务队列中等待,直到 Event Loop 取出它们并执行。
在实现中,Event Loop 维护了一个任务队列,包含两类任务:宏任务和微任务。宏任务包括 I/O 回调、定时器回调等,而微任务主要是 Promise 和 async/await 生成的任务。
在执行任务时,首先会执行当前栈内的所有任务,然后查看是否有微任务,如果有则立即执行微任务,直到全部微任务都完成,再执行宏任务。这里需要注意,微任务的优先级高于宏任务。
当执行宏任务时,如果其中创建了新的任务,则将这些任务加入到任务队列中等待执行。
总体来说,JavaScript 异步编程离不开事件循环机制的支持,了解事件循环原理可以帮助开发者更好地理解和利用 JavaScript 的异步特性。
每一个函数都会被分配一个 prototype 属性,指向一个对象,此对象成为函数的原型对象,这个对象的所有属性和方法都会被构造函数所拥有
默认情况下创建函数时 函数的原型上都会添加一个属性叫做constructor,这个constructor指向当前的函数对象;
原型对象与函数对象之间的关系:你中有我 我中有你
●每一个函数都有一个 prototype 属性,指向此函数的原型对象
●每一个对象都有一个[[Prototype]]属性指向对应构造函数的原型对象
●函数的原型对象有一个 constructor 属性指向对应的构造函数
每个对象都有一个私有属性(称之为 [[Prototype]])指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象([[Prototype]]),层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节
如果一个函数被使用new操作符调用了,那么它会执行如下操作:(重点)
●p1. 在内存中创建一个新的对象(空对象);
●p2. 这个对象内部的[[Prototype]]属性会被赋值为该构造函数的prototype属性;(后面详细讲);
●p3. 构造函数内部的this,会指向创建出来的新对象;
●p4. 执行函数的内部代码(函数体代码);
●p5. 如果构造函数没有返回非空对象,则返回创建出来的新对象;
闭包(Closure)是指在 JavaScript 中,函数可以访问并操作定义在其外部作用域中的变量,即使这些变量在外部作用域已经不存在了。简而言之,闭包就是能够读取其他函数内部变量的函数。
在 JavaScript 中,每个函数都会创建一个作用域。当函数执行完毕后,通常会销毁其内部变量,释放所占用的内存。但是如果该函数返回了一个内部函数(即嵌套函数),则内部函数可以继续访问并操作外部函数内的变量。这种由内部函数形成的作用域称为闭包。
闭包的特性非常有用,可以让我们将数据私有化、实现高阶函数等。比如,通过闭包可以模拟类的行为,将一些私有属性与公有方法封装起来;还可以实现柯里化、节流、反柯里化等技术。
需要注意的是,由于闭包会长期保留对外部变量的引用,因此可能会引发内存泄漏等问题。同时,滥用闭包也容易导致代码可读性降低、性能下降等问题,应该谨慎使用。
总之,闭包是 JavaScript 中重要的编程技术之一,理解闭包可以帮助我们更好地理解和利用高级特性、提升代码品质。
回流指当页面中的元素(例如大小、位置、或内容等发生变化时)会影响到其他元素的布局,导致浏览器重新渲染整个页面的过程。重绘则是指当元素的外观(例如颜色、背景等)发生变化时,浏览器只需要重新绘制该元素的外观,而不会影响到其他元素的布局,从而避免了回流操作。因此,回流比重绘更加耗费性能。
下面是一些可能会触发回流或重绘的情况:
appendChild()
、removeChild()
、setAttribute()
操作)width
、height
、margin
等)scrollTop
、scrollLeft
、scrollTo()
等进行滚动)为了减少回流和重绘操作带来的性能损失,我们可以采取以下的措施:
document.createDocumentFragment()
创建一个文档片段,将多个子节点添加到文档片段中,再一次性地将文档片段加入到DOM中。display:none
"),以减少回流和重绘的频率。在操作完毕之后再显示元素。offsetTop/Left/Width/Height
、scrollWidth/Height
、clientWidth/Height
等)。需要注意的是,在大多数情况下,回流和重绘的优化往往需要权衡代码的可读性和执行效率之间的关系。因此,在对于性能要求不是非常高的场景下,我们应该更注重代码的可维护性和易读性,并合理使用浏览器提供的工具进行性能调优。
2023/6/11 21:57:09
响应式设计是一种为不同终端设备(如PC、手机、平板)定制网站的技术,使网站能够适应各种屏幕分辨率和设备类型,从而提供更好的用户体验。它的基本原理是根据设备屏幕宽度来自适应调整网站的布局和CSS样式表,让网站元素大小、位置、排列方式等随着屏幕大小变化而变化。
响应式设计需要考虑以下几个方面:
需要注意的是在实现响应式设计时,需要充分测试不同设备和浏览器上的效果,以保证无论何时何地用户都可以获得最佳的网站访问体验。
cSS是构建页面的重要技术之一,优化CSS可以有效地提高页面性能和用户体验。以下是几种优化CSS的方法:
通过以上的优化措施,可以让CSS样式更加高效、简洁,同时减少HTTP请求次数,缩短页面加载时间,提高页面性能和用户体验。
需要注意的是,在实际开发中,常常会出现变量数据类型模糊或不确定的情况,此时需要深入了解JavaScript的数据类型,并根据实际需求选择合适的判断方法。
JavaScript提供了本地存储的方式,包括两种:
区别:
总的来说,localStorage和sessionStorage都可以方便地在浏览器客户端保存数据,不需要像cookie一样每次发送请求时都要重复传输同样的数据,提高了网页的性能和用户体验。根据不同的需求,选择适合的本地存储方式进行数据保存。
bind
、call
和 apply
都是用来改变函数中 this
指向的方法。
其中,call
和 apply
的作用相同,都是立即调用函数,只是传参的方式略有不同:
call(fn, arg1, arg2, ...)
: 将函数以指定的对象(也就是 this
)调用,并且把函数参数逐个列举出来apply(fn, [argsArray])
: 将函数以指定的对象(也就是 this
)调用,并且把函数的参数放到一个数组中作为参数传入而 bind
则不是立即执行函数,而是创建一个新函数,将原函数中的 this
绑定到指定对象上,并返回一个新的函数。新函数被调用时,它会以绑定的 this
对象作为上下文对象,以原函数的形式被调用,后面加上绑定的参数。
实现一个 bind
方法的思路如下:
apply
或 call
改变函数执行时的 this
值,同时参数也要和绑定函数保持一致。new
关键字进行实例化的,如果是则返回当前绑定函数的实例,否则返回所需函数的执行结果。代码实现如下:
Function.prototype.myBind = function (context) {
if (typeof this !== "function") {
throw new TypeError("只有函数才能调用 bind 方法");
}
var self = this;
var args = Array.prototype.slice.call(arguments, 1);
var fNOP = function() {}
var fBound = function() {
var bindArgs = Array.prototype.slice.call(arguments);
return self.apply(this instanceof fNOP ? this : context, args.concat(bindArgs));
}
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
}
这样我们就可以使用 myBind
来代替原生的 bind
方法了。
前端工程师是一种职业,主要负责开发和维护基于Web技术的前端界面。这些前端界面包括Web网站、Web应用程序等,一般而言,前端工程师的职责涵盖了前端架构设计、网页开发、交互体验、浏览器兼容性以及对不同终端设备的适配等方面。
在当今数字化快速发展和互联网普及的时代,前端工程师职位的前景非常好。随着人们对于移动端的需求逐渐增加,一个高质量的用户体验愈发重要,也给前端工程师的职业发展带来了更多机会。同时,现代Web开发框架和技术层出不穷,让前端工程师可以更加高效地完成工作,提高了工作效率。另外,随着新技术的不断涌现和行业的变化,前端工程师需要不断学习和更新知识,开发新的技能和掌握新的技术,这也是前端工程师能够保持竞争力和不断成长的关键。
总之,前端工程师的未来充满了无限可能,需要不断学习和跟进行业的发展趋势,并不断拓展自己的技术栈和能力,从而保持自己的敏捷性和竞争力。
元素水平垂直居中的方法有如下几种:
如果元素不定宽高,那么仍然可以使用上述方法之一进行水平垂直居中,只是需要稍微修改一下具体的CSS样式。
对于Flex布局,可以使用flex-wrap: wrap;和align-content: center;来横向和纵向排列以及居中,但是需要明确元素并没有固定的宽高。
对于使用绝对定位和transform属性,可以使用left: 50% 和 top: 50%;将元素的左边界和顶部边界设置到其容器的中心点,然后通过transform: translate(-50%, -50%); 将元素在x轴和y轴方向各自移动元素宽度和高度的一半,从而实现水平垂直居中。
对于使用table和table-cell属性以及CSS Grid布局,这两种方式都能够给不定宽高的元素设置水平垂直居中的样式。在table布局中,将父容器的display设为table,子元素的display设为table-cell,然后利用vertical-align:middle来完成垂直居中,利用text-align:center来完成水平居中;在Grid布局中,将父元素的display设置为-grid,通过grid-template-columns和grid-template-rows设置网格大小,再使用justify-content和align-content将内容放置于网格的中心位置。
盒子模型是CSS布局中的一个基本概念,它描述了网页中的每个元素是如何呈现,并规定了每个元素由哪些部分组成。
盒子模型包括四个部分:content、padding、border和margin。其中content指元素的内容区域,padding是内容区域与边框之间的区域,border是位于padding之外的线条或区域,margin是位于border之外空白区域,它控制了元素与其周围元素之间的距离。
在CSS中,通过设置width、height、padding、border、margin等属性来控制盒子模型中每个部分的大小及其与其他部分之间的距离。例如,width和height属性用于设置元素的内容区域的宽度和高度,padding属性用于设置内容区域与边框之间的内边距,border-width、border-style和border-color属性用于设置边框的宽度、样式和颜色,margin用于设置元素之间的外边距。
总而言之,盒子模型为我们提供了一种统一的、标准化的方式来思考和处理CSS样式,对于设计和开发Web页面都非常重要。理解盒子模型可以帮助我们更好地控制页面元素的布局,同时也有助于提高对页面渲染行为的理解和处理能力。
@import和link都是用于引入外部CSS文件的方法,但它们有几个不同之处:
因此,总的来说,link标签是更推荐的引入外部CSS文件的方式,除非特殊需求需要使用@import。
作为AI语言模型,我并没有实际的界面操作和体验功能。但是CSS3中的许多新特性可以帮助网页设计人员更方便地实现不同的样式效果,在此给出一些例子:
总的来说,CSS3中的新特性大大丰富了样式设计的可能性,帮助Web开发者更好地呈现内容、提高用户体验
Flex布局是CSS3中的一种全新的布局方式,其核心思想是采用“弹性盒子”模型来分配元素之间的空间和对齐方式,实现动态、灵活的页面布局。
使用场景: Flex布局比较适合在不同的屏幕尺寸和组件宽高比例下保持UI的一致性,并且可以比较方便地解决水平和垂直居中问题。同时,也可以应用于各种排版场景,如导航菜单、图片展示、列表布局等。
常用属性:
总之,Flex布局在Web开发中非常实用且易于理解和使用。
BOM(Browser Object Model)即浏览器对象模型,是指描述浏览器窗口之间关系的一组API。它提供了访问和操作当前浏览器窗口的方法和属性。
常见的BOM对象包括:
总之,BOM对象提供了一系列能够访问和控制浏览器本身行为的方法和属性,可以帮助Web开发人员更加精细地控制和定制页面交互体验
目前市场上常见的浏览器内核主要有以下几种:
总之,各种浏览器内核都有自己的优势和特点,用户可以根据自己的需求和习惯社选择适合自己的浏览器使用。
事件代理(也称为事件委托)是一种常见的Web开发技巧,它利用了事件冒泡的特性,将事件处理程序添加到父级元素上,以统一管理子元素的事件响应。
具体来说,在使用事件代理时,我们通过给父元素绑定一个事件监听器,当子元素触发该事件时,由于事件冒泡的机制,事件会依次传递到父元素,从而被监听器捕获。接着,根据事件的来源对象,我们可以判断出具体是哪个子元素触发了事件,并执行对应的响应操作。
事件代理的应用场景可以举例说明:
总之,事件代理是一种高效、灵活、易维护的浏览器JavaScript开发技巧,适用于绝大多数的Web应用场景。
JavaScript内存泄漏指的是一个对象在不需要再使用它时仍然占用内存,导致系统不能及时回收这部分内存。常见的几种JavaScript内存泄漏情况有:
为避免内存泄漏,开发者应该尽可能减少使用全局变量、合理(及时)地使用闭包、正确处理DOM元素、清除定时器和解除循环引用。此外,可以使用内存分析工具,例如Chrome DevTools 和Heap Profiling来帮助发现代码中的内存泄漏问题。
同步和异步是计算机程序中经常提到的两个重要的概念,它们的主要区别在于任务的执行方式和结果获得的时间点不同。
在同步方法中,任务是按照顺序逐一执行的,每个任务必须等待上一个任务结束后才能开始执行。因此,当同步任务执行时,程序必须等待当前任务完成后才能继续执行下一个同步任务,即被阻塞(block)。同步方式会影响到程序的性能和响应速度。
相较之下,在异步方法中,任务将不按照顺序进行,而是通过回调函数(callback function)或者promise,在其他线程、进程或者后台操作中执行,不会造成程序整体的阻塞。也就是说,任务通常会立即返回一个初始状态,并在任务完成后调用注册的回调函数来处理结果。异步方式大多使用于耗时较长但又不能耽误程序的其他工作的情况。
总结一下,同步与异步的主要区别如下:
需要注意的是,虽然异步方法可以提升程序的性能和响应速度,但如果使用不当也容易出现回调地狱的情况,导致代码难以维护。因此,在实际开发中,需要根据具体的场景和需求来选择合适的方式。
Promise和async/await都是JavaScript中处理异步编程的两种方式,它们的主要区别如下:
需要注意的是,Promise 和 async/await 是同样都解决异步的问题,在具体使用中需要根据具体场景选择。以简单网络请求为例使用Promise可以减少请求成功、失败的回调函数的嵌套;使用async/await可与try…catch一起工作从而使代码结构更加清晰、易于阅读。
JavaScript是一种基于原型的语言,而不是面向对象的,它通过原型链实现继承。在JavaScript中,每一个对象都有一个内部属性[[Prototype]](或者说是__proto__
,有些浏览器未来会抛弃对这个属性的支持 ),指向它的原型(prototype)。当试图访问一个对象的属性时,如果该对象本身没有定义该属性,则会去它的原型中查找,如果还是没有找到,就一直沿着原型链往上查找,直到最顶层的Object.prototype
。
常见的 JavaScript 继承方式主要有以下几种:
1.原型链继承:利用原型链机制,让子类的原型指向父类的实例,从而实现继承。这种方式简单,但存在父类引用属性被所有子类实例共用的问题,也无法给构造函数传递参数。例如:
function Parent() {
this.name = 'parent';
};
Parent.prototype.sayHello = function() {
console.log('Hello, I am'+this.name);
};
function Child() {};
Child.prototype = new Parent();
var child1 = new Child();
child1.sayHello(); // Hello, I am parent
2.借用构造函数继承(经典继承):通过在子类构造函数中使用 call 或 apply 调用父类的构造函数,从而实现属性的继承。这种方式解决了原型链继承的问题,但不能继承父类原型链上的属性和方法。例如:
function Parent() {
this.names = ['jack', 'tom'];
};
function Child() {
Parent.call(this); //调用父类构造函数
};
var child1 = new Child();
child1.names.push('jerry');
console.log(child1.names); // ["jack", "tom", "jerry"]
var child2 = new Child();
console.log(child2.names); // ["jack", "tom"]
3.组合继承:将前两种方式结合起来,使用原型链实现父类原型属性和方法的继承,通过借用构造函数实现子类自身属性的初始化。这种方式是继承中较为常用的一种方式,并且解决了原型链继承和经典继承各自的缺陷。但还是存在不必要的父类实例化和子类原型重复的问题。例如:
function Parent() {
this.name = 'parent';
this.colors = ['red', 'blue', 'green'];
};
Parent.prototype.sayHello = function() {
console.log('Hello, I am'+this.name);
};
function Child() {
Parent.call(this); //调用父类构造函数,设置自己的实例属性
this.age = 18;
};
Child.prototype = new Parent(); //设置原型,继承父类原型属性和方法
Child.prototype.constructor = Child; //修正constructor指向
var child1 = new Child();
console.log(child1.age); //18
console.log(child1.colors); //["red", "blue", "green"]
4.原型式继承:使用 Object.create 进行继承,可以基于一个原型对象创建一个新的对象,从而实现继承。例如:
var parent = {
name: 'parent',
friends: ['A', 'B']
};
var child1 = Object.create(parent);
child1.name = 'Jack';
console.log(child1.friends); // ["A", "B"]
5.寄生式继承:在原型式继承的基础上添加代码对原型对象进行增强,然后返回当前对象的副本,实现继承并对该副本进行修改或增强。但是它跟借用构造函数模式也一样,无法做到函数复用。例如:
function createChild(obj) {
var child = Object.create(obj);
child.sayHello = function() {
console.log('Hello, I am'+this.name);
};
return child;
}
关于存储上的差别,原始数据类型直接存储在栈内存中,而引用数据类型的值实际上是存储在堆内存中,而变量中只保存了对堆内存中的地址的引用。当我们创建一个原始数据类型的变量时,存储的是实际的数据;而创建一个引用数据类型的变量时,存储的是指向实际数据的引用地址。
流体布局(Fluid layout)是一种网页设计的布局方法,旨在实现网页内容的自适应和响应式展示。相比于固定布局(Fixed layout),流体布局可以根据用户设备的屏幕尺寸和窗口大小进行动态调整,以适应不同的显示环境。
流体布局主要基于相对单位(如百分比)和弹性盒子布局(Flexbox)等技术来实现。通过设定容器和元素的宽度、高度、边距和间距等属性为相对单位,使得它们能够根据可用空间或父容器的尺寸自动调整。
使用流体布局可以让网页在不同尺寸和分辨率的设备上都能良好地呈现,并且页面元素之间的相对位置关系也能得到保持。这样,无论用户使用台式电脑、平板电脑或手机等设备访问网页,都可以获得良好的浏览体验,并避免了水平滚动条的出现。
值得注意的是,虽然流体布局可以提供更好的可适应性,但在设计和开发时需要考虑不同屏幕尺寸和设备的显示效果,以确保内容在各种情况下都能清晰可读、布局合理。
圣杯布局(Holy Grail layout)是一种常用于网页设计的三栏布局方式,其中主要内容位于中间列,而左右两侧列用于放置导航菜单、侧边栏等附加内容。
圣杯布局的目标是实现以下特点:
实现圣杯布局通常使用以下技术:
圣杯布局是一种常见且灵活的布局方式,可以用于创建具有多栏结构的网页,并在不同设备上提供良好的用户体验。
伪元素和伪类是CSS中用于选择和样式化特定元素或状态的机制,它们在用法和功能上有一些区别。
总结: 伪元素用于创建并样式化虚拟的元素,而伪类用于选择和样式化处于特定状态或位置的元素。伪元素通过双冒号(::)表示,伪类则通过单冒号(:)表示。它们在用法和功能上略有区别,但都为CSS提供了更灵活和强大的选择器机制。
小程序的生命周期是指小程序在运行过程中不同阶段触发的一系列事件和函数。以下是小程序的常见生命周期事件和函数:
onLaunch(options): 小程序初始化时触发,只会执行一次。可以在该函数中进行一些全局的初始化操作,如获取用户信息、登录等。
onShow(options): 小程序启动或从后台进入前台时触发。在该函数中可以处理小程序进入前台后的逻辑,如更新数据、重新请求接口等。
onHide(): 小程序从前台进入后台时触发。可以在该函数中保存一些数据,或进行一些清理操作。
onError(error): 小程序发生错误时触发。可以在该函数中进行错误处理和上报。
onPageNotFound(options): 小程序页面不存在时触发。可以在该函数中进行页面不存在时的处理逻辑。
onUnload(): 页面被关闭或卸载时触发。可以在该函数中进行页面的清理操作。
onPullDownRefresh(): 用户下拉刷新页面时触发。可以在该函数中处理刷新逻辑,如重新请求数据。
onReachBottom(): 页面上拉触底时触发。可以在该函数中处理加载更多数据的逻辑。
onShareAppMessage(): 用户点击分享按钮时触发。可以在该函数中返回自定义的分享信息。
onPageScroll(options): 页面滚动时触发。可以在该函数中处理页面滚动事件。
onResize(options): 页面尺寸变化时触发,如屏幕旋转时。可以在该函数中处理页面尺寸变化时的逻辑。
这些生命周期事件和函数提供了对小程序不同阶段和操作的响应和处理能力。开发者可以根据具体的需求,在对应的生命周期函数中编写相应的逻辑代码,以实现更丰富的小程序功能和交互体验。
要使用CSS绘制一个三角形,可以利用CSS的边框和尺寸来创建一个零宽度或零高度的元素,并使用边框属性来定义三角形的形状。下面是两种常见的方法:
方法一:使用边框属性
<div class="triangle">div>
.triangle {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
}
在上述代码中,通过设置元素的宽度和高度为0,然后使用边框属性来定义三角形的形状。通过调整border-left
和border-right
的宽度以及border-bottom
的宽度和颜色,可以实现不同大小和颜色的三角形。
方法二:使用伪元素
<div class="triangle">div>
.triangle {
position: relative;
width: 100px;
height: 100px;
}
.triangle::before {
content: "";
position: absolute;
top: 0;
left: 0;
border-width: 0 100px 100px 0;
border-style: solid;
border-color: red;
}
在上述代码中,通过在元素上使用伪元素::before
,并设置其边框属性来创建一个三角形。通过调整border-width
和border-color
,可以实现不同大小和颜色的三角形。
这些方法只是其中的两种常见方式,实际上还有其他方法可以使用CSS绘制三角形。具体使用哪种方法取决于实际需求和设计要求。
CSS选择器是用于选择HTML元素并为其应用样式的模式。以下是一些常见的CSS选择器:
元素选择器(Element Selector): 通过HTML元素的标签名选择元素。例如:p
选择所有元素。
类选择器(Class Selector): 通过HTML元素的class属性选择元素。以.
开头,后跟类名。例如:.highlight
选择所有class为"highlight"的元素。
ID选择器(ID Selector): 通过HTML元素的id属性选择元素。以#
开头,后跟id名。例如:#header
选择id为"header"的元素。
属性选择器(Attribute Selector): 通过HTML元素的属性选择元素。例如:[type="text"]
选择所有具有type
属性且值为"text"的元素。
后代选择器(Descendant Selector): 通过元素的后代关系选择元素。以空格分隔,例如:.container p
选择所有class为"container"的元素内的所有元素。
子元素选择器(Child Selector): 通过元素的直接子元素关系选择元素。以>
符号分隔,例如:.container > p
选择所有class为"container"的元素的直接子元素中的元素。
相邻兄弟选择器(Adjacent Sibling Selector): 选择位于同一父元素下紧接在指定元素后面的元素。以+
符号分隔,例如:h2 + p
选择紧接在元素后面的
元素。
CSS选择器的优先级决定了当多个选择器应用于同一个元素时,哪个选择器的样式将被应用。选择器的优先级由以下几个因素决定(按重要性从高到低):
内联样式(Inline Styles): 使用style
属性直接在HTML元素上定义的样式,具有最高的优先级。
ID选择器(ID Selectors): 使用ID选择器定义的样式。
类选择器、属性选择器和伪类选择器(Class Selectors, Attribute Selectors, Pseudo-class Selectors): 使用类选择器、属性选择器或伪类选择器定义的样式。
元素选择器和伪元素选择器(Element Selectors, Pseudo-element Selectors): 使用元素选择器或伪元素选择器定义的样式。
通用选择器和组合选择器(Universal Selectors, Combinators): 通用选择器(*
)和组合选择器(+
, >
, ~
)的优先级最低。
CSS具有一些特性和行为,如:
根据选择器的优先级和特定性,样式将被层叠应用。
继承性(Inheritance): 某些样式属性可以从父元素继承到子元素,如字体样式、文本颜色等。这意味着父元素上设置的样式会自动应用到子元素上,除非子元素显式地覆盖了这些样式。
优先级: 如上所述,不同类型的选择器具有不同的优先级,通过计算优先级可以确定应用的样式。
需要注意的是,选择器的特性和行为可能会因浏览器的差异而有所不同,因此在编写CSS样式时应仔细考虑选择器的使用和样式的优先级。
防抖(Debouncing)和节流(Throttling)是用于控制函数在高频率触发时执行的技术。
防抖(Debouncing): 防抖是指在事件触发后等待一段时间,如果在这段时间内没有再次触发事件,则执行该事件处理函数。如果在等待时间内又触发了该事件,则重新计时。防抖适用于处理频繁触发的事件,如浏览器窗口的调整、搜索框输入等。
节流(Throttling): 节流是指在一段时间内只允许函数执行一次。当事件触发后,函数将立即执行,然后在指定的时间间隔内忽略后续的触发。节流适用于限制函数的执行频率,如滚动事件、鼠标移动事件等。
区别:
适用场景:
需要根据具体的应用场景和需求来选择使用防抖或节流技术。
数据类型在计算机内部存储时,采用不同的表示方式。以下是几种常见数据类型的存储方式:
整数(Integer): 整数通常以二进制形式存储,使用固定长度的字节来表示。常见的整数表示方式有补码表示、无符号整数表示等。
浮点数(Floating-Point): 浮点数使用科学计数法表示,包括一个符号位、尾数和指数。常见的浮点数表示方式有单精度浮点数(32位)和双精度浮点数(64位)。
字符(Character): 字符通常使用编码方式存储,例如ASCII编码、Unicode编码等。每个字符在内存中占用一定的字节。
布尔值(Boolean): 布尔值通常以一个字节来表示,其中true通常用1表示,false用0表示。
数组(Array): 数组是一组相同类型的数据元素的集合。数组的存储方式取决于编程语言和实现方式,可以是连续的内存块,也可以是指针或引用的集合。
对象(Object): 对象通常由多个属性组成,每个属性包含一个键值对。对象的存储方式也因编程语言和实现方式而异,可以是连续的内存块,也可以是通过指针或引用相互关联的数据结构。
指针(Pointer): 指针是一种存储内存地址的数据类型,用于表示变量或数据的存储位置。
字符串(String): 字符串通常是字符序列的集合,可以使用不同的存储方式,如以null结尾的字符数组、使用指针表示的字符序列等。
以上是常见数据类型的存储方式,具体的实现方式会根据编程语言、编译器和操作系统等因素而有所不同。
在标准的屏幕上,像素(Pixel)是最小的显示单元,通常表示为整数值。因此,绘制一条精确宽度为0.5像素的直线是不可能的,因为屏幕无法显示出这样的细微细节。
在实际情况下,可以通过一些技巧来模拟绘制0.5像素宽度的线条,但效果可能会有所不同,具体取决于浏览器和设备的渲染机制。
以下是两种常见的模拟0.5像素线条的方法:
使用1像素实线和1像素透明边框:
.line {
height: 1px;
border-bottom: 0.5px solid transparent;
}
这种方法利用了边框的一半宽度可以透明显示的特性。通过设置边框宽度为0.5像素,并且将边框样式设置为实线,然后使用透明颜色,可以模拟出视觉上的0.5像素宽度的线条效果。
使用伪元素绘制半透明线条:
.line::before {
content: "";
display: block;
height: 1px;
background-color: rgba(0, 0, 0, 0.5);
}
这种方法使用伪元素(::before或::after)来创建一个具有指定高度和半透明背景颜色的元素,从而模拟出0.5像素宽度的线条。
需要注意的是,这些方法仅是通过视觉效果来模拟0.5像素宽度的线条,并不是真正的0.5像素。实际显示效果可能因浏览器、设备和屏幕分辨率的差异而有所不同。在大多数情况下,使用整数像素的线条是更可靠和精确的做法。
下面是每个单位的含义:
1rem: rem
表示相对于根元素(通常是 元素)的字体大小的单位。例如,如果根元素的字体大小设置为 16 像素,那么
1rem
就等于 16 像素。
1em: em
表示相对于当前元素的字体大小的单位。例如,如果一个元素的字体大小为 16 像素,那么 1em
就等于 16 像素。如果嵌套在另一个元素中,且父元素的字体大小为 20 像素,那么子元素中的 1em
就等于 20 像素。
1vh: vh
表示视口高度的百分比单位。视口高度是指浏览器窗口的可见区域的高度。例如,如果视口高度为 800 像素,那么 1vh
就等于 8 像素(1% * 800)。
1px: px
表示绝对长度单位像素,是显示设备上的最小可见点。一个像素的大小可以因设备的屏幕密度而有所不同。在标准屏幕上,1像素通常相当于一个物理像素,但在高密度屏幕(如Retina屏幕)上,1像素可能由多个物理像素组成。
这些单位在前端开发中常用于定义元素的尺寸、间距、字体大小等样式属性。了解每个单位的含义和用法有助于编写灵活且响应式的样式代码。
分片上传(Chunked Upload)是一种将大文件拆分成多个小块(分片)进行上传的方法。通过将文件切割为较小的块,可以提高上传的效率和可靠性,并减轻服务器和网络的负担。每个分片可以独立上传,甚至可以并发上传,而不需要等待整个文件完成。
实现分片上传可以按照以下步骤进行:
切割文件: 将待上传的文件按照指定的大小切割成多个分片。分片大小通常根据实际需求和网络情况来确定,常见的大小为几十KB到几MB。
上传分片: 将切割后的每个分片独立上传到服务器。可以使用HTTP或其他协议进行分片上传。对于每个分片,需要在上传请求中包含分片索引、总分片数和文件标识等信息,以便服务器能够正确地接收并合并分片。
服务器端接收和保存分片: 服务器端接收到每个分片后,根据分片索引和文件标识进行合并。服务器可以将每个分片暂时保存在内存或磁盘中,直到所有分片都上传完毕。
校验和合并: 在所有分片上传完成后,服务器会进行校验以确保所有分片完整无误。如果有任何分片上传失败或损坏,可以触发重试或中断上传。
完成上传: 当所有分片都上传成功且校验通过后,服务器会将分片合并为完整的文件,并将其保存到目标位置。上传完成后,可以进行一些后续的处理操作,如生成文件链接、更新数据库记录等。
分片上传的具体实现方式可以根据应用程序和技术栈的不同而有所不同。通常可以借助前端的文件API(如File API)来读取文件内容和切割分片,然后通过HTTP请求将分片上传到服务器。服务器端可以使用相应的框架或库来处理上传请求并进行分片的接收、保存和合并操作。
需要注意的是,在实现分片上传时,还需要处理并发上传的情况,确保分片按正确的顺序上传,并且服务器能够正确处理并发上传的分片。此外,还需要考虑上传过程中的断点续传、上传进度显示和错误处理等方面的需求。
请注意,具体的优化策略还需要根据项目的具体情况来确定,并进行一定的性能测试和调优。
要判断WebView是否加载完成,可以使用WebView提供的监听器来实现。下面是一种常用的方法:
java复制代码WebView webView = findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
// 页面加载完成的回调
// 在这里进行对应的操作或逻辑处理
}
});
onPageFinished
方法中,当页面加载完成时会触发回调,你可以在这里执行相应的操作。需要注意的是,Web页面的加载过程可能包含多个阶段,如页面开始加载、页面正在加载、页面加载完成等,你可以根据具体需要选择合适的回调方法来判断WebView是否加载完成。
另外,在某些情况下,WebView加载的网页可能会包含异步加载的资源(如图片、视频等),如果需要等待所有相关资源都加载完成才算完全加载完成,可以使用如下方法:
setPictureListener
方法:java复制代码webView.setPictureListener(new WebView.PictureListener() {
@Override
public void onNewPicture(WebView view, Picture picture) {
// 通过判断picture是否为null,来确定是否加载完成
}
});
onProgressChanged
方法:java复制代码webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
// 根据newProgress的变化来判断加载完成的进度
}
});
通过上述方法,你可以根据具体需求来判断WebView是否加载完成,并在适当的时机执行相应的操作。
当客户端遇到JavaScript事件失效的问题时,可以尝试以下解决方法:
Webpack是一个现代化的静态模块打包工具,它通过读取项目中的源代码并解析依赖关系,将代码和相关资源打包成最终的静态文件。在Webpack构建过程中,插件(plugins)起着至关重要的作用。
Webpack插件可以修改、优化或操纵Webpack打包过程中的各个阶段,以满足特定的需求。插件可以对模块进行转换、资源优化、环境变量注入等操作,从而扩展Webpack的功能和灵活性。
插件的原理基本如下:
总结来说,Webpack插件通过注册钩子函数,在Webpack构建过程中的各个阶段执行自定义的逻辑,从而影响构建结果。这使得开发者可以根据需要,对代码进行转换、优化或操纵构建过程,以满足特定的项目需求
定位CPU占用暴涨和内存泄露是Node服务性能调优的关键任务。下面是一些常用的方法来定位这些问题:
在定位问题后,可以根据具体情况采取相应的优化策略和调整:
如果你有一个非常大的React页面,并且希望优先加载和渲染其中的某一部分,可以考虑以下几种方法:
浏览器渲染机制是指浏览器在接收和处理HTML、CSS和JavaScript等资源时,将这些资源转化为可视化的网页页面的过程。以下是浏览器渲染的简要解析:
通过以上优化技巧,我们可以在特定场景下优先渲染某一部分内容,提高页面加载速度和用户体验。需要根据具体情况进行优化,并结合性能测试和监控来评估效果
HTTPS(Hypertext Transfer Protocol Secure)是一种通过SSL/TLS加密保护的HTTP协议,用于在网络上进行安全的通信。以下是HTTPS实现安全通信并建立通信过程的步骤:
通过以上步骤,HTTPS实现了安全通信和数据加密保护,确保了客户端和服务器之间的数据传输的安全性和完整性。这样可以有效防止网络拦截、窃听和篡改等安全威胁。
微信小程序的架构设计主要包括前端框架和后端服务组成。前端使用WXML、WXSS和JS开发,后端服务提供数据接口。
微信小程序的声明周期包括App、Page和Component三个层级的生命周期。其中,App生命周期包括onLaunch、onShow、onHide等方法;Page生命周期包括onLoad、onShow、onHide等方法;Component生命周期包括created、attached、ready等方法。
微信小程序的运行机制是基于WebView和JavaScriptCore引擎实现的。在微信客户端内部,通过WebView渲染小程序的界面,并通过JavaScriptCore引擎解析执行小程序的逻辑代码。
微信小程序的部署架构是基于微信平台的云开发能力。开发者将小程序的代码上传到微信服务器,微信服务器负责将小程序的代码分发给用户,在用户打开小程序时进行动态加载和解析。
对于性能优化方面,可以从以下几点进行优化:
客户端的首屏指的是应用程序在打开后首次展示给用户的页面。定义客户端的首屏通常可以根据业务需求和用户体验进行确定。
要监控各种时间的耗时,可以使用以下技术手段:
XSS攻击(跨站脚本攻击)是指攻击者通过在目标网页中插入恶意脚本,使其在用户浏览器中执行,从而能够窃取、篡改用户数据,甚至控制用户账号。XSS攻击通常利用未过滤或不正确转义的输入来实现。
CSRF攻击(跨站请求伪造)是指攻击者利用用户已认证过的身份,在用户毫不知情的情况下,向目标网站发送恶意请求。通过这种方式,攻击者可以执行未经授权的操作,如更改密码、发表评论等。
为了防御XSS和CSRF攻击,可以采取以下措施:
组件封装是指将一部分逻辑和功能进行抽象和封装,以便于在不同的场景和应用中复用。以下是常见的组件封装原则:
前端跨域是指在浏览器环境下,当一个网页的执行环境(源)与该网页所请求资源的服务器域名、端口或协议不一致时,会出现跨域问题。为了解决前端跨域问题,可以采用以下几种常见的解决方案:
标签的可跨域特性,通过动态创建
标签并指定请求的 URL,服务器返回经过函数封装的 JSON 数据,实现跨域数据获取。是的,我了解React Native。React Native 是一个基于React的开源框架,可以用于构建跨平台的移动应用程序。与原生开发方式相比,React Native 的主要区别在于以下几个方面:
总的来说,React Native在开发效率、跨平台和代码复用等方面具有显著优势,适合对多个平台进行开发和维护的项目,同时也需要考虑到其一些局限性,如特定平台的特性和性能要求。
对称加密和非对称加密是两种常见的加密算法,它们在加密和解密数据过程中存在一些关键区别。
HTTPS证书的作用是确保通过HTTP进行的网站通信的安全性。它使用了非对称加密算法来实现安全连接,并通过数字证书认证和验证网站的身份。HTTPS证书的主要作用包括:
为了进行小程序端的异常监控,可以考虑以下几个步骤:
异常监控可以帮助开发者及时发现和解决问题,提高小程序的稳定性和用户体验。
染色测试(Chaos Engineering)是一种用于评估系统容错性的技术。它通过有意诱发系统中的故障和异常情况,来测试系统在这些情况下的表现和可靠性。
进行染色测试的一般步骤如下:
NGINX负载均衡是一种将网络流量平衡地分发到多个服务器上的技术,以实现高可用性、提高性能和扩展性。它可以根据预定的算法和规则将传入的请求动态地转发给后端的多台服务器进行处理。
常用的NGINX负载均衡算法包括:
在面对这些挑战性项目和疑难问题时,以下方法可能有助于解决问题:
无论在哪个领域,挑战性项目和疑难问题的解决需要充分的准备、深入的思考和持久的努力。
总体来说,DOM2事件处理相比DOM0事件处理有更多的优势,而DOM3事件处理进一步扩展了事件的类型和方法。但是,由于DOM0事件处理在一些场景下的兼容性更好,所以在实际开发中也需要根据具体情况来选择不同的事件处理方式。
HTML和CSS渲染的过程一般分为三个阶段:解析、渲染和合成。下面是具体的流程:
解析HTML:浏览器首先会解析HTML,生成一颗DOM树。DOM树是由一些个体(HTML标签、CSS样式)构成的树形结构,表示整个页面的结构和层级关系。
解析CSS:浏览器接着解析CSS文件,生成一份CSSOM树。CSSOM树也是由一些个体(CSS样式)构成的树形结构,表示整个页面的样式信息。
合成:在完成DOM树和CSSOM树的解析后,浏览器就可以开始将它们合成为一颗渲染树(Render Tree),这个过程就是合成。渲染树只包含渲染网页所必须的节点,例如可见的节点,所有的CSS信息和计算后的样式属性,不可见的节点和一些不需要渲染的节点就不在渲染树中。
布局:渲染树生成后,浏览器会根据每个节点的内容、样式等信息计算其在页面中的位置和大小,这个阶段称为布局(Layout)。
绘制:最后是绘制(Painting)阶段,浏览器遍历渲染树,并依据树中节点的几何信息将所有的节点绘制出来,呈现在屏幕上。
需要注意的是,HTML和CSS渲染的过程是一个复杂的过程,可以受到很多因素的影响,并且在实际渲染中会涉及到很多细节和优化,了解渲染的基本流程可以帮助我们更好的理解页面渲染的过程,从而更好地进行前端的开发和调试。
预编译器是一种将代码预处理成标准化代码的工具。它们通过增加特性和语法来扩展普通的CSS、HTML、JS,并将这些扩展内容转换成浏览器可识别的CSS、HTML、JS代码。常见的预编译器包括Sass、Less、Stylus、Pug等。
预编译器的优点包括:
缺点则包括:
总之,预编译器在前端开发中被广泛使用,能够提高开发效率和代码质量,减少重复劳动。但也需要注意其对开发成本和调试难度的影响。
FOUC是指页面在加载时,由于CSS文件的加载顺序导致页面的样式先后变化,从而出现页面闪烁的现象。FOUC的全称是“Flash of Unstyled Content”。
要避免FOUC,我们可以采取以下几种方式:
在HTML标签上加上style="display:none"的方式,避免页面的样式变化。在JS中,我们可以使用window.onload事件,在页面元素加载完毕后再显示页面。
递归是一种在函数内部调用自身的方法,通常用来解决需要反复执行同一任务的问题,其思想是将大问题分解成小问题进行解决。
在Vue中,递归可以用于展示树形结构的数据,它通过不断递归调用相同的组件,使得数据能够依次按照树形结构展开。
<template>
<div>
<li v-for="item in list" :key="item.id">
{{ item.label }}
<tree :list="item.children"></tree>
</li>
</div>
</template>
<script>
export default {
name: "tree",
props: {
list: {
type: Array,
default: () => []
}
},
components: {
Tree: () => import('./Tree.vue') // 注册为异步组件,避免无限递归
}
};
</script>
跨域是指在同源策略下,一个网页无法向另一个网页发送请求。同源策略是一种浏览器安全策略,主要限制一个源加载的文档或脚本如何与另一个源进行交互。如果一个源包含的文档或脚本,试图向另一个源的资源发起请求,那么浏览器就会拦截这个请求。
解决跨域问题有多种方式,常见的有以下几种:
CORS(跨域资源共享):在服务端设置相应的头部信息,允许跨域访问。需要后端支持。
JSONP:利用 script 标签可以跨域请求的特性,将请求封装成 script 请求,服务器返回 JavaScript 脚本,通过回调函数的方式将数据返回到前端。只支持 get 请求。
反向代理:通过 nginx、Apache 等反向代理服务器,将前端请求转发到目标服务器,再将目标服务器返回的数据返回给前端,使得前端代码和目标服务器属于同一域名和端口。需要服务器的配置和管理。
WebSocket:建立双向通信通道,通过特定的 API 实现浏览器和服务器之间的实时数据传输。需要服务器的支持。
变量.constructor === 变量类型
Array.isArray(变量)
,返回true,则说明该变量是数组类型;反之,说明该变量不是数组类型Object.prototype.toString.call()
,返回true,则说明该变量是数组类型;反之,说明该变量不是数组类型Object.getPrototypeOf()
来判断是否为数组类型isPrototypeOf()
方法来判断是否为数组类型SPA应用就是一个web应用,可理解为:是一种只需要将单个页面加载到服务器之中的web应用程序。当浏览器向服务器发出第一个请求时,服务器会返回一个index.html文件,它所需的js,css等会在显示时统一加载,部分页面需要时加载。
优点:1:良好的交互式体验 2:良好的前后端分离模式(MVVM),减轻服务端压力。3:共用同一套后端程序代码,不用修改就可用于web界面,手机和平板等客户端设备
缺点:1.不利于SEO优化。2.不能使用浏览器自带的前进和后退功能3…首屏加载过慢。
加载慢的原因
1.网络延时问题
2.资源文件是否体积过大
3.资源是否重复发送请求加载
4.加载脚本的时候,渲染内容堵塞
解决优化方案
1.减小入口文件体积
2.静态资源本地缓存
3.第三方插件按需加载或者使用CDN引用
4.图片资源压缩
5.抽离公共组件避免重复打包
6.开启GZip压缩
7.使用SSR
总的来说,箭头函数相对于普通函数来说更加简洁,但是在某些场景下可能会有一些限制,需要根据实际情况进行选择。
1.时间复杂度O(n^2)
2.时间复杂度O(n)
原理:主要是将数组里的索引值随机打乱,然后将当前的索引值与随机变化之后的索引值互换。
(1).首先遍历的开始是从最大的索引开始,然后逐次递减;
(2).然后选取一个随机值randomIndex,这个随机值的产生是在0-len(即数组的长度)之间产生,由于这个值不能为len(因为数组的索引是从0开始的),只能为len-1,故只能向下取整Math.floor;
(3).取到随机值之后,将这个随机值对应的数组值即arr[randomIndex]赋值给当前遍历的i对应的数组值即arr[i];
3.sort 是对数组进行排序,每次从数组里面挑选两个数 进行运算。
我们利用 Math.random-0.5,这个运算的结果要么是大于0,要么是小于0.这样要么交换位置,要么不交换位置。当然大于或者小于0是随即出现的。所以数组就被随即排序了。
严格模式:当我们在开发项目时,难免会有写的不规范的js代码,当我们开启严格模式后就会提示我们当前的代码有需要改进的地方,比如定义了一个未使用的变量。
定义未使用的变量或方法、严格使用双引号、等等
Promise是原生的解决异步代码的对象,promise中有三个状态分别是pedding等待中、rejected失败、resolve成功,根据三个状态可以拿到我们的异步任务执行的结果,其中通过链式的.then回调方法中操作。
Async/await是基于promise封装的解决异步编程带来的回调地狱的终极方案,当我们呢在有很多的异步任务相互嵌套执行时就会出现,无限的层级嵌套,代码相当不清晰,async和await的出翔解决了这个问题。
CSS3 新增了很多选择器,其中一些比较常用的包括:
他们的数据类型不一样:null的数据类型为object、而undefined为undefined
他们相等于但是不恒等于,null定义的数据表示数据为空
总结来说,undefined 表示的是变量未定义或未初始化,而 null 表示变量的值为空。 需要注意的是,在条件判断时,null==undefined 返回 true,但它们的数据类型不同,所以 null === undefined 返回 false。
元素脱离文档流的方式有以下几种:
定位的方式有以下几种:
相对定位和绝对定位的区别在于,相对定位是相对于元素原来的位置进行定位,不会影响其他元素的位置,而绝对定位是相对于最近的已定位祖先元素进行定位。
固定定位和绝对定位的区别在于,固定定位是相对于浏览器窗口进行定位,不会随着滚动而移动,而绝对定位是相对于最近的已定位祖先元素进行定位,如果没有已定位的祖先元素,则相对于 html 元素定位。
渐进增强可以理解为向上兼容,一开始针对较为低版本的浏览器来构建页面,保证页面的所有基本的功能点都能实现;然后根据更高版本的浏览器设计一些在用户体验上更为良好的交互界面、追加更多的功能。
优雅降级可以理解为向下兼容,一开始就对高版本的浏览器构建功能、性能、体验都较为完美页面,然后针对低版本的浏览器进行兼容补充。
两者的区别在于:渐进增强属于从基础的页面中增加更多的功能(加);优雅降级是属于从功能丰富的页面上慢慢地减少页面的功能、用户的体验等等。
数组的解构赋值
ES6可以直接以下形式进行变量赋值
在声明较多变量时,不需要再写很多let(或var),且映射关系清晰,支持赋默认值。
扩展运算符
ES6新增的扩展运算符(…),可以轻松的实现数组和松散序列(比如集合等)的相互转换,可以取代arguments对象和apply方法,轻松获取未知参数个数情况下的参数集合。(尤其是在ES5即传统js中,arguments不是一个真正的数组,而是一个类数组的对象,但是扩展运算符的逆运算却可以返回一个真正的数组)。扩展运算符还可以轻松实现数组的复制和解构。
ES6在Array原型上新增了find()
方法,用于取代传统只能indexOf()
查找数组项目的方法,且修复了indexOf查找不到NaN的bug
此外,还新增了copyWithin()、includes()、fill()、flat()
等方法,可方便用于数组的查找,补全,和转换等。
Babel 是 JavaScript 编译器:他能让开发者在开发过程中,直接使用各类方言(如 TS、Flow、JSX)或新的语法特性,而不需要考虑运行环境,因为Babel可以做到按需转换为低版本支持的代码;Babel内部原理是将 JS 代码转换为 AST,对 AST 应用各种插件进行处理,最终输出编译后的 JS 代码。
Babel 编译流程:
Babel
默认使用 @babel/parser
将代码转换为AST
。解析一般分为两个阶段:词法分析和语法分析。
Babel
使用 @babel/traverse
提供的方法对 AST
进行深度优先遍历,调用插件对关注节点的处理函数,按需对 AST
节点进行增删改操作Babel
默认使用 @babel/generator
将上一阶段处理后的 AST 转换为代码字符串。var是全局声明,let是块级作用的,只适用于当前代码块
var变量会发生变量提升,let则不会进行变量提升
var 会造成重复赋值,循环里的赋值可能会造成变量泄露至全局
let在一个块级作用只能赋一次值,并进行当前代码块的锁区,就是说当前块只有let声明的这个变量是有用的
let在一个块级内,只能声明一个一个相同的变量名
ES6新增了字符串模板,在拼接大段字符串时,用反引号(`)取代以往的字符串相加的形式,能保留所有空格和换行,使得字符串看起来更加直观、优雅。
ES6模板字符串,允许换行和空格,读写性强
ES6在String原型上新增了includes()方法,用于取代传统只能用indexOf查找包含字符串的方法(indexOf返回-1表示没查到,不如includes()返回false更明确,语义更清晰),此外还新增了startsWith()、endsWith()、padStarts()、padEnd()、repeat()等方法,可更加方便的用于查找、补全字符串
ES2015特指在2015年发布的新一代JS语言标准,ES2015可以理解为ES5和ES6的时间分界线
ES6泛指下一代JS语言标准,包含ES2015、ES2016、ES2017、ES2018等。现阶段在绝大部分场景下,ES2015默认等同ES6。
ES5泛指上一代语言标准。
let const 定义块级作用域
箭头函数
解构赋值
扩展运算符
常见的数组的方法,伪数组
模板字符串
class类
参数设置默认值
promise
for…of for…in
当前组件