前端笔试题积累

这篇博客探讨了如何找出数组中的最大数字,包括使用ES6的拓展运算符、for循环和数组reduce方法。此外,还介绍了JavaScript设计模式,如工厂模式、单例模式、观察者模式,并展示了构造函数模式的示例。接着,解释了变量声明、数组类型判断以及异步处理中的闭包问题,最后通过实际代码展示了如何正确使用setTimeout避免异步问题。
摘要由CSDN通过智能技术生成

1.有哪些方法可以找出数组 [1,6,8,3,9,10] 中最大的数字?


var arr =[1,6,8,3,9,10]

// 方法一:es6拓展运算符...
Math.max(...arr)
console.log(Math.max(...arr))   // 10

// 方法二:for 循环
let max=arr[0];
for(let i=0;i<arr.length-1;i++) {
	max =max<arr[i+1]?arr[i+1]:max
}
console.log(max)

// 方法三:数组reduce
var max = arr.reduce((num1,num2)=>{
	return num1>num2 ?num1:num2
})
console.log(max)

2.说一下了解的js设计模式,手写一个设计模式的方法。

 答: js设计模式是指一套代码设计,项目中合理的使用设计模式可以巧妙的解决很多问题。
      设计模式包括工厂模式、单例模式、观察者模式(发布-订阅)、代理模式、构造函数模式等等。
      工厂模式:使用一个共同的接口来指向新创建的对象
      单例模式:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建
      观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
      代理模式:为其他对象提供一种代理以控制对这个对象的访问
      构造函数模式:用于创建特定类型的对象

// 构造函数模式
function Person(name , age){
	this.name = name;
	this.age = age;
	this.sayName = function(){
		console.log(this.name)
	}
}
		 
var person1 = new Person('谷爱凌', 18)
var person2 = new Person('苏翊鸣', 18)
person1.sayName()  // 谷爱凌

// person1 和person2 分别保存着Person的一个不同的实例。
// 这两个对象都有一个constructor(构造函数)属性指向Person。

3.下面代码的输出是什么?

function sayHi() {
	console.log(name);  // undefined
	console.log(age);   // 报错 Uncaught ReferenceError: Cannot access 'age' before initialization
	var name = "Han";
	let age = 20;
}
sayHi();

4.let a=1,b=2;如何使用一行代码交换a、b 的值?

let a=1,b=2
if(a<b) [a,b]=[b,a]
console.log(a)  // 2
console.log(b)  // 1

5.有哪些方法可以判断一个变量的数据类型是Array?

// 1)利用Object的toString方法
	var list = [1,2,3];
	Object.prototype.toString.call(list);  
	console.log(Object.prototype.toString.call(list))  // [object Array]
// 2)利用ES6的Array.isArray()方法
	var list = [1,2,3];
	Array.isArray(list);
	console.log(Array.isArray(list)) //true

6.下面代码输出什么?

for(var i = 0; i < 10; i++) {
	setTimeout(() => {
		console.log(i)   // 打印10次10
	}, 0)
}

解析:
setTimeout()是一个异步处理函数,它会等待所有的主线程任务处理完,才开始执行自己内部的任务。
每隔0s往任务队列中添加一个任务(闭包函数,setTimeout()中的函数,现在还没执行),当主线程执行完时,这时i=10,才开始执行任务队列中的任务(执行10次)。

for循环括号内的就是主线程,执行完时i是10,所以会打印出10次10;

如果想打印出0,1,2,3,4,5,6,7,8,9 解决方案如下:

方案一:把var改为let,let是块级作用域,每次for循环都会把对应的i绑定到添加的任务中,所以当主线程执行完时,也不会影响到每个任务中的i。所以可以打印出0,1,2,3,4,5,6,7,8,9
for(let i = 0; i < 10; i++) {
	setTimeout(() => {
		console.log(i)   
	}, 0)
}


方案二:把定时器放在一个自执行函数中用i当做参数

for(var i = 0; i < 10; i++) {
  (function(i){
     setTimeout(function(){
        console.log(i);
     },1000)
  })(i)
}

7.下面方法会打印出什么?

let a = {name: "han"}, b = a
a.age = 20
a = {name: "han", age: 10}
console.log(b)    // {name: 'han', age: 20}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值