移动应用开发实验室web组js第一次考核
Magic.462 2024-10-02 15:03:02 阅读 74
请简述var,let,const的区别
var
var存在变量提升、暂时性死区可以重复赋值
let
let不存在变量提升、暂时性死区块级作用域可以重复赋值
const
const不存在变量提升、暂时性死区声明时必须定义值块级作用域
解释垃圾回收机制,垃圾回收的方式
垃圾回收机制
如果一个对象不再被程序中的任何部分所引用,那么这个对象就可以被回收。垃圾回收器会定期检查并回收这些不再被使用的内存空间
垃圾回收的方式
标记清除标记整理分代收集引用计数
以下代码的输出是什么
<code>var tmp=new Date()
function fn(){ -- -->
console.log(tmp);
if(false){
var tmp='hello world'code>
}
}
fn()
undefined
由于tmp只被定义了没被赋值,而if操作不会被执行
this的指向
var name = "window";
var person = { -- -->
name: "person",
sayName: function () {
console.log(this.name);//person
},
hello: () => console.log(this.name)//window
};
function sayName() {
var sss = person.sayName;
sss();//window
person.sayName();//person
(person.sayName)();//window,person.sayName 被引用并立即调用,但同样作为普通函数调用,而不是作为对象的方法
(b = person.sayName)();//window,同上种情况类似
person.hello()//window,箭头函数的this指向上下文的this值
}
sayName();
实现数组扁平化
let arr = [1, [2, [3, 4, 5]]]
方法1:使用递归
递归是一种直接且易于理解的方法,特别是当数组的嵌套层次未知时。
function flattenArray(arr) {
let result = [];
arr.forEach(item => {
if (Array.isArray(item)) {
result = result.concat(flattenArray(item));
} else {
result.push(item);
}
});
return result;
}
let arr = [1, [2, [3, 4, 5]]];
console.log(flattenArray(arr)); // 输出: [1, 2, 3, 4, 5]
方法2:使用扩展运算符(ES6+)
这种方法适用于嵌套层数较少且已知的情况,或者与递归结合使用。
function flattenArray(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
let arr = [1, [2, [3, 4, 5]]];
console.log(flattenArray(arr)); // 输出: [1, 2, 3, 4, 5]
方法3:使用栈(迭代方式)
迭代方式使用栈来模拟递归过程,对于深度较大的数组来说,可以避免递归可能导致的栈溢出问题。
function flattenArray(arr) {
let stack = [...arr];
let res = [];
while (stack.length) {
// pop 出 stack 的最后一个元素
let next = stack.pop();
if (Array.isArray(next)) {
// 如果是数组,则展开后并入 stack
stack.push(...next);
} else {
// 否则,添加到结果数组中
res.push(next);
}
}
// 注意:因为是从 stack 尾部取元素,所以结果需要反转
return res.reverse();
}
let arr = [1, [2, [3, 4, 5]]];
console.log(flattenArray(arr)); // 输出: [1, 2, 3, 4, 5]
方法4:使用flat()方法(ES2019+)
如果你使用的是较新的JavaScript环境(如ES2019及以上),则可以直接使用数组的flat()方法来实现扁平化
let arr = [1, [2, [3, 4, 5]]];
// Infinity 表示无论多少层嵌套都扁平化
console.log(arr.flat(Infinity)); // 输出: [1, 2, 3, 4, 5]
flat()方法接受一个参数,表示要展开的嵌套层数。如果参数是Infinity,则表示无论嵌套了多少层,都将展开成一层。
实现数组去重
const array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
方法1:使用Set
Set是ES6中引入的一种新的数据结构,它类似于数组,但是成员的值都是唯一的,没有重复的值。利用这个特性,我们可以很容易地去除数组中的重复元素
const array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // 输出: [1, 2, 3, 5, 9, 8]
方法2:使用filter()和indexOf()
filter()方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。而indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。利用这个特性,我们可以检查元素是否已经在结果数组中
const array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
const uniqueArray = array.filter((item, index, self) => {
return self.indexOf(item) === index;
});
console.log(uniqueArray); // 输出: [1, 2, 3, 5, 9, 8]
方法3:使用Map对象
Map对象保存键值对,并且一个键可以映射到最多一个值。利用这个特性,我们可以将数组中的元素作为键存储到Map对象中,然后获取Map对象的键组成一个新数组,从而实现去重
const array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
const map = new Map();
array.forEach(item => map.set(item, true));
const uniqueArray = Array.from(map.keys());
console.log(uniqueArray); // 输出: [1, 2, 3, 5, 9, 8]
方法4:使用reduce()
reduce()方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。这个方法也可以用来去重
const array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
const uniqueArray = array.reduce((acc, current) => {
if (acc.indexOf(current) === -1) acc.push(current);
return acc;
}, []);
console.log(uniqueArray); // 输出: [1, 2, 3, 5, 9, 8]
JS中的基本类型
number数字型
string字符串型
boolean布尔型 let isCool = true
undefined未定义型,没赋值,不确定是什么类型
null空类型
bigInt(范围比正常的number大)
symbol唯一的值
讲一下JS的事件流
事件流描述了当事件发生时,事件如何传播通过DOM的层次结构。主要有两种事件流模型被广泛认知:事件冒泡和事件捕获
事件冒泡
当事件在DOM的某个元素上被触发时,这个事件会沿着DOM树向上传播,依次触发祖先元素上的同名事件处理函数,直到达到最顶层的元素或者某个祖先元素阻止了事件的进一步传播
事件捕获
与事件冒泡相反,事件捕获是事件从DOM树的最顶层开始向下传播到目标元素的过程。这意味着,在事件到达目标元素之前,它会先触发目标元素的所有祖先元素上的事件处理函数
事件流
首先进行事件捕获,然后是目标元素本身的事件处理,最后是事件冒泡
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。