• 前端面试题目总结(一)


    1.判断下面输出内容,并尝试怎样正确输出0,1,2,3,4,5

    for (var i = 0; i <= 5; i++) {
        setTimeout(function timer(){
            console.log(i)
        }, i * 1000)
    }
    // 每过一秒打印出一个6
    // 6
    // 6
    // 6
    // 6
    // 6
    // 6

    解析:setTimeout是异步函数,所以会先把循环全部执行完毕,这时候 i 就是 6 了,所以会输出一堆 6

    解决办法:

    1.1.使用let

    for (let i = 0; i <= 5; i++) {
        setTimeout(function timer() {
            console.log(i)
        }, i * 1000)
    
    }
    // 0
    // 1
    // 2
    // 3
    // 4
    // 5

    解析:使用 let 定义 i 了来解决问题了

    1.2.使用自执行函数

    for (let i = 0; i <= 5; i++) {;
        (function timer(j) {
            setTimeout(function timer() {
                console.log(j)
            }, j * 1000)
        })(i)
    }
    // 自执行函数
    // 0
    // 1
    // 2
    // 3
    // 4
    // 5

    1.3.使用 setTimeout 的第三个参数,这个参数会被当成 timer 函数的参数传入

    for (let i = 0; i <= 5; i++) {
        setTimeout(function timer() {
            console.log(i)
        }, i * 1000, i)
    
    }
    // 使用 setTimeout 的第三个参数,这个参数会被当成 timer 函数的参数传入
    // 0
    // 1
    // 2
    // 3
    // 4
    // 5

    2.实现深浅拷贝的方法

    浅拷贝:

    方法一:object.assign()

    // 浅拷贝:方法一:Object.assign
    let a = {
        name: 'nancy',
        age: 27
    }
    
    let b = Object.assign(a)
    console.log(b)
    // {name: "nancy", age: 27}
    
    let a = {
        name: 'nancy',
        age: {
            date: '1992-02-22'
        }
    }
    
    let b = Object.assign(a)
    a.age.date = '1993'
    console.log(b)
    
    // {name: "nancy", age: {date: "1993"}}
    // 拷贝的只是引用地址,原地址的内容发生改变,新拷贝的内容也跟着变化

    方法二:扩展运算符:...

    // 方法二:... 扩展运算符
    
    let a = {
        name: 'nancy',
        age: 27
    }
    let b = { ...a
    }
    console.log(b)
    // {name: "nancy", age: 27}
    let a = {
        name: 'nancy',
        age: {
            date: '1992-02-22'
        }
    }
    a.age.date = '1993'
    let b = { ...a
    }
    console.log(b)
    // {name: "nancy", age: {date: "1993"}}
    // 拷贝的只是引用地址,原地址的内容发生改变,新拷贝的内容也跟着变化

    深拷贝:

    使用:JSON.parse(JSON.stringify(object))

    // 深拷贝
    let a = {
        name: 'nancy',
        age: {
            date: '1992'
        }
    }
    
    let b = JSON.parse(JSON.stringify(a))
    a.age.date = '1993'
    console.log(b)
    // {name: "nancy", age: {date: "1992"}}

    局限性:

    一:忽略undefined

    let a = {
        name: 'nancy',
        age: {
            date: undefined
        }
    }
    
    let b = JSON.parse(JSON.stringify(a))
    a.age.date = '1993'
    console.log(b)
    // {name: "nancy", age: {}}
    console.log(a)
    // {name: "nancy", age: {date: "1993"}}

    二:忽略symbol

    // 二:忽略symbol
    let a = {
        name: 'nancy',
        sex: {
            gender: Symbol('female')
        }
    }
    
    let b = JSON.parse(JSON.stringify(a))
    a.sex.gender = 'male'
    console.log(b)
    // {name: "nancy", sex: {}}
    console.log(a)
    // {name: "nancy", sex: {gender: "male"}}

    三:循环引用,会报错

    // 循环引用,这种方法会报错
    let obj = {
        a: 1,
        b: {
            c: 2,
            d: 3,
        },
    }
    obj.c = obj.b
    obj.e = obj.a
    obj.b.c = obj.c
    obj.b.d = obj.b
    obj.b.e = obj.b.c
    let newObj = JSON.parse(JSON.stringify(obj))
    console.log(newObj)
    // 报错 Uncaught TypeError: Converting circular structure to JSON

    四:不能序列化函数

    // 不能序列化函数
    let a = {
        age: undefined,
        sex: Symbol('male'),
        jobs: function () {},
        name: 'nancy'
    }
    let b = JSON.parse(JSON.stringify(a))
    console.log(b) // {name: "nancy"}
  • 相关阅读:
    My97DatePicker使用说明文档
    内存溢出之Tomcat内存配置
    myeclipse控制台不显示tomcat信息
    修改 MyEclipse 编辑区域背景颜色
    window.open() 弹出窗体居中
    javascript控制页面控件隐藏显示的两种方法
    (转)MyEclipse7.5.0版注册码破解及激活操作
    [置顶] Android代码读取 android 设备的电池信息
    [置顶] Android代码获得我们手机的cpu序列号
    [置顶] Android高手进阶教程Android常用名令集锦(图文并茂)!
  • 原文地址:https://www.cnblogs.com/shengnan-2017/p/10213985.html
Copyright © 2020-2023  润新知