前端八股文汇总

CSS
一、css的flex布局

弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。

display: flex; 将元素设置为 Flex 容器。

flex-direction: 定义主轴的方向(默认为 row,即水平方向)。

flex-wrap: 定义项目是否换行(默认为 nowrap,即不换行)。

align-items 弹性盒子元素在侧轴(纵轴)方向上的对齐方式。

弹性子元素属性

使用弹性盒子,居中变的很简单,只需要设置margin: auto

CSS的Flex布局(也称为Flexbox或弹性盒子布局)是一个在CSS3中引入的新的布局模式,用于在一维方向上布局、对齐和分发空间在容器中的项(items)。Flex布局特别适用于设计复杂的网页布局,因为它提供了很多在块级和行内布局模型中无法实现的功能。

Flex布局的基本概念

  1. Flex容器(Flex Container):使用display: flex;或display: inline-flex;声明的元素。
  2. Flex项(Flex Items):Flex容器的子元素自动成为Flex项。

Flex容器的属性

  • flex-direction: 定义主轴的方向(默认是水平方向,即row)。
  • flex-wrap: 定义Flex项是否应该换行(默认是nowrap,即不换行)。
  • justify-content: 定义Flex项在主轴上的对齐方式。
  • align-items: 定义Flex项在交叉轴上的对齐方式。
  • align-content: 定义多行Flex项在交叉轴上的对齐方式(当flex-wrap为wrap时有效)。

Flex项的属性

  • order: 定义Flex项的排列顺序(数字越小越排在前面,默认为0)。
  • flex-grow: 定义Flex项的放大比例,默认为0,即如果有剩余空间也不放大。
  • flex-shrink: 定义Flex项的缩小比例,默认为1,即如果空间不足将缩小。
  • flex-basis: 定义Flex项在主轴上占据的固定空间大小,默认值为auto。
二、Grid 网格
container {
  display: grid;
}//定义一个网格

.CSS Grid 网格模型是一种二维布局系统,它为Web开发人员提供了一种强大的方法来设计和实现复杂的页面布局。自从2017年成为CSS标准的一部分以来,Grid布局已经成为创建响应式、灵活的网页布局的关键技术。以下是Grid布局的一些核心概念和特性:

基础概念

  1. 容器(Grid Container):通过将一个元素的display属性设置为grid或inline-grid,该元素就变成了Grid容器。容器定义了一个网格结构,用于布局其直接子元素。
  2. 项(Grid Items):Grid容器内的子元素自动成为Grid项,它们按照Grid容器定义的布局排列。

定义网格结构

  • Grid Template Rows and Columns:使用grid-template-rows和grid-template-columns属性定义网格的行和列尺寸。可以使用长度单位、百分比、关键词(如auto、min-content、max-content)或fr单位(代表可用空间的分数)来设定尺寸。
  • Grid Gap:使用gap属性(或旧版的grid-gap、grid-row-gap、grid-column-gap)设置网格行和列之间的间距。
  • Repeat Function:repeat()函数允许你重复一个给定的轨道大小定义,比如repeat(3, 1fr)会创建三列,每列宽度为1fr。

置放网格项

  • Grid Lines:网格线定义了行和列的边界,编号从1开始。
  • Grid Areas:使用grid-template-areas属性可以定义网格区域,通过名称而不是具体的行和列坐标来放置项目,提高布局的语义性和可维护性。
  • Grid Placement:使用grid-row和grid-column属性(或简写的grid-area)可以精确控制每个Grid项在网格中的位置。也可以使用数值、关键词(如span、start、end)或命名的区域来指定位置。

特性与优势

  • 二维布局:与Flexbox(主要用于一维布局)相比,Grid布局提供了真正的二维控制,独立管理行和列。
  • 响应式设计:轻松创建适应各种屏幕尺寸的复杂布局,无需媒体查询也能实现流式布局。
三、css选择器及其权重
 

元素选择器(如 p, div): 权重为 1。

类选择器(如 .myClass): 权重为 10。

ID选择器(如 #myId): 权重为 100。

属性选择器(如 [type="text"]): 权重相当于类选择器,为 10。


元素选择器:直接通过HTML元素名来选择元素。例如,p 会选择所有的 <p> 元素。

类选择器:使用 . 符号和类名来选择元素。例如,.myClass 会选择所有带有 class="myClass" 的元素。

ID选择器:使用 # 符号和ID名来选择元素。ID在HTML文档中应该是唯一的。例如,#myID 会选择 id="myID" 的元素。

属性选择器:通过元素的属性来选择元素。例如,[target="_blank"] 会选择所有 target 属性值为 "_blank" 的元素。

四、CSS垂直居中
  1. Flexbox(弹性盒子模型):
    • 在父元素上设置 display: flex; 和 align-items: center;
.parent {  
  display: flex;  
  align-items: center; /* 垂直居中 */  
  justify-content: center; /* 水平居中 */  
  height: 200px; /* 设定父元素高度 */  
}
  1. Grid(网格布局):
    • 将父元素设置为 display: grid;,并使用 align-content: center; 或 align-items: center; 来实现垂直居中。
.parent {  
  display: grid;  
  align-items: center; /* 垂直居中 */  
  justify-items: center; /* 水平居中 */  
  height: 200px; /* 设定父元素高度 */  
}

3.使用绝对定位(position)和外边距(margin)

<div class="father">  
  <div class="left"></div>  
  <div class="center"></div>  
  <div class="right"></div>  
</div>  

<style>  
  .left, .right {  
    position: absolute;  
    height: 300px;  
    width: 200px;  
    top: 0;  
  }  
  .left {  
    left: 0;  
  }  
  .right {  
    right: 0;  
  }  
  .center {  
    margin: 0 200px;  
    height: 300px;  
  }  
</style>
五、内联样式的优先级

内联样式(Inline Styles)具有最高的优先级,内联样式直接作用于元素本身

通过在HTML元素的style属性中直接定义CSS规则来实现的,例如:

<p style="color: red;">这段文字将会是红色。</p>
六、盒模型以及种类 Box Model

这个盒子由以下几个部分组成:

  1. 内容区域(Content):这是元素实际包含的内容,如文本、图片或其它嵌套的元素。
  2. 内边距(Padding):围绕在内容区域外部的空白区域,可以设置上下左右不同的内边距值,控制内容与边框的距离。
  3. 边框(Border):围绕内边距和内容的可选线条,可以设定样式、宽度和颜色。
  4. 外边距(Margin):位于边框之外的空白区域,用于控制元素与其他元素之间的距离,同样可以分别设置上下左右的外边距。

1. W3C标准盒模型(Standard Box Model)

  • 在此模型中,元素的总宽度(或高度)由内容宽度(或高度)、内边距、边框宽度共同决定,外边距不计入元素的总尺寸内。
  • 计算公式为:总宽度 = width + padding(左右) + border(左右) + margin(左右)。
  • 可以通过CSS的box-sizing: content-box;来指定使用此模型,这是默认行为。

2. IE盒模型(Quirks Mode Box Model)或怪异盒模型

  • 在此模型中,元素的指定宽度(或高度)包含了内容宽度(或高度)、内边距和边框宽度。
  • 计算公式为:总宽度 = width(已含padding和border)+ margin(左右)。
  • 使用box-sizing: border-box;
七、三列布局

三列布局是一种常见的网页布局方式,其主要特点是将网页内容分为三个部分,左右两列固定宽度,中间一列自适应宽度。

1. 使用浮动(Floats)

浮动是最传统的布局技术之一,通过将左右两侧栏设置为浮动元素,并让中间内容区域自然环绕它们。

1.left-column {
  2  float: left;
  3  width: 25%;
  4}
5.main-content {
  6  float: left;
  7  width: 50%;
  8}
9.right-column {
  10  float: right;
  11  width: 25%;
  12}

.container {
  overflow: auto; /* 或者使用clearfix技术来包含浮动 */
}

.left {
  float: left;
  width: 200px; /* 左侧栏宽度 */
}

.right {
  float: right;
  width: 200px; /* 右侧栏宽度 */
}

.main {
  margin: 0 200px; /* 左右留出侧边栏宽度 */
}

2. 使用Flexbox(弹性盒子)

Flexbox提供了一种更现代、灵活的方式来布局元素,特别适合创建响应式设计。

1.container {
  2  display: flex;
  3}
4.left-column, .right-column {
  5  flex: 1;
  6}
7.main-content {
  8  flex: 2;
  9}
.container {
  display: flex;
}

.left, .right {
  flex: 0 0 200px; /* 固定宽度 */
}

.main {
  flex: 1; /* 自适应宽度 */
}

3. 使用Grid(网格)

CSS Grid布局是一种二维布局系统,非常适合创建多列布局。

.container {
  display: grid;
  grid-template-columns: 200px 1fr 200px; /* 两侧固定宽度,中间自适应 */
}

.left {
  grid-column: 1;
}

.right {
  grid-column: 3;
}

.main {
  grid-column: 2;
}
JS
一、js数据类型

1、基本数据类型

String布尔,整数,浮点数

2、对象类型(Object Types)

允许你将多个值作为单个实体来引用。JavaScript中的大多数内容都是对象,包括函数、数组、日期等。

  1. Object:JavaScript中的对象是一组无序的属性集合,每个属性都有一个名字和一个值。属性的名字是字符串,而值可以是任何数据类型。
  2. Array:数组是一种特殊的对象,用于存储多个有序的值。数组中的每个值(通常称为元素)都有一个索引,用于在数组中访问该元素。
  3. Function:函数也是对象,它们可以被赋值给变量、作为参数传递或作为返回值。函数用于执行特定的任务或计算,并可能返回一个值。
  4. Date:日期对象用于处理日期和时间。
  5. RegExp:正则表达式对象用于匹配、替换或测试字符串。
  6. Error 和其子类(如 TypeError、ReferenceError 等):用于表示和处理错误。
二、js中,this关键字

1. 全局上下文中的this

在全局上下文中(不在任何函数内部),this 引用的是全局对象。

2. 函数上下文中的this

  • 直接调用:如果函数是直接被调用的,那么 this 指向全局对象
  • 作为对象的方法调用:如果函数是对象的一个属性,并通过该对象被调用,那么 this 指向该对象。
  • 使用call、apply或bind方法调用:这些方法允许你显式地设置函数执行时的 this 值。

3. 箭头函数中的this

箭头函数不绑定自己的 this,this 的值继承自包围它的函数或全局对象。这使得箭头函数在需要引用外部 this 的回调函数中特别有用。

const obj = {  
  name: 'Bob',  
  greet: function() {  
    setTimeout(() => {  
      console.log(this.name); // 'Bob'  
    }, 1000);  
  }  
};  
obj.greet();

4. 构造函数中的this

在构造函数中,this 引用新创建的对象实例。

三、bind,call,apply的区别

返回值: call() 和 apply() 直接返回函数执行的结果,而 bind() 返回一个改变了this上下文的新函数,这个新函数可以再传入其他参数后执行。

参数书写方式不同

  • call()的第一个参数是this要指向的对象,后面传入的是参数列表,参数可以是任意类型;
  • apply():第一个参数是this要指向的对象,第二个参数是数组
  • 参数传递: call() 接受单独列出的参数,apply() 接受一个参数数组,而 bind() 既可以接受单独列出的参数也可以接受数组,但不会立即执行。
//例如:
var obj = {}//定义一个空的对象
function f(x,y){
console.log(x,y)
console.log(this) //this是指obj
}
f.apply(obj,[1,2]) //后面的值需要用[]括起来
f.call(obj,1,2) //直接写
四、ES6新特性,主要数组方法的使用以及区别
Array.from()
  • 用途: 将类数组对象(具有length属性和索引元素)或可迭代对象转换为真正的数组。
  • 用法:
const arrayLike = {0: 'a', 1: 'b', length: 2};
const arr = Array.from(arrayLike); // ['a', 'b']

Array.of()

  • 用途:创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。
  • 示例
const array = Array.of(1, 2, 3); // [1, 2, 3]
  1. find()
    • 用途:返回数组中满足提供的测试函数的第一个元素的值。否则返回undefined。
  1. findIndex()
    • 用途:返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。
五、js异步Promiase

一个 Promise 对象代表一个最终可能完成(也可能被拒绝)的异步操作及其结果值。它有以下状态:

  • Pending(待定):初始状态,既不是成功,也不是失败状态。
  • Fulfilled(已实现):意味着操作成功完成。
  • Rejected(已拒绝):意味着操作失败。

Promise 的使用

一个 Promise 对象可以通过调用 new Promise(executor) 来创建,其中 executor 是一个函数,它接受两个参数:resolve 和 reject。这两个函数都是 Promise 构造函数提供的,分别表示异步操作成功或失败时的回调函数。

链式调用:Promise支持链式调用,即.then()和.catch()方法,用于注册fulfilled状态和rejected状态的回调函数

const promise = new Promise((resolve, reject) => {  
  setTimeout(() => {  
    // 模拟异步操作,例如网络请求  
    if (/* 请求成功 */) {  
      resolve('操作成功!');  
    } else {  
      reject(new Error('操作失败!'));  
    }  
  }, 1000);  
});  

// 使用 .then() 处理成功的情况  
// 使用 .catch() 处理失败的情况  
promise.then(result => {  
  console.log(result); // 输出:操作成功!  
}).catch(error => {  
  console.error(error); // 如果失败,输出错误信息  
});
六、var,let,const区别

var, let, 和 const 都是JavaScript中用于声明变量的关键字

1. 作用域

  • var: 具有函数作用域或全局作用域。如果在函数外部使用var声明变量,它会成为全局变量。即使在块级结构(如if语句或for循环)中声明,var变量也会被提升至包含它的函数或全局作用域。
  • letconst: 只在声明它们的块(例如循环体、条件语句块等)中有效。

2. 变量提升(Hoisting)

  • var: 存在变量提升现象,变量可以在声明之前使用,此时变量的值为undefined。
  • letconst: 不会发生变量提升。在声明之前访问它们会导致引用错误

3. 重复声明

  • var: 允许在相同作用域内重复声明同一个变量,这可能会导致意外的行为。
  • letconst: 在相同作用域内不允许重复声明,尝试这么做会导致语法错误。

4. 变量的可变性

  • varlet: 声明的变量是可变的,即可以在声明后改变其值。
  • const: 声明的是常量,一旦赋值后就不能再修改。
Vue
一、用vue开发和正常开发有什么区别
  1. 组件化开发
    • Vue强调组件化开发,即将一个大型的应用拆分成多个小的、可复用的组件。这使得代码更加模块化、可维护性更强。
    • 传统开发中,开发者可能会将HTML、CSS和JavaScript混合在一起,导致代码难以维护。而Vue通过组件化的方式,使得代码结构更加清晰,易于理解和复用。
  1. 数据绑定与响应式更新:
    • Vue: 使用Vue的核心特性——数据绑定,开发者只需关注数据模型,Vue会自动处理数据变化到视图的更新,实现双向绑定(Vue 2中通过v-model指令)或单向数据流(Vue 3推荐)。这与传统开发中手动操作DOM来同步数据变化形成了鲜明对比。
    • 传统开发: 在没有框架的情况下,开发者必须手动编写JavaScript来监听数据变化,并相应地修改DOM,这既繁琐又容易出错。
  1. 路由管理与状态管理:
    1. Vue: 通过Vue Router可以轻松管理页面路由,Vue的状态管理库Vuex则帮助管理全局状态,使状态变更更加集中和可预测。
    2. 传统开发: 路由和状态管理往往需要自己实现,缺乏标准化解决方案,容易导致混乱和错误
二、Vue 3 的生命周期有哪些
  1. 创建阶段
    • setup(): Vue 3 中,setup() 函数替代了 Vue 2 中的 beforeCreate 和 created 钩子。它会在 beforeCreate 和 created 之前执行,此时组件实例尚未被创建,但可以通过 setup() 函数的参数访问 props 和 context。在这个阶段,可以创建响应式数据、计算属性和方法等。
  1. 挂载阶段
    • onBeforeMount(): 组件即将被挂载到 DOM 之前调用。此时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。
    • onMounted(): 组件挂载到 DOM 后调用。
  1. 更新阶段
    • onBeforeUpdate(): 组件即将因为响应式状态变更而更新其 DOM 树之前调用。此时,你可以访问到更新前的 DOM,但组件实例的响应式状态还未更新。
    • onUpdated(): 组件更新后调用。此时,组件 DOM 已经更新,你可以访问到更新后的 DOM。
  1. 卸载阶段
    • onBeforeUnmount(): 组件即将被卸载之前调用。在这个阶段,可以执行清理任务,如取消定时器、解绑全局事件等。
    • onUnmounted(): 组件卸载后调用。此时,组件实例已经被销毁,无法再访问到组件的状态和 DOM。
三、vue3的computed

computed又被称作计算属性,用于动态的根据某个值或某些值的变化,来产生对应的变化。

在Vue 3中,你不再直接在组件的选项API中定义 computed 属性,而是通过 setup() 函数内使用 computed() 方法来定义计算属性。computed() 接受一个 getter 函数作为参数,并返回一个可读写的计算属性。

computed ()接受一个 getter 函数,返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。

四、vue路由设置

router的文件夹,并在其中创建一个index.js文件来配置路由。在这个文件里,你会定义各个路由及其对应的组件:

// src/router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeComponent from '../components/HomeComponent.vue'
import AboutComponent from '../components/AboutComponent.vue'

Vue.use(VueRouter)

const routes = [
  { path: '/', component: HomeComponent },
  { path: '/about', component: AboutComponent }
]

export default new VueRouter({
  mode: 'history', // 使用history模式去除URL中的#
  routes
})

在你的主入口文件(通常是src/main.js)中引入并使用Vue Router:

// src/main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router' // 引入路由

Vue.config.productionTip = false

new Vue({
  router, // 将路由器注入Vue实例
  render: h => h(App),
}).$mount('#app')

在Vue组件中,你可以使用<router-link>来创建导航链接,并用<router-view>来展示根据当前路由匹配的组件:

<!-- 在App.vue或其他组件中 -->
<template>
  <div id="app">
    <router-link to="/">首页</router-link>
    <router-link to="/about">关于我们</router-link>
    <router-view></router-view> <!-- 路由出口 -->
  </div>
</template>
当谈到前端面试题八股文时,以下是一些常见的问题及其答案: 1. 简要介绍一下前端开发的基本工作流程。 前端开发的基本工作流程包括需求分析、界面设计、编码实现、调试测试和部署上线。 2. 请解释一下浏览器的工作原理。 浏览器的工作原理主要包括四个步骤:解析HTML生成DOM树、解析CSS生成CSSOM树、合并DOM树和CSSOM树形成渲染树、将渲染树绘制到屏幕上。 3. 什么是跨域?如何解决跨域问题? 跨域是指在同源策略限制下,不同域之间进行资源请求或数据传输的过程。解决跨域问题可以通过代理服务器、JSONP、CORS等方式。 4. 请解释一下闭包的概念及其使用场景。 闭包是指函数可以访问和操作其词法作用域外的变量。闭包常用于创建私有变量、实现模块化等场景。 5. 请简要解释一下事件冒泡和事件捕获。 事件冒泡是指事件从最具体的元素开始触发,然后逐级向上传播至最不具体的元素。事件捕获则相反,是从最不具体的元素开始触发,然后逐级向下传播至最具体的元素。 6. 请解释一下防抖和节流函数的作用及其区别。 防抖函数用于减少触发频率,延迟执行函数。节流函数用于控制函数执行频率,限制单位时间内函数的执行次数。区别在于防抖函数在最后一次触发后会等待一段时间再执行,而节流函数在单位时间内只执行一次。 7. 请解释一下SPA(单页应用)的概念。 SPA是指通过动态加载页面内容并使用前端路由实现页面切换的一种应用模式。整个应用只有一个HTML页面,通过Ajax等技术加载数据并更新页面内容。 这些问题只是前端面试题八股文的一小部分,你可以通过阅读相关的面试题和经验总结来进一步准备。记住,在面试中除了回答问题,也要展示自己的项目经验和解决问题的能力。祝你好运!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值