html
1.元素
块级元素: 一行一个, 可以控制宽高 ,内边距外边距, 宽度默认是父级宽度100%
行内元素: 一行很多个, 宽高无效, 左右内外边距有效 宽度默认为内容宽度撑开
行内块元素: 一行很多个有间隙, 可控制宽高, 内外边距 宽度默认为内容宽度撑开
2.localStorage、sessionStorage、cookie区别
3.网站TDK三大标签以及SEO优化
Title(标题):Title 标签用于定义网页的标题,是搜索引擎显示在搜索结果中的标题文字,同时也是浏览器标签页上显示的标题。
Description(描述):Description 标签用于定义网页的描述,是搜索引擎显示在搜索结果中的网页描述文字,帮助用户了解页面内容。
Keywords(关键词): Keywords 标签曾经被用于定义网页的关键词,但由于被滥用和误解,目前大多数搜索引擎已不再依赖于 Keywords 标签。
语义化标签是 H5 新特性,语义化标签有:<header> 定义页面的头部,<footer> 定义页面尾部,<nav> 定义导航链接,<article> 内容标签等。
css
1.如何用CSS3画一条0.5px的直线?
height: 1px;
transform: scale(0.5);
2.CSS3盒子模型:标准盒模型、怪异盒模型
box-sizing: content-box:默认值标准盒模型下盒子的大小 = content + border + padding + margin
box-sizing: border-box:border 和 padding 划归到 width 范围内,可以理解为是 IE 的怪异盒模型,怪异盒模型下盒子的大小=width(content + border + padding) + margin
3.清除浮动
- 尾部新增元素 clear: both; /* 清除两侧的浮动 */
- 父级元素增加: overflow: hidden
- 伪元素 clearfix::after { display: block; content: ""; height: 0; overflow: hidden; clear: both; } .clearfix { zoom: 1; }
4.Flex布局
5.伪元素和伪类的区别和作用?
伪元素:在内容元素的前后插入额外的元素或样式,但是这些元素实际上并不在文档中生成。它们只在外部显示可见,但不会在文档的源代码中找到它们,因此,称为“伪”元素。例如:
p::before {content:"第一章:";}
p::after {content:"Hot!";}
p::first-line {background:red;}
p::first-letter {font-size:30px;}
伪类:将特殊的效果添加到特定选择器上。它是已有元素上添加类别的,不会产生新的元素。例如:
a:hover {color: #FF00FF}
p:first-child {color: red}
6.px、em、rem 的区别?
px:像素是最常用的单位之一,用于屏幕上的精确布局。1像素等于屏幕的一个点。
em:em是基于当前元素的字体大小的单位。例如,1em等于当前元素的字体大小。
rem:rem基于根元素(html元素)的字体大小的单位。1rem等于根元素的字体大小。
%:相对于父元素的尺寸进行缩放。例如,width: 50%;会使元素的宽度是其父元素宽度的50%。
vw--vh:vw(Viewport Width)和vh(Viewport Height)分别基于视口的宽度和高度。例如,1vw等于视口宽度的1%。
JavaScript
1、JS基础类型和复杂类型
JS数据基础类型有:
String、Number、Boolean、Null、undefined五种基本数据类型,加上新增的两种ES6的类型Symbol、BigInt
JS有三种 复杂类型 (引用数据类型):
Object(对象)、Array(数组)、function(函数)
2、箭头函数与普通函数的区别?
(2) 箭头函数没有自己的this
它只会在自己作用域的上一层继承this。所以箭头函数中this的指向在它在定义时已经确定了, 之后不会改变。
(3) call()、apply()、bind()等方法不能改变箭头函数中this的指向
(4) 箭头函数没有自己的arguments对象。在箭头函数中访问arguments实际上获得的是它外层函数的arguments值。
3、null和undefined区别
undefined: 变量被声明了还没有赋值,就为undefined
null: null表示一个值被定义了,但是这个值是空值
typeof null; // 'object'
typeof undefined; // 'undefined'
4、闭包的理解?
内部函数访问外部函数的一个变量就会形成闭包
变量会一直在内存中, 持久化存储数据到内存中
function outerFunction() {
let outerVariable = '我是外部变量';
function innerFunction() {
console.log(outerVariable); // 访问外部函数的变量
}
return innerFunction;
}
- js数组放法
push:往数组尾部添加一个元素。 返回数组的长度。
unshift:往数组头部添加一个元素。返回数组的长度。
pop:从数组尾部删除一个元素。返回删除的元素。
shift:从数组头部删除一个元素。返回删除的元素。
slice(开始位置,结束位置):截取数组一部分。只有一个元素则是开始位置,直到截取全部
splice(开始位置,长度,插入元素):删除、修改数组中的一部分元素。
reverse:反转数组。返回反转后的数组。
sort:对数组的元素进行排序。返回排序后的数组。
join:把数组变成字符串。若括号里什么都不写,则默认用逗号分隔。
toString:把数组变成字符串。
split:把字符串变成数组。
concat:合并数组,并返回结果。扩展运算符也可以合并数组。
Math.min:返回数组最小值元素。
Math.max:返回数组最大值元素。
length:获取当前数组的长度。
查找方法:
indexOf:查找数组元素,返回第一个找到的元素下标,找不到返回-1。
includes: 查找数组是否包含某一元素,包含则返回 true,不包含返回 false。
for…in:遍历数组。会遍历数组内所有可枚举的属性,包括原型上的属性和方法。
forEach:遍历数组。不会生成新数组,也不改变原数组,回调函数接收三个值:( 数组的元素,索引,当前数组)
map:通过指定函数处理数组的每个元素,并返回处理后的数组。不会对空数组进行检测,不会改变原始数组。
filter:过滤,检测数组元素,并返回符合条件所有元素的数组。
some:检测数组元素中是否有元素符合指定条件,有则返回 true,若所有元素都不满足判断条件,则返回 false。
修改原数组:push、pop、shift、unshift、splice、reverse、sort、fill。
不修改原数组:slice、concat、indexOf、lastIndexOf、join、toString、filter、every、some、forEach、map、find、findIndex。
for循环和forEach有什么区别?⭐⭐
for 循环的 return 是终止循环 forEach 是返回参数。
for 循环实际上是可以使用 break 和 continue 去终止循环的,但是 forEach 不行。
forEach 不支持在循环中添加删除操作。
for 多数时候都可以使用,一般我们需要知道循环次数。而 forEach 更适合于集合对象的遍历和操作。
var、let和const的区别?
作用域 -- 变量提升 -- 重复申明 -- 是否可以改变call、apply和bind区别
1)传入参数格式的区别
call 和 bind传入的是参数是一个个传入的,用逗号分隔;apply 传入的是数组,也可以是类数组
2)执行时机的区别
call 和 apply 会立即调用,而 bind 返回的是一个改变了 this 指向的函数,你必须调用它才会被执行;
8.浅拷贝和深拷贝区别概念常见情况?
9.事件循环,Promise和async/await的详解
17、函数的防抖和节流是什么?
(1) 防抖:通过 setTimeout 的方式,在一定的时间间隔内,将多次触发变成一次触发。
(2) 节流:让一个函数无法在很短的时间间隔内连续调用,而是间隔一段时间执行,降低触发频率。
42、解决跨域的几种方法?
(1) CORS 跨域资源共享(cross-origin-resource-sharing)
服务器端对于 CORS 的支持,主要就是通过设置 Access-Control-Allow-Origin 来进行的。如果浏览器检测到相应的设置,就可以允许 Ajax 进行跨域的访问——也就是常说的服务器加请求头。前端无需做任何事情,只需要后端使用第三方模块添加响应头即可。
(2) JSONP 解决跨域
借助 script 标签不受同源策略的影响进行数据请求。动态插入 script 标签,通过 script 标签引入一个 js 文件,这个 js 文件载入成功后会执行我们在 url 参数中指定的函数,并且会把我们需要的 json 数据作为参数传入。注意:只支持 GET 请求,不过兼容性比较好,无法判断请求是否失败,安全性不高。
(3) proxy 代理转发
正向代理:借助于我们的服务器,向数据服务器发送数据;
反向代理:与正向代理类似,但是不借助于脚本,而是直接使用服务器映射 url。
55.防抖与节流的区别,并分别用代码表示 ⭐⭐
防抖:触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间。作用:防止事件连续或高频触发,让它只触发一次或者最后一次。
节流:高频事件触发,但在 n 秒内只会执行一次,所以节流会稀释函数的执行频率。作用:降低事件触发的频率,比如1s内最多执行一次。
TypeScript
TypeScript 的内置数据类型有哪些?
number:表示数字类型,包括整数和浮点数。
string:表示字符串类型,用于表示文本数据。
boolean:表示布尔类型,只有两个可能的值:true 和 false。
null: 空值。
undefined:未定义的值。
object:表示非原始类型的对象,可以是任意结构的对象。
array:表示数组类型,可用于存储多个相同类型的元素。
tuple:表示元组类型,用于表示具有固定数量和特定顺序的元素组合。
enum:表示枚举类型,用于定义一组命名的常量值。
any:表示动态类型,可以接受任何类型的值。
void:表示空类型,没有任何返回值的类型。
never:表示永远不存在的类型,通常用于表示永远不会返回的函数的返回类型。
unknown:表示未知类型,类似于 any,但对类型安全要求更严格。
vue
虚拟DOM DIFF算法
父子生命周期
父beforeCreate -> 父created -> 父beforeMount -> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父mounted
第一次页面加载会触发哪几个钩子?
beforeCreate,created,beforeMount,mounted
如果加入了 keep-alive 多两个生命周期:
activated,deactiated