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}