2023高频前端面试题(持续更新 含答案)
Posted 吃土豆的程序猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2023高频前端面试题(持续更新 含答案)相关的知识,希望对你有一定的参考价值。
1,es6有哪些新特性?
ES6是2015年推出的一个新的版本、这个版本相对于ES5的语法做了很多的优化
let和const具有块级作用域,不存在变量提升的问题。新增了箭头函数,简化了定义函数的写法,同时
可以巧用箭头函数的this、(注意箭头函数本身没有this,它的this取决于外部的环境),新增了promise,解决了回调地域的问题,新增了模块化、利用import 、export来实现导入、导出。新增了结构赋值,ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
(Destructuring)。新增了class类的概念,它类似于对象。
1-1,let声明变量和var一样,但是let不存在变量提升,存在块级作用域,块级作用域---很适合用在for循环中,使用let时for循环每循环一次就是一个单独的变量i只在当前花括内生效,而且不会泄露成全局的i,不能重复声明,不存在变量提升
1-2,const-声明常量,只要声明就必须初始化,不能重复声明,不存在变量提升,const只要声明就必须初始化
1-3,新增了箭头函数,简化了定义函数的写法,同时可以巧用箭头函数的this、(注意箭头函数本身没有this,它的this取决于外部的环境)
箭头函数和普通函数的区别:
this指向不同,因为箭头函数中没有this
箭头函数不能使用arguments
书写方式,箭头函数使用(=>)箭头定义函数
箭头函数可以省略return
箭头函数都是匿名函数
箭头函数不能用于构造函数,不能使用new
call apply bind改变不了this指向
1-4,symbol
新增的数据类型,第七种数据类型,原始数据类型,表示独一无二的值
let sy=Symbol()
console.log(typeof sy);
// 数值是由symbol函数生成的,不能使用new
// 可以接受参数,用来描述数据
let sy=Symbol('a')
let sy1=Symbol('a')
console.log( sy===sy1);
1-5,集合-set
新增的数据结构 类似于数组,成员是不重复的,只有一个,可以接收参数,可以接收数组或者iteration接口的数据
// 可以去重
let s=new Set()
var arr=[1,2,3,1,2,3]
arr.forEach(item=>
s.add(item)
)
console.log(s);
let s=new Set('aasdasd')
let s1=new Set(document.querySelectorAll('li'))
console.log(s1);
属性:
set.prototype.size :长度
set.prototype.constructor:指向构造函数
数据:
set.prototype.add(value)添加数据
set.prototype.delete(value)删除数据
set.prototype.has(value)检测数据是否存在,返回时布尔值
set.prototype.clear()将数据清空
遍历器:
set.prototype.keys()遍历属性名(键名)遍历器
set.prototype.values()遍历属性值(键值)遍历器
set.prototype.entries()遍历键值对的遍历器
forEach()遍历
1-6,map
类似对象 键值对的形式存在,不限制数据类型作为属性名,值---值
let m=new Map()
m.set(1,name:'1')
m.set([1,2,3],1)
console.log(m.get());
1-7,解构赋值
按照一定模式匹配相应的数据
数组的结构
var arr=[1,2,3]
var [a,b,c]=arr
console.log(a,b,c)//1,2,3
//相当于:
[a,b,c]=[1,2,3]
对象的结构
var obj=
name:'zhang',
age:'19',
set:
name:'lisi'
var name:bar,age:a,set:name:baz=obj
console.log(baz);
函数的解构赋值
// 参数的解构赋值
function fun([x,y],b,a,c)
console.log(x,y);
fun([1,2],10,20)
1-8,严格模式
对代码进行限制规范,严格模式和普通没有区别
// 注意:- 将严格模式的语句放到代码的第一行
// - ie 6 7 8 9不支持严格模式
'use strict' // 全局开启
function fn()
'use strict' // 某个函数开启
全局变量必须声明
禁止使用 with
创建 eval 作用域
禁止 this 指向全局作用域
函数参数不能重名
1-9, promise
异步编程的方式,可以解决回调地狱的问题
特点:有三个状态 pending(正在进行) fulfilled(已经成功)
rejected (已经失败)
结果只有两种可能:pending(正在进行)到 fulfilled(已经成功) --成功---resolve
pending(正在进行)到 rejected (已经失败)---失败---reject
接收一个回调函数 里面有两个参数
const p = new Promise(function (resolve, reject)
setTimeout(function ()
resolve(100)
, 1000)
)
p.then(function(value)
console.log(value);
,function(error)
console.log(error);
)
catch
用来捕获失败,相当于then(undefined,function())或者then(null,function())
promise的状态不会一经确定就不会改变了
2,什么是递归,递归有哪些优点或缺点?
递归函数 -- 高阶函数
如果一个函数,是自己调用自己(直接调用或者间接调用) 这个函数就是递归
简单理解:函数内部自己调用自己, 这个函数就是递归函数
适合大量数据或者数据的反复计算
注意:必须有一个结束条件,结束了,才有结果
function getSty(a)
getSty([])
优点:结构清晰、可读性强
缺点:效率低、调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容
量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。
3,谈谈你平时都用了哪些方法进行性能优化?
减少http请求次数、打包压缩上线代码、使用懒加载、使用雪碧图、动态渲染组件、CDN加载包。
4,什么是闭包?手写一个闭包函数? 闭包有哪些优缺点?
闭包指有权访问另一个函数作用域中变量的函数。简单理解就是 ,一个作用
域可以访问另外一个函数内部的局部变量。
function fn()
var num = 10;
function fun()
console.log(num);
return fun;
var f = fn();
f();
作用:延长变量作用域、在函数的外部可以访问函数内部的局部变量,容易造成内层泄露,因为闭包中
的局部变量永远不会被回收
优点:
1:变量长期驻扎在内存中;
2:避免全局变量的污染;
3:私有成员的存在 ;
缺点:
会造成内存泄露
5,v-for 循环为什么一定要绑定key ?
页面上的标签都对应具体的虚拟dom对象(虚拟dom就是js对象), 循环中 ,如果没有唯一key , 页面上删除一条标签, 由于并不知道删除的是那一条,所以要把全部虚拟dom重新渲染, 如果知道key为x标签被删除掉, 只需要把渲染的dom为x的标签去掉即可
6,Js 中常见的内存泄漏?
1.意外的全局变量
2.被遗忘的计时器或回调函数
3.脱离 DOM 的引用
4.闭包
7,Get 和 post 有什么区别?
Get 是从服务器上获取数据,post 是向服务器传送数据
在客户端,get 通过 url 提交数据,数据在 url 中可以看到,post 方式,
数据放在 html header 中提交
安全性问题 原则上post肯定要比get安全,毕竟传输参数时url不可见
Get 提交数据最多只能有 1024 字节,post 没有限制
java基础测试题(含答案和解析)
| 得分: 满分:2分
A.6 6
B.5 5
C.5 6
D.6 7
| 得分: 满分:2分
A.void Aoo(){ }
B.Aoo(){ }
C.aoo(){ }
D.void aoo(){ }
| 得分: 满分:2分
A.编译错误
B.运行时异常
C.0
D.null
| 得分: 满分:2分
A.0
B.1
C.2
D.3
| 得分: 满分:2分
A.0
B.5
C.编译错误
D.运行异常
| 得分: 满分:2分
A.120
B.48
C.45
D.30
| 得分: 满分:2分
A.int[] arr = new int[];
B.int[] arr = new int(4);
C.int[] arr = new int[] { 12,34,56,78 };
D.int[] arr = new int[4] { 12,34,56,78 };
| 得分: 满分:2分
A.int i = 10; static int j = 20; void fun1(){} static void fun2(){ fun1(); i++; }
B.int i = 10; static int j = 20; void fun1(){} static void fun2(){ fun1(); j++; }
C.int i = 10; static int j = 20; void fun1(){ fun2(); i++; } static void fun2(){ i++; }
D.int i = 10; static int j = 20; void fun1(){ fun2(); j++; } static void fun2(){}
| 得分: 满分:2分
A.void Test() { }
B.public int Test() { }
C.public void Test() { }
D.public void Test(int num) { }
| 得分: 满分:2分
A.0
B.null
C.编译错误
D.运行异常
| 得分: 满分:2分
A.2
B.3
C.2.75
D.0
| 得分: 满分:2分
A.声明totalPage变量为private。
B.声明Page类为private。
C.声明totalPage变量为private,并且建立一个用于获取totalPage变量值 的getTotalPage() 方法。
D.声明totalPage变量为static。
| 得分: 满分:2分
A.Base(a,b);
B.x=a, y=b;
C.this(a); this(b);
D.this(a,b);
| 得分: 满分:2分
A.A a = new B(); a.test();
B.A a = new A(); a.test();
C.B b = new A(); b.test();
D.B.test();
| 得分: 满分:2分
A.i=20
B.程序有编译错误
C.i=10
D.i=true
| 得分: 满分:2分
A.2 2
B.2 0
C.0 2
D.1 2
| 得分: 满分:2分
A.tedu and xyz
B.tarena and xyz
C.tedu and wyz
D.tarena and wyz
| 得分: 满分:2分
A.编译错误
B.0 true
C.0 false
D.0 0
| 得分: 满分:2分
A.final
B.private
C.public
D.static
| 得分: 满分:2分
A.账务账号的名字是null,状态是1,身份证号是109...。
B.执行构造方法。 账务账号的名字是null,状态是1,身份证号是null。
C.账务账号的名字是null,状态是0,身份证号是null。
D.执行构造方法。 账务账号的名字是李强,状态是1,身份证号是109...。
| 得分: 满分:2分
A.int length = arr1.length+arr2.length; char[] arr3 = new char[length]; System.arraycopy(arr1, 0, arr3, 0, arr1.length); System.arraycopy(arr2, 0, arr3,0, arr2.length);
B.int length = arr1.length+arr2.length; char[] arr3 = new char[length]; System.arraycopy(arr1, 0, arr3, 0, arr1.length); System.arraycopy(arr2, 0, arr3,arr1.length-1, arr2.length);
C.int length = arr1.length+arr2.length; char[] arr3 = new char[length]; System.arraycopy(arr1, 0, arr3, 0, arr1.length); System.arraycopy(arr2, 0, arr3,arr1.length+1, arr2.length);
D.int length = arr1.length+arr2.length; char[] arr3 = new char[length]; System.arraycopy(arr1, 0, arr3, 0, arr1.length); System.arraycopy(arr2, 0, arr3,arr1.length, arr2.length)
| 得分: 满分:2分
A.int x = 4590; x = x / 1000 *1000; x的结果是4590
B.int x = 3; x = x++; x的结果是4
C.short x = 3; x = x+4; x的结果是7
D.int x = 2; boolean b = x>3 && x<6; b的结果是false
| 得分: 满分:2分
A.a=97,b=98,c=99
B.a=98,b=99,c=99
C.a=97,b=98,c=98
D.a=98,b=98,c=97
| 得分: 满分:2分
A.5
B.0
C.6
D.2
| 得分: 满分:2分
A.4行与9行不能通过编译,因为缺少方法名和返回类型
B.9行不能通过编译,因为只能有一个静态初始化器
C.编译通过,执行结果为:x=5
D.编译通过,执行结果为:x=3
| 得分: 满分:2分
A.0
B.3
C.5
D.7
| 得分: 满分:2分
A.1
B.3
C.6
D.7
| 得分: 满分:2分
A.每次循环都要执行表达式1
B.表达式2可以返回任何数据类型
C.3个表达式均可省略,使用如下格式for(;;){循环体}
D.循环体中必须有合法的java语句
| 得分: 满分:2分
A.String str = "["; for (int x=0; x<=arr.length ; x++){ if(x!=arr.length-1) str = str + arr[x] + ","; else str = str + arr[x] + "]"; }
B.String str = "["; for (int x=0; x
C.String str = "["; for (int x=0; x
D.String str = "["; for (int x=0; x<arr.length+1 ; x++){ if(x!=arr.length-1) str = str + arr[x] + ","; else str = str + arr[x] + "]"; }
| 得分: 满分:2分
A.A
B.B
C.C
D.D
| 得分: 满分:2分
A.byte b = 128;
B.boolean b = null;
C.long l=0xfffL;
D.double d =0.9239d;
| 得分: 满分:2分
A.public void study(int days){}
B.public String study(String content,String title){}
C.public String study(){}
D.public void study(String title){}
| 得分: 满分:2分
A.跨平台
B.支持多线程
C.面向对象
D.可以直接访问操作系统
| 得分: 满分:2分
A.Java支持接口之间的多继承,也支持类之间的多继承。
B.Java中只支持单继承,即一个类只能有一个父类.
C.当两个类存在所属关系(is a),才使用继承(is a,是一个。 说明该类是某类的一个特殊例子,简单之称为继承。)
D.使用继承,可以使类之间产生关系,提供了多态的特性。
| 得分: 满分:2分
A.面向对象以功能为核心,使用函数封装。
B.面向过程以功能为核心,使用函数封装。
C.面向对象以事物为核心,将具体的数据和功能封装到事物中。
D.面向过程以事物为核心,将具体的数据和功能封装到事物中。
| 得分: 满分:2分
A.int y = 1; int count = 0; while(y<=100){ if(y/7==0) count++; y++; } System.out.println(count);
B.int y = 1; int count = 0; while(y<=100){ if(y%7==0) count++; y++; } System.out.println(count);
C.int count = 0; for(int i=1;i<=100;i++){ if(i%7==0) count++; } System.out.println(count);
D.int count = 0; for(int i=1;i<=100;i++){ if(i/7==0) count++; } System.out.println(count);
| 得分: 满分:2分
A.程序编译错误,因为类B不能访问变量x。
B.程序编译成功,打印输出012。
C.程序编译错误,如果移走System.out.println(x)这条语句, 可使编译程序通过。
D.程序编译错误,因为变量x未在类B中定义。
| 得分: 满分:2分
A.获取数组中第三个元素的语法是arr[3]
B.获取数组中第三个元素的语法是arr[2]
C.该数组的最后一个元素的下标值为arr.length
D.该数组的最后一个元素的下标值为arr.length-1
| 得分: 满分:2分
A.开发一个Java程序,需要完整的JDK
B.运行一个Java程序,需要完整的JDK
C.运行一个Java程序,只需要JDK中的JRE
D.以上说法都不对
| 得分: 满分:2分
A.for(;;){}
B.while(true){}
C.do{}while(true);
D.for(int i=0;i++){}
| 得分: 满分:2分
A.switch((int)d){ case 1:System.out.println(x);break; case 2:System.out.println(y);break; }
B.switch(d){ case 1.5:System.out.println(x);break; case 2.0:System.out.println(y);break; }
C.switch(x+y){ case 1:System.out.println(x);break; case 2:System.out.println(y);break; }
D.switch(x+y){ case 1:System.out.println(x);break; case z:System.out.println(y);break; }
| 得分: 满分:2分
A.short s1 = 3; short s2 = 5; s1 += s2;
B.short s1 = 3; short s2 = 5; s1 = s1+s2;
C.short s1 = 3; short s2 = 5; s1 = s1 * s2;
D.short s1 = 3; short s2 = 5; s1 *= s2 ;
| 得分: 满分:2分
A.do....while循环,循环体至少执行一次
B.do....while循环和while循环只是语法不同,没区别
C.do....while循环先执行循环体,再执行boolean表达式,如果为true再执行循环体
D.以上说法都正确
| 得分: 满分:2分
A.byte类型的数据默认值是0
B.int类型的数据默认值是0
C.long类型的数据默认值是0
D.float类型的数据默认值是0.0f
| 得分: 满分:2分
A.long l = 999999;
B.long l = 9999999999L;
C.byte b = 90+40;
D.int i = ‘A‘+‘中‘;
| 得分: 满分:2分
A.Linux 是一个开源的操作系统 是一个类似Unix的操作系统
B.Linux 是主流的服务器操作系统,广泛应用于互联网、云计算、智能手机等领域
C.Linux 中的相对路径,使用“.”表示上一级目录,“..”表示当前路径
D.Linux 中使用"pwd"命令显示当前工作目录的内容
| 得分: 满分:2分
A.//1
B.//2
C.//3
D.//4
| 得分: 满分:2分
A.public void imethod();
B.void imethod();
C.protected void imethod();
D.private void imethod();
| 得分: 满分:2分
A.protected void fun();
B.static void fun();
C.void fun();
D.public void fun();
| 得分: 满分:2分
A.支持JAVA程序运行的一组类库
B.JVM
C.支持JAVA程序开发的一组开发工具
D.一组软件测试工具
以上是关于2023高频前端面试题(持续更新 含答案)的主要内容,如果未能解决你的问题,请参考以下文章
全精品~ 2023年互联网大厂高频Java面试真题集锦(含答案解析)
2023金三银四1000道java面试必考题(附答案,赶紧收藏)包含所有大厂高频面试知识点