万字总结JavaScript面试题(后续持续更新)
文章目录
一、JS的数据类型
原始类型
- Undefined
- 当一个变量已被声明但未被赋值时,默认值为
undefined
。
- 当一个变量已被声明但未被赋值时,默认值为
- Null
- 表示一个空的或不存在的引用值。它是对象类型的特例。
- Boolean
- 表示逻辑值,可以是
true
或false
。
- 表示逻辑值,可以是
- Number
- 用于表示整数和浮点数。在JavaScript中,所有的数字都是以64位浮点格式存储的。
- BigInt(ES11引入)
- 用于表示任意精度的整数。当你需要处理超过
Number
类型所能表示的最大整数值时使用。
- 用于表示任意精度的整数。当你需要处理超过
- String
- 用于表示文本数据。字符串可以包含零个或多个字符。
- Symbol(ES6引入)
- 用于创建唯一的标识符。
Symbols
是不可变的且独一无二的,常用于对象属性的键。
- 用于创建唯一的标识符。
对象类型
- Object
- 对象是属性的集合,而属性可以是任何数据类型,包括其他对象。对象可以用来构建复杂的数据结构。
- Array
- 数组是一种特殊类型的对象,用于存储有序的项目列表。数组的元素可以是任何数据类型。
- Function
- 函数也是对象,可以被赋值给变量、作为参数传递给其他函数或从函数中返回。
- Date
- 日期对象用于处理日期和时间。
- RegExp
- 正则表达式对象用于匹配文本中的字符串模式。
- Map和Set(ES6引入)
Map
存储键值对,并且任何值(对象或原始值)都可以用作键或值。Set
是一个存储唯一值的集合。
- WeakMap和WeakSet(ES6引入)
- 这些数据结构类似于
Map
和Set
,但是它们只接受对象作为键(对于WeakMap
),并且这些键是弱引用的,这意味着如果对象的唯一引用是WeakMap
或WeakSet
中的一个条目,那么垃圾回收器将回收该对象。
- 这些数据结构类似于
二、延迟加载JS的方式
1.script标签的async
属性
当在<script>
标签中使用async
属性时,脚本将异步下载,但一旦下载完成,它会立即执行,而不等待页面解析完成。这种方式适用于那些不需要等待DOM
完全加载就可以执行的脚本,如广告或分析脚本。
<script src="" async ></script>
2.script标签的defer
属性
带有defer
属性的<script>
标签会使脚本文件异步下载,并确保所有脚本在文档解析完成后按顺序执行。这对于需要访问DOM
的脚本非常有用。
<script src="" defer ></script>
3.动态插入脚本
可以通过JavaScript动态创建<script>
元素并将其添加到文档中,这样可以完全控制何时开始下载脚本以及何时执行脚本。
const script = document.createElement('script');
script.src = 'example.js';
document.body.appendChild(script);
4.使用Intersection Observer API
Intersection Observer API
可以用来检测元素何时进入视口,这对于图片和脚本的懒加载特别有用。你可以等到某个元素即将进入视口时再加载相关的脚本。
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const script = document.createElement('script');
script.src = entry.target.getAttribute('data - src');
document.body.appendChild(script);
observer.unobserve(entry.target); // 停止观察
}
});
});
// 选择所有需要懒加载的脚本元素
document.querySelectorAll('[data - src]').forEach(el => {
observer.observe(el);
});
5.使用模块加载
HTML5
引入对ES
模块的支持,允许将脚本标记为模块。模块脚本默认具有defer
行为。这说明会按照出现顺序在文档解析完成后执行。
三、null
和undefined
的区别
null
- 定义:表示一个空的或者不存在的引用值。它是对象类型的特例。
let y = null; console.log(y); // 输出: null console.log(typeof null); // 输出: "object"
undefined
- 定义:当一个变量被声明但未被赋值时,默认值为
undefined
。let x; console.log(x); // 输出: undefined
JS
中是先有null
后有undefined
的。undefined
的出现是因为JS
最初没有错误处理机制,因为null
会自动转换为0,不容易发现错误;并且null
在JS
中被当成了一个对象,作者觉得表示“无”的值最好不要是对象。
四、==
和===
的不同
==
:比较的是值,比较时JS
会进行隐式转换,然后再进行比较。===
:比较值也同时比较类型,当值和类型都相同时,才会返回true
。- 特殊情况:
NaN
:因为NaN
不等于任何值,也包括自己,不管==
或者===
返回的都是false
。
五、JS的微任务和宏任务
JavaScript异步编程:宏任务与微任务详解_异步中宏任务与微任务 - CSDN博客
六、判断变量是不是数组
var arr = [1, 2, 3];
//方法1 isArray
console.log(Array.isArray(arr)); //返回布尔值
// 方法2 instanceof
console.log(arr instanceof Array); //返回布尔值
//方法3 原型 prototype
console.log(Object.prototype.toString.call(arr).indexOf('Array') > - 1);//返回布尔值
//方法4 isPrototypeOf()
console.log(Array.prototype.isPrototypeOf(arr)); // 返回布尔值
// 方法5 constructor
console.log(arr.constructor.toString().indexOf('Array') > - 1);//返回布尔值
七、slice
和splice
slice
截取数组,返回截取的数组,不会修改新的数组。
const arr = [1, 2, 3, 4, 5, 6];
console.log(arr.slice(1, 3)); // [2,3]
console.log(arr.slice(3)); // [4,5,6]
console.log(arr.slice(-3)); // [4,5,6]
splice
功能主要是插入,删除,替换。该方法会改变原本的数组。
const arr = [1, 2, 3, 4, 5, 6];
arr.splice(修改目标的索引,删除几个,添加的元素...);
八、JS数组去重的方法
方式一:new Set
const arr = [1, 1, 2, 3, 4, 5, 5, 6];
function unique(arr) {
return [...new Set(arr)];
}
方式二:indexOf
var arr = [1, 2, 3, 3, 5, 6, 6, 7, 6];
function unique(arr) {
var brr = [];
for (var i = 0; i < arr.length; i++) {
if (brr.indexOf(arr[i]) == -1) {
brr.push(arr[i]);
}
}
return brr;
}
方式三:sort
var arr = [1, 2, 3, 3, 5, 6, 6, 7, 6];
function unique(arr) {
arr = arr.sort();
var brr = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i]!== arr[i - 1]) {
brr.push(arr[i]);
}
}
return brr;
}
方式四:filter
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.filter((item, index) => array.indexOf(item) === index);
方式五:reduce
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.reduce((accumulator, currentValue) => {
return accumulator.includes(currentValue)? accumulator : [...accumulator, currentValue];
}, []);
方式六:双重for循环
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [];
for (let i = 0; i < array.length; i++) {
if (uniqueArray.indexOf(array[i]) === -1) {
uniqueArray.push(array[i]);
}
}
九、找出多维数组最大值
const arr = [
[4, 5, 6, 1, 4],
[13, 44, 22, 51],
[66, 34, 18, 23],
[233, 55, 11, 999],
];
function fnArr(arr) {
var newArr = [];
arr.forEach((item, index) => {
newArr.push(Math.max(...item));
});
return newArr;
}
十、给字符串新增方法实现功能
String.prototype.addPrefix = function (str) {
return str + this;
}
十一、找出字符串中出现最多的字符
var str = 'aaaaaabbbbccddddddddddddde';
var obj = {};
for (var i = 0; i < str.length; i++) {
var char = str.charAt(i);
if (obj[char]) {
obj[char]++;
} else {
obj[char] = 1;
}
}
console.log(obj);
//统计最大值
var max = 0;
for (var key in obj) {
if (max < obj[key]) {
max = obj[key];
}
}
//拿最大值去对比
for (var key in obj) {
if (obj[key] == max) {
console.log('最多的字符是' + key);
console.log('出现的次数是' + max);
}
}
console.log(obj);
十二、new
操作符具体做了什么
深入理解JavaScript中的new关键字_js new关键字 - CSDN博客
十三、闭包是什么?
深入理解JS闭包:优势、应用场景及最佳实践 - CSDN博客
十四、原型链
JS原型与原型链的设计哲学及应用_course.prototype - CSDN博客
原文地址:https://blog.csdn.net/cx18333/article/details/144667458
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!