前端面试题

 1.HTML


1.前端页面有哪三层构成,分别是什么?作用是什么?

// 前端三层构成:
有三层,分别是:html、css、js,那html为dom,css是样式,js是交互

// 浏览器进程模型:
(1)浏览器是一个大进程,中包含多个进程,进程中也有很多线程。
(2)那么就拿html和css来说,是靠GUI来渲染的,那么如果要避免回流重绘,
     需要靠GPU进程完成,这样性能会好。
(3)js是靠渲染进程的渲染主线程工作的。其中包含:事件执行线程、定时器线程等等。
     而且JS线程和GUI渲染线程互斥,所以就有了js脚本的异步加载操作。

2.行内元素有哪些?块级元素有哪些? 空(void)元素有哪些?

// 行内元素
行内元素(Inline Elements)通常是文本内容的一部分,它们不会影响布局。
例如:<span>、<a>、<img>、<b>、<strong>、<em> 等。

// 块级元素
块级元素(Block Elements)占据一行,形成独立的块,可以设置宽高,影响布局。例如:
<div>、<p>、<h1>~<h6>、<ul>、<ol>、<li>、<table>、<form> 等。

// 元素之间的转换问题
display: inline;  	    // 转为行内元素      
display: inline-block; 	// 转为行内块元素
display: block;			// 转为块元素

3.怎么解决2个行内块元素中间的空白

// 出现原因:
元素被当成行内元素排版的时候,元素之间的空白符(空格、回车换行等)都会被浏览器处理,根据white-space的处理方式(默认是normal,合并多余空白),原来HTML代码中的回车换行被转成一个空白符,所以元素之间就出现了空隙。

// 解决方案:
给父元素设置font-size:0px(推荐!)

注意:如果子盒有文本,需要单独设置font-size。

4.页面导入样式时,使用link和@import有什么区别?

// 加载方式和顺序不同
(1)link标签会先加载
(2)@import会在当前样式表加载完成后再加载引入外部样式表
(3)加载顺序区别:页面被加载时,link 会同时被加载,而 @import要等到页面被加载完再加载。
	
// 权重区别不同
link 方式的样式的权重高于 @import 权重。
	
// 从属关系不同
link 属于 HTML 标签,而 @import 是 CSS 提供的。
	
// 兼容性不同
link 没有兼容性问题,@import 不兼容 ie5 以下。

5.title与h1的区别、b与strong的区别、i与em的区别?

title与h1的区别:

// 定义
title:概括了网站信息,可以告诉搜索引擎或者用户关于这个网站的内容主题是什么
h1:文章主题内容,告诉蜘蛛我们的网站内容最主要是什么

// 区别
title他是显示在网页标题上、h1是显示在网页内容上
title比h1更加的重要 (title > h1 ) ==》对于seo的了解

// 场景
网站的logo都是用h1标签包裹的	
b与strong的区别:

// 定义
b:用于设置文字加粗,但它仅仅是让文字加粗,没有语义强调。
strong:用于强调语义,且默认文字加粗,同时也向屏幕阅读器和搜索引擎表明这段文字的重要性。

// 区别
b标签只有加粗的样式,没有实际含义。
strong表示标签内字符比较重要,用以强调的。
	
题外话:为了符合css3的规范,b尽量少用,改用strong就行了。

i与em的区别:

// 定义
i: 设置字体倾斜,仅仅只是字体倾斜,没有语义强调。
em:用于强调语义,默认字体是倾斜的,同时也向屏幕阅读器和搜索引擎表明这段文字的强调重要性。

// 区别
i只是一个倾斜标签,没有实际含义。
em表示标签内字符重要,用以强调的。

// 场景
i更多的用在字体图标,em术语上(医药,生物)。

6.img标签的title和alt有什么区别?

// 表现形式不同
title: 鼠标移入到图片展示文字值
alt  : 图片无法显示时展示文字值

// SEO层面 ( alt > title )
在seo的层面上,蜘蛛抓取不到图片的内容,所以前端在写img标签的时候为了
增加seo效果要加入alt属性来描述这张图是什么内容或者关键词。

7.png、jpg、gif 这些图片格式解释一下,分别什么时候用?

// png:
	特点:png格式支持无损压缩,同样尺寸情况下,体积要比jpg/jpeg的大。
	适用场景:png格式适合保存,需要保持高质量细节和透明背景的图像,如图标、线条图、文字、Logo 等。
	
// jpg:
	特点:jpg格式支持有损压缩。
	适用场景:jpg式适合保存照片、图像和艺术作品等真实场景图像,常用于网站上发布的照片、背景图等。

// gif:
	特点:gif格式支持无损压缩和动画功能,能够保存多帧图像并以动画形式显示。
	适用场景:gif格式适合保存简单的动画、图标、表情包等图像。适用于网页上的小型动画、简单图标等。

// webp:
	特点:webp是一种由 Google 开发的图像格式,支持有损压缩和无损压缩,
         通常比 PNG 和 JPG 文件大小更小,同时保持较高的图像质量。它还支持动画和透明度。
	适用场景:webp格式适合用于网站优化和速度提升,可以帮助减小图像文件大小,提高网页加载速度。
             特别适合用于要求高速加载和移动设备访问的网页,可以有效减少网页加载时间。

五、总结:
	PNG 适合保存高质量细节和透明背景的图像
	JPG 适合保存照片和真实场景图像;
	GIF 适合保存简单的动画和图标;
	WebP 适合用于网站优化和速度提升,特别适合要求高速加载和移动设备访问的网页(存在兼容性)。

8.iframe的优点和缺点?

// 什么是iframme
用于嵌入另一个 HTML 文档或外部资源(如网页、视频、地图等)到当前页面中。

// 优点:
1.嵌入外部内容:在一个网页中,可以嵌入其他的网页。
2.独立性:内嵌的内容在 <iframe> 中运行,与主页面相互隔离,这意味着它不会受到主页面的影响。
3.简便性:使用 <iframe> 非常简单,只需提供要嵌入的资源的 URL 或相对路径即可。


// 缺点:
1.性能问题:如果滥用 <iframe>,在同一个页面中加载多个 <iframe> 可能会导致性能问题,
           因为每个 <iframe> 都需要单独加载资源。
2.可访问性问题: 内嵌内容可能导致可访问性问题,因为屏幕阅读器等辅助技术可能无法正确解释
                和浏览 <iframe> 内的内容。
3.安全性风险: 如果未谨慎处理来自不受信任源的内容,可能会存在安全风险,
              例如点击劫持(clickjacking)攻击。
4.兼容性问题:老版本浏览器不支持。

// 解决方案:
防止自己的网站被别人 iframe 嵌套
if (top != self) {
    top.location = self.location;
}

if (window !== window.top) {  
    window.top.location.href = window.location.href;  
}
//这段代码会检测页面是否被嵌套,如果是,则将页面重定向到自身。

2.CSS


1.css优先级

优先级比较:!important > 内联样式 > id > class > 标签 > 通配

2.CSS选择器有哪些?哪些属性可以继承?

1. CSS选择符:
    通配(*)
    id选择器(#)
    类选择器(.)
    标签选择器(div、p、h1...)
    相邻选择器(+)
    后代选择器(ul li)
    子元素选择器( > )
    属性选择器(a[href])
    
2. 可以继承:
		1. font 相关属性:font-size、font-weight、line-height。
		2. color:控制文本颜色。
		3. text 相关属性:text-align、text-decoration、letter-spacing、word-spacing。
		4. visibility:控制元素是否可见。
		5. cursor:指定鼠标悬停在元素上时的光标样式。
		6. list-style 相关属性:包括 list-style-type、list-style-position、list-style-image。
        
3. 不可继承属性:border、padding、margin...

3.css三角形

用边框画(border),例如:
{
		width: 0;
		height: 0;

		border-left:100px solid transparent;
		border-right:100px solid transparent;
		border-top:100px solid transparent;
		border-bottom:100px solid #ccc;
}

4.单行文本溢出

在 CSS 中,当单行文本内容超出其容器的宽度时,可以通过设置 overflow 属性来处理文本溢出的情况。常用的方法包括使用 white-space 和 text-overflow 属性。

div{
	width: 200px; /* 容器宽度 */
	white-space: nowrap; /* 不换行 */
	overflow: hidden; /* 超出部分隐藏 */
	text-overflow: ellipsis; /* 溢出部分显示省略号 */
}

5.多行文本溢出

处理多行文本溢出的情况相对复杂一些,但也可以通过 CSS 来实现。常用的方法是结合 display: -webkit-box;、-webkit-line-clamp 和 overflow: hidden;。

.text-container {
    display: -webkit-box; /* 使用弹性盒子布局 */
    -webkit-box-orient: vertical; /* 垂直方向排列 */
    -webkit-line-clamp: 3; /* 限制显示行数 */
    overflow: hidden; /* 超出部分隐藏 */
}

/* 兼容性处理 */
.text-container {
    display: -webkit-box;
    display: -webkit-webkit-flex;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

6.哪些css可以影响到层级

屏幕是一个二维平面,然而 HTML 元素却是排列在三维坐标系中,x 为水平方向,y 为垂直方向,z 为屏幕由内向外方向,我们在看屏幕的时候是沿着 z 轴方向从外向内的。由此,元素在用户视角就形成了层叠的关系,某个元素可能覆盖了其他元素也可能被其他元素覆盖;

  1. 层叠上下文 (Stacking Context)

     层叠上下文 (堆叠上下文, Stacking Context),是 HTML 中一个三维的概念。在 CSS2.1 规范中,每个元素的位置是三维的,当元素发生层叠,这时它可能覆盖了其他元素或者被其他元素覆盖;排在 z 轴越靠上的位置,距离屏幕观察者越近。

    在层叠上下文中,其子元素按照上面解释的规则进行层叠。形成层叠上下文的方法有:

     1. position 值为 absolute|relative,且 z-index 值不为 auto;
     2. position 值为 fixed|sticky;
     3. z-index 值不为 auto 的 flex 元素,即父元素属性 display: flex|inline-flex;
     4. opacity 属性值小于 1 的元素;
     5. transform 属性值不为 none 的元素;
     6. mix-blend-mode 属性值不为 normal 的元素;
     7. filter、perspective、clip-path、mask、mask-image、mask-border、motion-path 值不为 none 的元素;
     8. perspective 值不为 none 的元素;
     9. isolation 属性被设置为 isolate 的元素;
     10. will-change 中指定了任意 CSS 属性,即便你没有直接指定这些属性的值
     11. -webkit-overflow-scrolling 属性设置为 touch 的元素;
  2. 层叠等级

    层叠等级 (层叠水平, Stacking Level) 决定了在同一个层叠上下文中,元素在 z 轴上的显示的顺序;

     普通元素的层叠等级优先由其所在的层叠上下文决定;
     层叠等级的比较,只有在同一个层叠上下文元素中才有意义;
     在同一个层叠上下文中,层叠等级描述定义的是该层叠上下文中的元素在 z 轴上的上下顺序;

    另外,层叠等级并不一定由 z-index 决定,只有定位元素的层叠等级才由 z-index 决定,其他类型元素的层叠等级由层叠顺序、他们在 HTML 中出现的顺序、他们的祖先元素的层叠等级一同决定,详细的规则见下面层叠顺序的介绍。

  3. z-index

     z-index 只适用于定位的元素,对非定位元素无效,它可以被设置为正整数、负整数、0、auto,如果一个定位元素没有设置 z-index,那么默认为 auto;
     ​
     元素的 z-index 值只在同一个层叠上下文中有意义。如果父级层叠上下文的层叠等级低于另一个层叠上下文的,那么它 z-index 设的再高也没用。所以如果你遇到 z-index 值设了很大,但是不起作用的话,就去看看它的父级层叠上下文是否被其他层叠上下文盖住了。
  4. 层叠顺序:描述的是元素在同一个层叠上下文中的顺序规则,从层叠的底部开始,共有七种层叠顺序:

     1. 背景和边框:形成层叠上下文的元素的背景和边框。
     2. 负 z-index 值:层叠上下文内有着负 z-index 值的定位子元素,负的越大层叠等级越低;
     3. 块级盒:文档流中的块级、非定位子元素;
     4. 浮动盒:非定位浮动元素;
     5. 行内盒:文档流中行内、非定位子元素;
     6. z-index: 0:z-index 为 0 或 auto 的定位元素, 这些元素形成了新的层叠上下文;
     7. 正 z-index 值:z-index 为正的定位元素,正的越大层叠等级越高;
  5. 面试中 或 写面试题 的回答

     css可以影响层级的属性非常多,本身屏幕是一个二维平面,然而 HTML 元素却是排列在三维坐标系中。
     ​
     x为水平方向,y为垂直方向,z为屏幕由内向外方向。
     ​
     我们在看屏幕的时候是沿着 z 轴方向从外向内的,由此,元素在用户视角就形成了层叠的关系,某个元素可能覆盖了其他元素也可能被其他元素覆盖。
     ​
     那么元素在同一个层叠上下文中的顺序规则,从层叠的底部开始,共有七种层叠顺序:
     1. 背景和边框:形成层叠上下文的元素的背景和边框。
     2. 负 z-index 值:层叠上下文内有着负 z-index 值的定位子元素,负的越大层叠等级越低;
     3. 块级盒:文档流中的块级、非定位子元素;
     4. 浮动盒:非定位浮动元素;
     5. 行内盒:文档流中行内、非定位子元素;
     6. z-index: 0:z-index 为 0 或 auto 的定位元素, 这些元素形成了新的层叠上下文;
     7. 正 z-index 值:z-index 为正的定位元素,正的越大层叠等级越高;
     ​
     那么这里就说几个可以影响层级的css属性吧:比如:
     1. 可以给position值为absolute 或 relative的添加z-index;
     2. 也可以通过transform: translateY(-100px);
     3. opacity属性值小于 1 的元素;
     ​
     等等好多都可以做到,这里就不一一举例了。

7.对BFC的理解

是什么:BFC就是页面上一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。

1. 了解BFC : 块级格式化上下文。
2. BFC的原则:如果一个元素具有BFC,那么内部元素再怎么弄,都不会影响到外面的元素。
3. 如何触发BFC:
		3.1 float的值非none
		3.2 overflow的值非visible
		3.3 display的值为:inline-block、table-cell...
		3.4 position的值为:absoute、fixed
		......
4. 用法
		4.1 阻止相邻元素的 margin 合并
		4.2 包含浮动元素
		......

8.父子元素外边距重叠问题

经典问题:垂直外边距叠加

原因:普通文档流盒子间,只要垂直外边距直接接触,就会发生合并,合并后外边距视觉高度取两个发生合并外边距中较大者。

发生这一现象的有三种情况:相邻兄弟块元素间、父元素及其首子元素和末子元素间(没有内边距或边框把外边距分隔开)、空块级元素自身的合并。

解决办法:触发BFC就可以解决。

9.

3.JS

4.Vue

1.vue2和vue3的区别


(1)组件注册不同:vue3不需要进行组件的注册,只需导入组件即可使用。

(2)template不同:vue3支持定义多个根节点,而vue2只能有一个根节点。

(3)语法不同:vue3使用组合式API,vue2是选项式API。

(4)生命周期不同

vue2vue3
setup
beforeCreate
created
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestroyonBeforeUnmount
destroyedonUnmounted

(5)vue3新出了Suspense内置组件:Vue3 提供 Suspense 组件,允许程序在等待异步组件加载完成前渲染兜底的内容,如 loading ,使用户的体验更平滑。使用它,需在模板中声明,并包括两个命名插槽:default 和 fallback。Suspense 确保加载完异步内容时显示默认插槽,并将 fallback 插槽用作加载状态。

<tempalte>
  <suspense>
    <template #default>
      <List />
    </template>
    <template #fallback>
      <div>
        Loading...      
     </div>
    </template>
  </suspense>
</template>

vue3新出了Teleport内置组件:Vue3 提供 Teleport 组件可将部分 DOM 移动到 Vue app 之外的位置。比如项目中常见的 Dialog 弹窗。

<button @click="dialogVisible = true">显示弹窗</button>
<teleport to="body">
  <div class="dialog" v-if="dialogVisible">
    我是弹窗,我直接移动到了body标签下  </div>
</teleport>

(6)响应式原理不同:vue2基于Object.defineProperty来对数据进行劫持,而vue3使用的是ES6提供的Proxy对象。(这是因为:在vue2的响应式无法对数组或者对象进行增删改进行监听,所以vue2只能单独的提供了this.$set()方法进行处理,但是vue3使用Proxy,就无需进行特殊处理。)

(7)diff算法不同

(8)TypeScript的支持不同:vue3支持TypeScript的语法,vue2对TypeScript的支持非常差。

2.v-if和v-show的区别


v-if是控制DOM节点是否要渲染,而v-show是在DOM节点渲染的情况下,通过display来控制DOM节点的显示与隐藏,本质上v-show的开销更大,v-if的稳定性不好。

总结:v-if适用于不频繁切换的场景,而v-show适用于频繁切换的场景。

3.v-for和v-if的优先级


Vue2中v-for的优先级会更高,所以会先执行循环,再进行v-if判断,所以这样就会导致无论需不需展示这个元素,都会先遍历整个列表

但是在Vue 3中,v-for和v-if的指令不能再同时使用在同一个元素上。这是因为Vue 3引入了一项优化,即在编译阶段会根据v-if的条件进行静态分析,如果条件为假,则不会生成对应的虚拟节点,从而减少了不必要的渲染开销。而如果v-for和v-if同时存在,会导致静态分析变得困难,因此Vue 3禁止了这种用法。

总结:vue3不能将v-if和v-for写在同一个节点。

4.vue3的内置组件有哪些


新增了三个组件。

(1)vue3新出了Suspense内置组件:Vue3 提供 Suspense 组件,允许程序在等待异步组件加载完成前渲染兜底的内容,如 loading ,使用户的体验更平滑。使用它,需在模板中声明,并包括两个命名插槽:default 和 fallback。Suspense 确保加载完异步内容时显示默认插槽,并将 fallback 插槽用作加载状态。

<tempalte>
  <suspense>
    <template #default>
      <List />
    </template>
    <template #fallback>
      <div>
        Loading...      
     </div>
    </template>
  </suspense>
</template>

(2)vue3新出了Teleport内置组件:Vue3 提供 Teleport 组件可将部分 DOM 移动到 Vue app 之外的位置。比如项目中常见的 Dialog 弹窗。

<button @click="dialogVisible = true">显示弹窗</button>
<teleport to="body">
  <div class="dialog" v-if="dialogVisible">
    我是弹窗,我直接移动到了body标签下  </div>
</teleport>

(3)vue3新出了Fragment :组件可以没有根标签,内部会将多个标签包含在一个 fragment 的虚拟元素中。这个不需要自己手写,vue内部帮我们做了。

5.vue的事件修饰符有哪些,所在位置


第一类:v-model修饰符

(1).lazy(输入框聚焦、失焦时触发)

(2).number(尝试将输入框的value值转为number类型)

(3).trim(去除输入框的value值首尾空格)

第二类:事件修饰符

(1).stop(阻止事件冒泡)

(2).prevent(防止触发默认事件)

(3).capture(将默认触发方式改为捕获触发)

(4).self(只有当事件发生在目标元素自身时才会触发)

(5).once(事件只触发一次)

第三类:键盘修饰符

(1).enter(回车键触发)

(2).tab(tab键触发)

(3).delete(通过该元素需要配合v-if使用,是指DOM节点显示、隐藏时触发)

(4).esc(esc键触发)

6.vue双向数据绑定原理


在vue2:vue2数据双向绑定是由数据劫持 + 发布-订阅的模式实现的,通过object.defineProperty()来劫持对象属性的getter和setter操作,在数据变动时发布消息给订阅者,触发响应的监听回调。

在vue3:vue3使用的Proxy去劫持数据 当我们的数据发生变动时,发布消息给订阅者,触发相应的监听回调

7.v-for中的key值的作用


key值要设置一个唯一性的id,是为了确保渲染DOM的时候不会出错。因为创建DOM节点是比较消耗性能的操作,vue为了避免创建新的DOM节点,当vue发现一个节点的key值相同时,就不会创建新的DOM节点。
例如:

<template>
  <div class="root">
    <div class="item" v-for="(item, index) in list" :key="index">
      <h2>{{ item.text }}</h2>
    </div>
    <button @click="replaceData">替换数据</button>
  </div>
</template>
<script>
export default {
  data() {
    return {
      list: [
        {text: '33333'},
        {text: '66666'},
        {text: '99999'},
      ]
    }
  },
  methods: {
    replaceData() {
      this.list = [
        {text: '22222'},
        {text: '44444'},
        {text: '88888'},
      ]
    }
  }
}
</script>
<style lang="scss">
.item{ background: orange;}
</style>

                                初始化的样式

正常情况下:我们点击"替换数据"按钮此时会变成这样,很正常对吧。

特殊情况:当手动删除'66666'这个元素的DOM节点时,然后点击"替换数据"按钮,此时会变成这样子,额。。。我的44444跑哪去了? 这是因为vue发现这一批key和上一批key是一样的,就没有重新创建DOM节点,只是把内容给替换了而已。

8.mutations和actions的区别


如果方法体中涉及到异步操作,该方法需要转发给actions进行处理;
如果方法体中涉及的都是同步操作,该方法可以提交给mutations进行处理。

9.vue3新增的状态管理工具


pinia

10.css的预处理器有哪些,在vue中如何使用


css预处理器有:less、scss

以less为例:先安装less、less-loader:npm i less less-loader,

                     然后在styles标签中声明lang='less':<style lang="less">

11.vue的路由传参和接参


传参:

第一种:可以通过路径传参,把参数以"?参数1=值1&参数2=值2"的形式,放在路径后面。

//  1.查询参数传参(两种写法)
(1)this.$router.push('/home?username=长官&age=18')
(2)this.$router.push({
        path: '/home'
        query: {
            name: '张三',
            age: 18
        }
     })

//  2.动态路由传参
this.$router.push({
    path: '/home',
    params: {
        username: '思密达'
    }
})       

第二种:给路由起个名称name,通过路由的name来进行跳转,参数要看情况放。

// 1.查询参数传参
this.$router.push({
    name: '路由名称',
    query: {
        username: '思密达',
        age: 18
    }
})

// 2.动态路由传参
this.$router.push({
    name: '路由名称',
    params: {
        username: '思密达'
    }
})

接收参数:

// 1.获取查询参数传参
this.$route.query.参数名

// 2.获取动态路由传参
this.$route.params.参数名

12.watch和computed的区别

computed:是对响应式数据处理后, 返回的新的响应式数据。(带有缓存功能)

watch:是对响应式数据进行监听,可以监听普通数据类型,也可以监听对象。

13.vite的优点和特点

优点:

(1)构建速度快:运行时动态的加载依赖,避免传统构建工具的静态打包和编译。

(2)更高效的热更新:实时更新代码并预览修改效果,无需重新编译整个项目。

(3)配置简单

缺点:

(1)由于是比较新的技术,可能导致一些老的浏览器不兼容。

14.vuex的五个状态分别是什么

分别是state、mutations、actions、getters、modules。

15.vue2和vue3中v-for循环有什么区别

(1)key的不同:vue2需要手动配置key,vue3默认情况下会自动推导出唯一的key值。

(2)v-if和v-for的优先级:在vue2中v-for优先级高,在vue3中v-if优先级高。

16.自定义组件的过程

在components或者views目录下,创建一个xxx.vue文件,然后在文件内定义内容

<script setup>
// 定义组件名称
defineOptions({
  name: 'TestVue'
})
</script>

<template>
  <div class="test-container"></div>
</template>


<style lang="less" scoped>
</style>

使用组件时,vue2需要注册后使用,vue3可以直接使用组件。

17.localSorage和session的区别

localStorage:
(1)不管存进去是什么类型,读取出来的永远是字符串
(2)存储大小问题:localStorage的存储容量根据不同浏览器的不同,结果就不一样,一般为4M。

18.如果localStorage超过最大容量怎么办

方法1:压缩字符串,仍然存进localStorage

缺点:多引用一个库。

优点:压缩。

参考文章:2. lz-string【JavaScript 字符串压缩库】 - 简书

方法2:使用其他存储方式,如indexedDB,我们不是直接用indexed DB,而是用封装的库localForage

缺点:兼容性不太好,操作繁琐。

优点:存进去的是什么类型,读出来的就是什么类型。并且可以是异步的。存储量远远大于localStorage。

参考文章:https://www.cnblogs.com/Jishuyang/p/17761981.html

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值