好未来面试-JS

1.html+css相关

假设有五个 div, 怎么让他们轮流 background-color 变为红色

//使用requestAnimationFrame来实现动画
const divList = document.querySelectorAll('.box')

let curIndex = 4
function render(){
    divList[curIndex].style.backgroundColor = 'blue'
    curIndex = (curIndex+1)%5
    divList[curIndex].style.backgroundColor = 'red'

}
let lastTime = undefined
function loop(timestamp){
    if(lastTime===undefined || timestamp-lastTime>=1000){
        lastTime = timestamp
        render()
    }
    requestAnimationFrame(loop)
}
requestAnimationFrame(loop)

css的transform,transition和animation

transform描述了静态样式,没有动画效果
    scale() translate() skew() 
transition是一种样式到另一种样式的过渡效果,有动画效果的
    值包含:property duration timing-function delay
animation是动画,由@keyframes来描述每一帧的样式
    值包含:name duration timing-function delay iteration-count direction

flex布局

主轴:justify-content 控制主轴布局: center flex-start flex-end space-between space-around
副轴:align-iterms 控制副轴布局 center flex-start flex-end space-between space-around
flex-direction:设置谁是主轴的(水平方向或者垂直方向)
flex-wrap:是否换行
flex-grow: 空间变大时,撑开
flex-shrink: 空间不够时,收缩 
flex: 复合属性包含flex-grow flex-shrink flex-basis

怎么判断元素是否到达可视区域

元素的top偏离量 - 滚动容器的上移高度 <= 滚动容器的客户端高度,此时元素达到可视区域!
el.offsetTop - scroller.scrollTop <= scroller.clientHeight

clientHeight: content+padding
offsetHeight: content+padding+border+滚动条
scrollHeight: content+padding+溢出的部分

offsetTop: 元素距离父容器顶部的距离(px)
scrollTop: 父容器内容顶部上移的距离(px)

2.闭包的理解和应用

闭包是一种结构,在一个函数内部,定义一个访问内部变量的函数,我们可以通过这个内部函数来访问函数的内部变量,这种结构就是闭包。
之所以需要闭包,是因为JS里面没有块级作用域的,只有函数作用域。闭包其实就是构造出一个作用域。
应用:
       for (var i = 0; i < 10; i++) {
        setTimeout(_ => { console.log(i)}, 1000)
    }
    // 10个10
    //闭包
    for(var i=0; i<10; i++){
        (function(i){
            setTimeout(_ => { console.log(i)}, 1000)
        })(i)
    }
    // 0 1 2 3 4 5 6 7 8 9 
    //es6引入 let后,产生了块级作用域
    for (let i = 0; i < 10; i++) {
        setTimeout(_ => { console.log(i)}, 1000)
    }
    //0 1 2 3 4 5 6 7 8 9 

3.Set和Map的理解,WeakSet和WeakMap

Set : 存放不重复元素的集合
    add() delete() has() size
    支持forEach()遍历

Map : 比json对象响应速度更快,灵活性更强
    set(key,value) get(key) delete(key) clear() size
    支持forEach()遍历
    * Map要想转换成字符串,需要先转换为json对象

WeakSet和Set的区别在于:
    WeakSet存放的是对象引用,不能存基本数据类型
    WeakSet存放的是对象弱引用,JS的垃圾回收机制不会考虑WeakSet的引用,即当其他引用不再引用对象时,该对象会被垃圾回收机制回收!

WeakMap同理。

12.怎么使用户保持登陆状态

13.用原型链给字符串声明一个函数

14.一百个人循环报数,报到五的人就淘汰,最后剩下一个人,使用算法来实现

15.将一句英文字符串按大小写反转,并以空格进行逆序,如“I am a student”,输出"STUDENT A AM i"

链表
JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。