js面试题
1.some和 every区别?
相同点:every和some都有三个参数,即item-当前项,index-当前项的索引值,array-数组本身;都可循环遍历数组
不同点:every相当于逻辑关系中的且,只有所有参数都满足条件时,才返回true,一旦有一个不满足,则逻辑中断,返回false;some相当于逻辑关系中的或,只要有一个参数满足条件,就中断遍历,返回true,若遍历完所有参数,没有符合的项,返回false,通俗一点就是 every:一假即假,some:一真即真
2.find 和 findIndex区别?
find()函数用来查找目标元素,找到就返回该元素,找不到返回undefined。
findIndex()函数也是查找目标元素,找到就返回元素的位置,找不到就返回-1。
3.字符串常用的方法?
length():返回字符串的长度(字符的个数)。
charAt(index):返回指定索引位置处的字符。
substring(startIndex, endIndex):从字符串中提取指定索引范围内的子串。
indexOf(substring):返回指定字符串在原字符串中第一次出现的索引位置。
lastIndexOf(substring):返回指定字符串在原字符串中最后一次出现的索引位置。
startsWith(prefix):判断字符串是否以指定的前缀开始。
endsWith(suffix):判断字符串是否以指定的后缀结束。
toUpperCase():将字符串中的所有字母字符转换为大写。
toLowerCase():将字符串中的所有字母字符转换为小写。
concat(string):将指定字符串连接到原字符串的末尾。
trim():去除字符串两端的空白字符(空格、制表符等)。
replace(oldValue, newValue):将字符串中的指定内容替换为新的内容。
split(separator):根据指定的分隔符将字符串拆分为多个子串,并返回一个数组。
join(separator):将数组中的所有元素连接成一个字符串,使用指定的分隔符。
match(pattern):根据指定的正则表达式模式,在字符串中查找匹配的子串,并返回一个数组。
4.获取数组中出现次数最多的数
<script>
function findMostFrequentNumber(arr) {
let countMap = {};
//记录目前出现的最大次数
let maxCount = 0;
// 记录目前的出现最多的数
let mostFrequentNumber;
// 遍历数组let num of arr
for (let num of arr) {
if (countMap[num]) {
countMap[num]++;
} else {
countMap[num] = 1;
}
if (countMap[num] > maxCount) {
maxCount = countMap[num];
mostFrequentNumber = num;
}
}
return {
number: mostFrequentNumber,
count: maxCount
};
}
// 示例用法
let numbers = [1, 3, 5, 3, 2, 1, 3, 5, 3];
let mostFrequent = findMostFrequentNumber(numbers);
console.log(mostFrequent); // 输出 { number: 3, count: 4 }
</script>
5.js的垃圾回收机制?
6.字符串转换成数字的方法有哪些?
parseInt 第一个参数是数据 第二个参数是进制
Number() 函数是一个全局函数,可以将字符串转换为数字,包括整数和浮点数
parseFloat() 函数将字符串转换为浮点数。它也会从字符串的开头开始解析,直到遇到无法解析的字符为止。
7.什么是深拷贝和浅拷贝? 如何实现?
**深拷贝(Deep Copy)**是指在将一个对象或数组复制到一个新的变量时,不仅仅复制了对象本身,还复制了对象内部的所有嵌套对象和数组的内容,使得原对象和新对象完全独立,彼此之间互不影响。
**浅拷贝(Shallow Copy)**是指在将一个对象或数组复制到一个新的变量时,只复制对象或数组本身,而不复制对象或数组内部嵌套的引用类型数据。因此,原对象和新对象会共享引用类型数据的引用,对其中一个对象所做的修改可能会影响到另一个对象。
const originalObject = { name: 'John', age: 30 };
const shallowCopyObject = { ...originalObject };
Object.assign() 方法:
const originalObject = { name: 'John', age: 30 };
const shallowCopyObject = Object.assign({}, originalObject);
Array.prototype.slice() 方法(适用于数组):
const originalArray = [1, 2, 3];
const shallowCopyArray = originalArray.slice();
8.对闭包的优缺点?
优点:
访问父级作用域:闭包可以访问外部函数的变量和参数,即使外部函数已经执行完毕,也仍然可以访问这些变量和参数。
保护私有变量:通过闭包,我们可以创建私有变量,封装这些变量从而避免了全局变量的污染。
实现模块化:闭包可以用于实现模块化和代码封装,通过返回内部函数,可以选择性地暴露对象、函数或变量。
保存状态:闭包可以用于保存函数状态,内部函数可以访问并修改外部函数的变量,使得这些变量的值在多次调用之间得以保留和共享。
缺点:
内存占用:闭包会引用外部函数的作用域,导致外部函数的变量无法被垃圾回收。如果闭包被过度使用,可能会导致内存泄漏和性能问题。
难以理解和调试:闭包涉及到多个作用域,嵌套的函数和变量之间的关系可能会变得复杂,使得代码难以阅读、理解和调试。
性能影响:由于闭包涉及到多层作用域的访问和变量引用,它的执行效率可能不如其他非闭包的解决方案
10.js事件机制?
1.事件监听器:通过addEventListener()方法可以向指定的元素或对象注册监听器,以便在特定事件发生时执行相应的处理函数。
2.事件处理函数:也称为事件回调函数,它是注册给特定事件的函数。当事件被触发时,相关的处理函数将被调用。
3.事件对象:在事件被触发时,相关的事件对象会被创建并传递给事件处理函数。事件对象包含与事件相关的属性和方法,开发者可以使用这些属性和方法来获取事件的详细信息。
4.事件冒泡和事件捕获:当一个元素上发生了某个事件,如果这个元素有父元素,该事件将逐级向上传播(冒泡)直到顶层文档对象。事件捕获是指从顶层文档对象向下寻找触发事件的元素。
11.new关键字具体做了那些事儿?
1.首先在函数内部创建一个空对象
2.把这个对象添加一个 [[Prototype]]属性 属性值 为函数对象的prototype属性值(原型对象)
3.把这个对象赋值给this
4.执行函数中程序员写的代码
5.隐式的返回this
12.http状态码?
200 OK:成功处理了请求并返回了响应。
201 Created:成功创建了新资源。
204 No Content:服务器成功处理了请求,但没有返回任何内容。
400 Bad Request:(错误请求)服务器不理解请求的语法。
401 Unauthorized:表示发送的请求需要有通过HTTP认证的认证信息。
403 Forbidden:服务器拒绝请求。
404 Not Found:请求的资源在服务器上未找到。
500 Internal Server Error:服务器在处理请求时遇到了错误。
13.js中this的指向?
- ✨在全局环境中this指向window
- 📜在普通函数中 this指向 函数的调用者
- 📚在构造函数中 this指向 构建出来的实例对象
- 💡在事件的回调函数中 this指向当前操作的dom节点
- ⏰在一些全局函数中 settimeout setinterval this指向 window对象 但是在Node中是有变化的
15.eventloop事件循环?
16.promise的理解?
17.对象的方法
1.create: 创建一个对象
2、defineProperty:Object.defineProperty(object, prop, descriptor)定义对象属性
3、defineProperties
4、keys: 遍历可枚举的属性,
5、values: 遍历可枚举的属性值
6、Object.assign( target, source, source1 )
7、getPrototypeOf: 获取指定对象的原型(内部[[Prototype]]属性的值)
8、setPrototypeOf 设置一个指定的对象的原型
9、getOwnPropertyNames 与keys相似,但包含遍历包含不可枚举属性
10、getOwnPropertyDescriptor 获取该属性的描述对象
11、getOwnPropertyDescriptors 返回指定对象所有自身属性(非继承属性)的描述对象
12、entries 分割对象
13、is :它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致
14、preventExtensions 让一个对象变的不可扩展
15、seal 将一个对象密封 isSealed 判断一个对象是否为密封的
16、freeze 冻结一个对象&isFrozen 判断一个对象是否已经被冻结
17、hasOwnProperty
18、isPrototypeOf
19、propertyIsEnumerable 指定的属性是否可枚举
20、caller 返回当前函数的调用者
21、valueOf 需要返回对象的原始值
22、getOwnPropertySymbols在给定对象自身上找到的所有 Symbol 属性的数组
23、toString、 toLocalString
24、call apply bind、length、name 大家自己回去研究
18. for…in和for…of区别
- for…of
只能遍历可迭代类型比如:数组 字符串 Set Map,在遍历的时候可以直接获取值 - for…in
for…in遍历的是键,他不能直接获取循环的值,需要通过下标来获取