前端300道常见面试题,前端找工作必备_前端面试题(1),2024年最新Web前端电话面试技巧

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

}
return inner;
}
outer()();

109、javascript 中的垃圾回收机制?

答: 在 Javascript 中,如果一个对象不再被引用,那么这个对象就会被 GC 回收。如果两个对象互相引用,而不再 被第 3 者所引用,那么这两个互相引用的对象也会被回收。因为函数 a 被 b 引用,b 又被 a 外的 c 引用,这就是为什么 函数a 执行后不会被回收的原因。

110、看题做答:

function f1(){
var tmp = 1; this.x = 3;
console.log(tmp); //A console.log(this.x); //B
}

var obj = new f1(); //1
console.log(obj.x) //2
console.log(f1()); //3
分析:
这道题让我重新认识了对象和函数,首先看代码(1),这里实例话
化了 f1 这个类。相当于执行了 f1 函数。所以这个时候 A 会输出 1, 而 B 这个时候的 this 代表的是 实例化的当前对象 obj B 输出 3.。 代码(2)毋庸置疑会输出 3, 重点 代码(3)首先这里将不再是一个类,它只是一个函数。那么 A 输出1, B 呢?这里的 this 代表的其实就是 window 对象,那么 this.x 就是一个全局变量 相当于在外部 的一个全局变量。所以 B 输出 3。最后代码由于 f 没有返回值那

么一个函数如果没返回值的话,将会返回 underfined ,所以答案就是 : 1, 3, 3, 1, 3, underfined 。

111、下面输出多少?

var o1 = new Object();
var o2 = o1;
o2.name = “CSSer”;
console.log(o1.name);
如果不看答案,你回答真确了的话,那么说明你对 javascript 的数据类型了解的还是比较清楚了。js 中有两种数据类型,分别是:基本数据类型和引用数据类型
(object Array)。对于保存基本类型值的变量,变量是按值访问的, 因为我们操作的是变量实际保存的值。对于保存引用类型值的变量,变量是按引用访问的,我们操作的 是变量值所引用( 指向)的对象。答案就清楚了: //CSSer;

112、再来一个

function changeObjectProperty (o) { o.siteUrl = “http://www.csser.com/”; o = new Object();
o.siteUrl = “http://www.popcg.com/”;
}
var CSSer = new Object(); changeObjectProperty(CSSer); console.log(CSSer.siteUrl); //
如果 CSSer 参数是按引用传递的, 那么结果应该是"http://www.popcg.com/“,但实际结果却仍是"http://www.csser.com/”。事实是这 样的:在函数内部修改了引用类型值的参数,该参数值的原始引用保持不变。我们可 以把参数想象成局部变量,当参数被重写时,这个变量引用的就是一个局部变量,局 部变量的生存期仅限于函数执行的过程中,函数执行完毕,局部变量即被销毁以释放 内存。
(补充:内部环境可以通过作用域链访问所有的外部环境中的变量对象,但 外部环境无法访问内部环境。每个环境都可以向上搜索作用域链,以查询变量和函数 名,反之向下则不能。)

113、输出多少?

var a = 6;

setTimeout(function () {
var a = 666;//由于变量 a 是一个局部变量alert(a); // 输出 666,
}, 1000);
a = 66;
因为 var a = 666;定义了局部变量 a,并且赋值为 666,根据变量作用域链, 全局变量处在作用域末端,优先访问了局部变量, 从而覆盖了全局变量 。

var a = 6; setTimeout(function () {
//变量声明提前
alert(a); // 输 出 undefined var a = 666;
}, 1000);
a = 66;

因为 var a = 666;定义了局部变量 a,同样覆盖了全局变量,但是在 alert(a);之前a 并未赋值,所以输出 undefined。

记住: 异步处理,一切 OK 声明提前

114、输出多少?

function setN(obj){
obj.name=‘屌丝’;
obj = new Object();

obj.name = ‘腐女’;
};
var per = new Object(); setN(per);
alert(per.name); //屌丝 内部

115、JS 的继承性

window.color = ‘red’;
var o = {color: ‘blue’}; function sayColor(){
alert(this.color);
}
考点:1、this 的指向
2、call 的用法sayColor(); //red
sayColor.call(this); //red this 指向的是 window 对象sayColor.call(window); //red
sayColor.call(o); //blue

116、精度问题: JS 精度不能精确到 0.1 所以 。。。。同时存在于值和差值中
var n = 0.3,m = 0.2, i = 0.2, j = 0.1;
alert((n - m) == (i - j)); //false alert((n-m) == 0.1); //false
alert((i-j)==0.1); //true

117、加减运算

alert(‘5’+3); //53 string alert(‘5’+‘3’); //53 string alert(‘5’-3); //2 number alert(‘5’-‘3’); //2 number

118、什么是同源策略?

指: 同协议、端口、域名的安全策略,由网景(Netscape)公司提出来的安全协议!

119、call 和 apply 的区别是什么?

参数形式不同,call(obj, pra, pra)后面是单个参数。apply(obj, [args]) 后面是数组。

120、为什么不能定义 1px 左右的 div 容器?

121、结果是什么?

function foo(){
foo.a = function(){alert(1)}; this.a = function(){alert(2)}; a = function(){alert(3)};
var a = function(){alert(4)};
};
foo.prototype.a = function(){alert(5)}; foo.a = function(){alert(6)};
foo.a(); //6
var obj = new foo(); obj.a(); //2
foo.a(); //1

122、输出结果

var a = 5; function test(){
a = 0;
alert(a);
alert(this.a); //没有定义 a 这个属性var a;
alert(a)

}
test(); // 0, 5, 0
new test(); // 0, undefined, 0 //由于类它自身没有属性 a, 所以是 undefined

123、计算字符串字节数:

new function(s){
if(!arguments.length||!s) return null;
if(“”==s) return 0; //无效代码,因为上一句!s 已经判断过var l=0;
for(var i=0;i<s.length;i++){
if(s.charCodeAt(i)>255) l+=2; else l+=1; //charCodeAt()得到的是 unCod

} //汉字的 unCode 码大于 255bit 就是两个字节alert(l);
}(“hello world!”);

124、结果是:

var bool = !!2; alert(bool);//true;

技巧:双向非操作可以把字符串和数字转换为布尔值。

125、声明对象,添加属性,输出属性

var obj = {
name: ‘leipeng’, showName: function(){
alert(this.name);
}
}
obj.showName();

126、匹配输入的字符:第一个必须是字母或下划线开头,后面就是字母和数字或者下划线构成,长度 5-20

var reg = /1[a-zA-Z0-9_]{4,19}/,

name1 = ‘leipeng’,
name2 = ‘0leipeng’,
name3 = ‘你好 leipeng’,
name4 = ‘hi’;

alert(reg.test(name1)); alert(reg.test(name2)); alert(reg.test(name3)); alert(reg.test(name4));

127、检测变量类型

function checkStr(str){
typeof str == ‘string’? alert(‘true’):alert(‘false’);
}
checkStr(‘leipeng’);

128、如何在 HTML 中添加事件,几种方法?

1、标签之中直接添加 οnclick=“fun()”; 2、JS 添加 Eobj.onclick = method;
3、现代事件 IE9 以前: obj.attachEvent(‘onclick’, method);

标准浏览器: obj.addEventListener(‘click’, method, false);

129、BOM 对象有哪些,列举 window 对象?

1、window 对象 ,是 JS 的最顶层对象,其他的 BOM 对象都是 window 对象的
属性;

2、document 对象,文档对象;

3、location 对象,浏览器当前 URL 信息; 4、navigator 对象,浏览器本身信息;
5、screen 对象,客户端屏幕信息;

6、history 对象,浏览器访问历史信息;

130、请问代码实现 outerHTML
//说明:outerHTML 其实就是 innerHTML 再加上本身; Object.prototype.outerHTML = function(){
var innerCon = this.innerHTML, //获得里面的内容
outerCon = this.appendChild(innerCon); //添加到里面alert(outerCon);

}

演示代码:

<!doctype html>

Document

hello

131、JS 中的简单继承 call 方法!

//顶一个父母类,注意:类名都是首字母大写的哦! function Parent(name, money){
this.name = name; this.money = money; this.info = function(){
alert('姓名: ‘+this.name+’ 钱 : '+ this.money);
}
}

//定义孩子类
function Children(name){
Parent.call(this, name); //继承 姓名属性,不要钱。this.info = function(){
alert('姓名: '+this.name);
}
}
//实例化类
var per = new Parent(‘parent’, 800000000000); var chi = new Children(‘child’);
per.info();
chi.info();

132、bind(), live(), delegate()的区别

bind: 绑定事件,对新添加的事件不起作用,方法用于将一个处理程序附加到每个匹配元素的事件上并返回 jQuery 对象。
live: 方法将一个事件处理程序附加到与当前选择器匹配的所有元素( 包含现有的或将来添加的) 的指定事件上并返回 jQuery 对象。
delegate: 方法基于一组特定的根元素将处理程序附加到匹配选择器的所有元素(现有的或将来的)的一个或多个事件上。

最佳实现:on() off()

133、typeof 的返回类型有哪些?

alert(typeof [1, 2]); //object alert(typeof ‘leipeng’); //string var i = true;
alert(typeof i); //boolean
alert(typeof 1); //number
var a;
alert(typeof a); //undefined
function a(){;}; alert(typeof a) //function

134、简述 link 和 import 的区别?

区别 1:link 是 XHTML 标签,除了加载 CSS 外,还可以定义 RSS 等其他事务;@import 属于 CSS 范畴,只能加载 CSS。
区别 2:link 引用 CSS 时,在页面载入时同时加载;@import 需要页面网页完全载入以后加载。
区别 3:link 是 XHTML 标签,无兼容问题;@import 是在 CSS2.1 提出的,低版本的浏览器不支持。
区别 4:link 支持使用 Javascript 控制 DOM 去改变样式;而@import 不支持。

135、window.onload 和 document.ready 的区别?

load 要等到图片和包含的文件都加在进来之后执行;

ready 是不包含图片和非文字文件的文档结构准备好就执行;

136、 解析 URL 成一个对象?

String.prototype.urlQueryString = function(){ var url = this.split(‘?’)[1].split(‘&’),
len = url.length;

this.url = {};
for(var i = 0; i < len; i += 1){ var cell = url[i].split(‘=’),
key = cell[0], val = cell[1];
this.url[‘’+key+‘’] = val;
}
return this.url;
}
var url = ‘?name=12&age=23’; console.log(url.urlQueryString().age);

137、看下列代码输出什么?

var foo = “11”+2-“1”; console.log(foo); console.log(typeof foo);
执行完后 foo 的值为 111,foo 的类型为 Number。

138、看下列代码,输出什么?

var a = new Object(); a.value = 1;
b = a; b.value = 2;
alert(a.value);
执行完后输出结果为 2

139、已知数组 var stringArray = ["This”, "is”, "Baidu”, "Campus”], Alert 出”This is Baidu Campus”。

答案:alert(stringArray.join(" "))

140、已知有字符串 foo=“get-element-by-id”,写一个 function 将其转化成驼峰表示法"getElementById"。

答 案 :function combo(msg){ var arr = msg.split(“-”);
var len = arr.length; //将 arr.length 存储在一个局部变量可以提高 for 循环效

for(var i=1;i<len;i++){ arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}
msg=arr.join(“”); return msg;
}

141、怎样添加、移除、移动、复制、创建和查找节点

1)创建新节点
createDocumentFragment() //创建一个 DOM 片段createElement() //创建一个具体的元素createTextNode() //创建一个文本节点
2)添加、移除、替换、插入appendChild() //添加removeChild() //移除replaceChild() //替换insertBefore() //插入

3)查找
getElementsByTagName() //通过标签名称getElementsByName() //通过元素的 Name 属性的值getElementById() //通过元素 Id,唯一性

142、原生 JS 的 window.onload 与 Jquery 的$(document).ready(function(){}) 有什么不同?

window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行。
$(document).ready()是 DOM 结构绘制完毕后就执行,不必等到加载完毕。

143、你如何优化自己的代码?

代码重用
避免全局变量(命名空间,封闭空间,模块化 mvc…) 拆分函数避免函数过于臃肿:单一职责原则
适当的注释,尤其是一些复杂的业务逻辑或者是计算逻辑,都应该写出这个业务逻辑 的具体过程
内存管理,尤其是闭包中的变量释放

144、请描述出下列代码运行的结果

function d(){
console.log(this);
}
d();//window

145、需要将变量 e 的值修改为“a+b+c+d”,请写出对应的代码

var e=”abcd”;
设计一段代码能够遍历下列整个 DOM 节点

146、怎样实现两栏等高?

147、使用 js 实现这样的效果:在文本域里输入文字时,当按下 enter 键时不换行,而是替换成“{ {enter}}”,(只需要考虑在行尾按下 enter 键的情况).

textarea.οnkeydοwn=function(e){
e.preventDefault();//为了阻止 enter 键的默认换行效果
if(e.keycode==”enter 键 码 ”){ testarea.value+=”{ {enter}}”;
}
}

148、以下代码中 end 字符串什么时候输出

var t=true; setTimeout(function(){
console.log(123); t=false;
},1000);
while(t){}// 此时是一个死循环,永远不可能执行 setTimeout 中的回调函数console.log(‘end’);

149 、 specify(‘hello,world’)//=>’h,e,l,l,o,w,o,r,l,d’ 实现 specify 函数

150、请将一个 URL 的 search 部分参数与值转换成一个 json 对象

151、请用原生 js 实现 jquery 的 get\post 功能,以及跨域情况下

152、请简要描述 web 前端性能需要考虑哪方面,你的优化思路是什么?
//参见雅虎 14web 优化规则
//减少 http 请求:
//1、小图弄成大图,2、合理的设置缓存
//3、资源合并、压缩
//将外部的 js 文件置底

153、简述readyonly 与 disabled 的区别

readonly 只针对 input(text / password)和 textarea 有效,
而 disabled 对于所有的表单元素都有效,当表单元素在使用了 disabled 后,当我们将表单以POST 或 GET 的方式提交的话,这个元素的值不会被传递出去,而 readonly 会将该值传递出去

154、判断一个字符串出现次数最多的字符,统计这个次数并输出

155、编写一个方法,去掉一个数组的复重元素

156、写出 3 个使用 this 的典型应用

构造函数中使用 this,原型中使用 this,对象字面量使用 this

157、请尽可能详尽的解释 ajax 的工作原理

思路:先解释异步,再解释 ajax 如何使用
Ajax 的原理简单来说通过 XmlHttpRequest 对象来向服务器发异步请求,从服务器获得数据, 然后用javascript 来操作DOM 而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对XMLHttpRequest 有所了解。
XMLHttpRequest 是 ajax 的核心机制,它是在 IE5 中首先引入的,是一种支持异步请求的技术。简单的说,也就是 javascript 可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。

158、为什么扩展 javascript 内置对象不是好的做法?

因为扩展内置对象会影响整个程序中所使用到的该内置对象的原型属性

159、请解释一下 javascript 的同源策略

域名、协议、端口相同

160、什么是三元表达式?“三元”表示什么意思?

? :
因为运算符会涉及 3 个表达式

161、浏览器标准模式和怪异模式之间的区别是什么?

标准模式是指,浏览器按 W3C 标准解析执行代码;
怪异模式则是使用浏览器自己的方式解析执行代码,因为不同浏览器解析执行的方式不一 样,所以我们称之为怪异模式。

浏览器解析时到底使用标准模式还是怪异模式,与你网页中的 DTD 声明直接相关,DTD 声明定义了标准文档的类型(标准模式解析)文档类型,会使浏览器使用相应的方式加载网页 并显示,忽略 DTD 声明,将使网页进入怪异模式

162、如果设计中使用了非标准的字体,你该如何去实现?

先通过 font-face 定义字体,再引用

163、用 css 分别实现某个 div 元素上下居中和左右居中

margin:0 auto;

164、module(12,5)//2 实现满足这个结果的 modulo 函数

165、HTTP 协议中,GET 和 POST 有什么区别?分别适用什么场景 ?
get 传送的数据长度有限制,post 没有
get 通过 url 传递,在浏览器地址栏可见,post 是在报文中传递

适用场景:
post 一般用于表单提交
get 一般用于简单的数据查询,严格要求不是那么高的场景

166、HTTP 状态消息 200 302 304 403 404 500 分别表示什么

200:请求已成功,请求所希望的响应头或数据体将随此响应返回。
302:请求的资源临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在 Cache-Control 或Expires 中进行了指定的情况下, 这个响应才是可缓存的
304:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
403:服务器已经理解请求,但是拒绝执行它。
404:请求失败,请求所希望得到的资源未被在服务器上发现。
500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这 个问题都会在服务器端的源代码出现错误时出现。

167 、 HTTP 协 议 中 , header 信 息 里 面 , 怎 么 控 制 页 面 失 效 时 间
(last-modified,cache-control,Expires 分别代表什么)

Last-Modified 文 档的最后改动时间。客户可以通过 If-Modified-Since 请求头提供一个日期,该请求将被视为一个条件 GET,只有改动时间迟于指定时间的文档 才会返回,否则返回一个 304(Not Modified)状态。Last-Modified 也可用 setDateHeader 方法来设置。
Expires 应该在什么时候认为文档已经过期,从而不再缓存它?

168、HTTP 协议目前常用的有哪几个?KEEPALIVE 从哪个版本开始出现的?

http1.0

http1.1 keeplive

169、业界常用的优化 WEB 页面加载速度的方法(可以分别从页面元素展现,请求连接,css,js,服务器等方面介绍)

170、列举常用的 web 页面开发,调试以及优化工具

sublime vscode webstorm hbuilder dw

httpwatch=>ie ff:firebug

chrome:

171、解释什么是 sql 注入,xss 漏洞172、如何判断一个 js 变量是数组类型
ES5:Array.isArray()
[] instanceof Array Object.prototype.toString.call([]);//“[object Array]”

173、请列举 js 数组类型中的常用方法

方法 描述
concat() 连接两个或更多的数组,并返回结果。
join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。
pop() 删除并返回数组的最后一个元素
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
reverse() 颠倒数组中元素的顺序。
shift() 删除并返回数组的第一个元素
slice() 从某个已有的数组返回选定的元素
sort() 对数组的元素进行排序
splice() 删除元素,并向数组添加新元素。
toSource() 返回该对象的源代码。
toString() 把数组转换为字符串,并返回结果。
toLocaleString() 把数组转换为本地数组,并返回结果。
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。
valueOf() 返回数组对象的原始值

174、FF 与 IE 中如何阻止事件冒泡,如何获取事件对象,以及如何获取触发事件的元素

175、列举常用的 js 框架以及分别适用的领域

jquery:简化了 js 的一些操作,并且提供了一些非常好用的 API

jquery ui、jquery-easyui:在 jqeury 的基础上提供了一些常用的组件 日期,下拉框,表格这些组件
require.js、sea.js(阿里的玉帛)+》模块化开发使用的
zepto:精简版的 jquery,常用于手机 web 前端开发 提供了一些手机页面实用功能,touch ext.js:跟 jquery 差不多,但是不开源,也没有 jquery 轻量
angular、knockoutjs、avalon(去哪儿前端总监):MV*框架,适合用于单页应用开发(SPA)

176、js 中如何实现一个 map

数组的 map 方法:

概述

map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。

语法

array.map(callback[, thisArg])

参数

callback
原数组中的元素经过该方法后返回一个新的元素。

currentValue
callback 的第一个参数,数组中当前被传递的元素。
index
callback 的第二个参数,数组中当前被传递的元素的索引。
array
callback 的第三个参数,调用 map 方法的数组。
thisArg
执行 callback 函数时 this 指向的对象。
实现:

177、js 可否实现面向对象编程,如果可以如何实现 js 对象的继承

创建对象的几种方式实现继承的几种方式原型链

178、约瑟夫环—已知 n 个人(以编号 1,2,3…分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出列;他的下一个人又从 1 开始报数,数到 m 的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

179、有 1 到 10w 这个 10w 个数,去除 2 个并打乱次序,如何找出那两个数?

180、如何获取对象 a 拥有的所有属性(可枚举的、不可枚举的, 不包括继承来的属性)
Object.keys——IE9+
或者使用 for…in 并过滤出继承的属性
for(o in obj){ if(obj.hasOwnproperty(o)){
//把 o 这个属性放入到一个数组中
}
}

181、有下面这样一段 HTML 结构,使用css 实现这样的效果:

左边容器无论宽度如何变动,右边容器都能自适应填满父容器剩余的宽度。

182、下面这段代码想要循环昝输出结果 01234,请问输出结果是否正确,如果不正确,请说明为什么,并修改循环内的代码使其输出正确结果

for(var i=0;i<5;++i){ setTimeout(function(){
console.log(i+’’);
},100*i);
}

183、解释下这个 css 选择器什么发生什么?

[role=nav]>ul a:not([href^-mailto]){}

184、JavaScript 以下哪条语句会产生运行错误

A. var obj = (); B. var obj = []; C. var obj = {}; D. var obj = //; 答案:AD
185、以下哪些是 javascript 的全局函数:(ABCDE)

A.escape 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。

B.parseFloat parseFloat() 函数可解析一个字符串,并返回一个浮点数。

该函数指定字符串中的首个字符是否是数字。如果是,则对字符串进行解析,直到到达数字 的末端为止,然后以数字返回该数字,而不是作为字符串。

C.eval 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

D.setTimeout

E.alert

186、关于 IE 的 window 对象表述正确的有:(CD)

A.window.opener 属性本身就是指向 window 对象
window.opener 返回打开当前窗口的那个窗口的引用.
如果当前窗口是由另一个窗口打开的, window.opener 保留了那个窗口的引用. 如果当前窗口不是由其他窗口打开的, 则该属性返回 null.

B.window.reload()方法可以用来刷新当前页面 //正确答案:应该是 location.reload 或者 window.location.reload

C.window.location=”a.html”和 window.location.href=”a.html”的作用都是把当前页面替换成 a.html 页面

D.定义了全局变量 g;可以用 window.g 的方式来存取该变量

187、描述错误的是 D

A:Http 状态码 302 表示暂时性转移 对B:domContentLoaded 事件早于 onload

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值