JavaScript面试题
- 列举常用的字符串方法
-
indexOf(要查找的字符,开始索引) 查找某个字符串第一次出现的位置 lastIndexOf(要查找的字符,开始索引) 查找某个子字符串最后一次出现的位置 replace(被替换的内容,要替换的内容) 替换好的字符串 substr(从哪个索引开始,截取多少个) 返回截取到的内容 substring(从哪个索引开始,到哪个索引截止),包含开始索引,不包含结束索引;返回截取到的内容 slice(起始索引,结束索引) 截取出来的字符串 split(指定的切割符) 一个用指定切割符切割好的数组 toLowerCase() 转成 小写字母 toUpperCase() 转成 大写字母 charAt() 是找到字符串中指定索引位置的内容返回 trim() 去除空白内容以后的字符串
-
- 列举常用的数组方法
-
1234567891011121314151617181920212223242526
join
():用指定的分隔符将数组每一项拼接为字符串
push() :向数组的末尾添加新元素
pop():删除数组的最后一项
shift():删除数组的第一项
unshift():向数组首位添加新元素
slice():按照条件查找出其中的部分元素
splice():对数组进行增删改
fill(): 方法能使用特定值填充数组中的一个或多个元素
concat():用于连接两个或多个数组
indexOf():检测当前值在数组中第一次出现的位置索引
lastIndexOf():检测当前值在数组中最后一次出现的位置索引
includes():判断一个数组是否包含一个指定的值
sort():对数组的元素进行排序
reverse():对数组进行倒序
find():返回匹配的值
findIndex():返回匹配位置的索引
toLocaleString()、toString():将数组转换为字符串
ES5新增的数组方法
forEach():ES5 及以下循环遍历数组每一项,没有
return
返回值
map():ES6 循环遍历数组每一项
filter():“过滤”功能
reduce() 汇总功能
every():判断数组中每一项都是否满足条件
some():判断数组中是否存在满足条件的项
entries() 、keys() 、values():遍历数组
-
- js的数据类型有哪些
-
12345678910
js有7中数据类型
基础数据类型:
1、String类型,用于表示字符串;
2、Number类型,用于表示数字;
3、Boolean类型;
4、Undefined类型;
5、Null类型;
引用数据类型:
1、Array数组;
2、Object类型。
-
- 什么是作用域链
-
1
在函数中如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这样一个查找过程形成的链条就叫做作用域链
-
- 什么是事件委托,应用场景,优缺点
-
1
事件委托也称为事件托管或事件代理,就是把目标节点的事件绑定到祖先节点上;它是利用事件冒泡原理,管理某一类型的所有事件,<br>利用父元素来代表子元素的某一类型事件的处理方式
-
- 什么是深拷贝?什么是浅拷贝?如何实现深拷贝?
-
1
如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,<br>拿人手短,如果B没变,那就是深拷贝,自食其力。
-
- 数组冒泡排序的原理
-
冒泡排序原理冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来
-
-
javascript的typeof返回哪些数据类型
-
string,boolean,number,undefined,function,object
-
-
如何阻止事件冒泡
-
1
ie:阻止冒泡ev.cancelBubble =
true
;<br>非IE ev.stopPropagation();
-
- 数组排序的方法
-
1. sort()方法 2. 冒泡排序 3. 选择排序 4. 插入排序 5. 快速排序 6. 希尔排序
-
-
如何阻止默认事件
-
(1)return false; (2) ev.preventDefault(); (3) ev.returnValue = false
-
- 谈谈你对this的理解
-
this是Javascript语言的一个关键字, 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。 随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象
this的多种用法 - 全局范围内 - 函数调用 - 作为对象方法的调用 - call/apply/bind 的调用 - 作为构造函数调用
-
- get请求和post请求的区别
- DOM常见的操作及API
-
1.获取元素: document.getElementById(id): 根据元素的id属性获取元素。 document.getElementsByClassName(className): 根据元素的class属性获取元素。 document.getElementsByTagName(tagName): 根据元素的标签名获取元素。 document.querySelector(selector): 根据选择器获取第一个匹配的元素。 document.querySelectorAll(selector): 根据选择器获取所有匹配的元素。 2.创建元素: document.createElement(tagName): 创建一个指定标签名的元素节点。 document.createTextNode(text): 创建一个包含指定文本内容的文本节点。 3.修改元素属性和内容: element.setAttribute(name, value): 设置元素的属性值。 element.getAttribute(name): 获取元素的属性值。 4.添加和删除元素: parentElement.appendChild(newChild): 将一个新的子节点添加到指定父节点的子节点列表的末尾。 parentElement.insertBefore(newChild,哪个元素前插入):一个新的子节点插入到指定父节点的子节点的前面 parentElement.removeChild(child): 从指定父节点的子节点列表中删除一个子节点。
-
- let、const、var的区别
- 从输入url到浏览器显示页面发生了什么
- for循环,while循环,do-while循环的区别
-
for循环是指定次数的循环 while循环是满足条件的循环 while 先判断,再循环 do-while 先循环,再判断
-
- 如何阻止默认事件的发生
-
return false event.returnValue = false event.preventDefault()
-
- 将其他类型转为number类型
-
自动转换: string - 纯数字字符串转为数字,不是纯数字的转为NaN boolean - true是1 false是0 null - 0 undefined - NaN 强制转换: Number() parseInt() parseFloat() 保留小数点后的位数 toFiexd(2)
-
- 如何实现前端性能优化
- 什么是事件流,什么是事件冒泡,什么是事件委托
-
事件流:一个事件触发后,会在子元素和父元素之间的传播 这种传播分为3个阶段: 捕获阶段:从 window 对象传到目标节点(外到里) 目标阶段 冒泡阶段:从目标节点触发传回 window 对象(里到外) 事件冒泡:事件由子元素传递给父元素的过程(向上响应) 事件捕获:事件由父元素传递给子元素的过程(向下响应) 事件委托:也称事件代理,原理就是利用事件冒泡,是js中常用的绑定事件的方式,将事件委托给父元素,让父元素担当事件监听的职务;就是把原本绑定在子元素上的事件委托给父元素,让父元素触发事件, 优点:减少内存消耗、动态绑定事件 缺点:消耗性能( 绑定的事件是在父元素身上,但是触发的对象是子元素 ) 事件源:谁调用就是谁(Event.target)
- 什么是原型对象
-
1
所有的构造函数在初始化时,都会自动生成一个特殊的实例话对象,构造函数的prototype属性指向该对象,该对象称为原型对象,或prototype对象
-
- 什么是原型链
-
12
原型链:由一系列__proto__属性,串联起来的原型对象,称为原型链
原型链的意义:实例化对象在访问属性和方法时,会先访问自身的属性和方法,如果自身不存在对应的属性和方法,则会自动通过__proto__属性在整个原型链上查找,只要找到对应的属性和方法,<br>就能正确执行,如果原型链上没找到,则报错
-
- 前端性能优化可以从哪些方面?
-
123456789101112131415161718192021222324252627282930
1..loading
2.骨架屏
3.压缩 HTML
4.删除不必要的注释
5.删除不必要的属性
6.使用语义化标签
7.减少iframe数量
8.削减DOM数量和层级数量
9.减少 HTTP 请求次数
10.减少重排重绘
11.javascript脚本放到页面底部
12.将javascript和css从外部引入
13.减少DOM操作
14.节流与防抖
15.合理的ajax恳求
16.尽量少用@import
17.避免!important,可以选择其他选择器
18.CSS文件压缩
19.CSS层级嵌套最好不要超过3层
20.删除无用的css
21.慎用*通配符
22.小图片引入雪碧图。
23.图片压缩
24.图片懒加载
25.采用svg图片或者字体图标
26.Base64
27.缓存加载器
28.Hot update 热更新
29.DNS预解析
参考连接:https:
//blog.csdn.net/chaoPerson/article/details/130743570
-
- new一个实例化对象的四个阶段
-
1234
1. 创建一个空的实例化对象
2. 让构造函数中的
this
指向空的实例化对象
3. 执行(调用)构造函数,从而创建实例化对象自身的属性和方法
4. 返回实例化对象
-
- 什么是回流和重绘
-
123
回流指的是元素的尺寸,布局,位置发生变化,导致页面的布局需要重新计算
重绘指的是元素的外观发生变化,但尺寸和布局不变,只需要重新绘制元素.
回流必将引起重绘,而重绘不一定会引起回流。
-
- 常见HTTP状态码的含义
-
http状态码及代表意思为: 1、1xx,信息性状态码,表示请求已经接收,继续处理; 2、2xx,成功状态码,表示请求已经被成功接收、理解、并处理; 3、3xx,重定向状态码,表示请求需要进一步操作,以完成请求; 4、4xx,客户端错误状态码,表示客户端的请求有问题; 5、5xx,服务器错误状态码,表示服务器处理请求时出现了错误。
-
- 什么是防抖和节流,描述防抖的原理和节流的原理
-
1234
本质上是优化高频率执行代码的一种手段;
为了优化体验,需要对resize、scroll、keypress、mousemove 等事件进行调用次数的限制,对此我们就可以采用 防抖(debounce) 和 节流(throttle) 的方式来减少调用频率
防抖: n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效
节流: n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时
-
- 什么是事件循环
- call、apply、bind的区别
-
call,apply,bind,改变的是方法前面的函数的this指向 call和apply的区别: call传递参数是一个一个传递的,apply是以数组的形式传递的; bind和call的区别: bind和call的传参方式是一样的 call会自动调用,bind返回的是函数体,需要手动调用
-
- 什么是闭包,闭包的优缺点
- 简述js的垃圾回收机制
- 什么是内存泄露
- ES6新特性,并简述她们的作业
-
12345678910
let
关键字,用于声明只在块级作用域起作用的变量。
const
关键字,用于声明一个常量。
结构赋值,一种新的变量赋值方式。常用于交换变量值,提取函数返回值,设置默认值。
Symbol数据类型,定义一个独一无二的值。
Proxy代理,用于编写处理函数,来拦截目标对象的操作。
for
...of遍历,可遍历具有iterator 接口的数据结构。
Set结构,存储不重复的成员值的集合。
Map结构,键名可以是任何类型的键值对集合。
Promise对象,更合理、规范地处理异步操作。
Class类定义类和更简便地实现类的继承。
-
- 说一下promise
- 说一个async await
- promise.all 和 promise.race 的用法和区别
- promise的特点是什么?也就是三个状态
-
promise一共有三个状态,分别是进行中,成功或者失败,如果成功的话通过resolve方法将正确结果返回出去,通过.then的方式接收,
失败的话通过reject的方式将错误结果返回出去,通过.catch的方式接收,pending状态是进行中,一旦进行,状态就是不可逆的
-
- for-in和for-of的区别
- 说说var、let、const之间的区别
-
123456789101112131415161718192021
1、变量提升
var
声明的变量存在变量提升,即变量可以在声明之前调用,值为undefined
let
和
const
不存在变量提升,即它们所声明的变量一定要在声明后使用,否则报错
2、暂时性死区
var
不存在暂时性死区。
let
和
const
存在暂时性死区,只有等到声明变量的那一行代码出现,才可以获取和使用该变量
3、块级作用域
var
不存在块级作用域
let
和
const
存在块级作用域
4、重复声明
var
允许重复声明变量
let
和
const
在同一作用域不允许重复声明变量
5、修改声明的变量
var
和
let
可以
const
声明一个只读的常量。一旦声明,常量的值就不能改变
6、使用
能用
const
的情况尽量使用
const
,其他情况下大多数使用
let
,避免使用
var
-
- 箭头函数和普通函数的区别
- 三种本地存储的区别
- 说说最近最流行的一些东西吧?常去哪些网站?
- 列举10条移动端兼容性问题
- 如何将最终的金额,专为","逗号分隔的形式
-
12345678910111213141516171819202122232425262728
function numberFormate(num) {
// 数字格式化为x,xxx,xxx,xxx
// 1. 将num专为数字类型
num = parseFloat(num);
// 2. 判断是否是一个数字
if
(!Number.isNaN(num)) {
// 3. 将数字按照.进行分割(主要是针对浮点数)
let
str = Math.abs(num).toString().split(
'.'
);
// 4. 整数部分按照3个一组,看可以分为几组
const
a = Math.ceil(str[0].length / 3);
// 5. 不够3个一组的,自动补充0
str[0] = str[0].padStart(a * 3,
'0'
);
const
numArr = [];
// 6. 将数字按照3个一组进行截取
for
(
let
i = 0; i < a; i++) {
numArr.push(str[0].substring(i * 3, (i + 1) * 3));
}
// console.log(numArr);
// 7. 将数组中的第一个值中前面补充的0去除
numArr[0] = parseInt(numArr[0]);
// 8. 将数组中的数字按照逗号进行拼接,并且拼接上小数点后面的值
const
formateStr = numArr.
join
(
','
) + (str[1] ?
'.'
+ str[1] :
''
);
// 9. 判断初始值是正值还是负值,需不需要添加-
return
num < 0 ?
"-"
+ formateStr : formateStr;
}
else
{
throw
new
TypeError(
"传入的参数必须是数字"
);
}
}
console.log(numberFormate(1123456789.2234));
// 结果为1,123,456,789.2234
- 大文件的分割处理(大文件切片上传,断点续传)
- 前端常用的几种加密方法
- 前端常见的攻击手段及防御方法
- 用类的方式编写一个b继承a的方法,描述代码实现流程
- 了解Node么? Node的使用场景都有哪些?
- 对于前端自动化构建工具有了解吗,简单介绍下
- js的typeof返回哪些数据类型
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通