嬴彻科技 前端工程师面试题

🌙
手机阅读
本文目录结构

嬴彻科技 前端工程师面试题

1. 请写出以下结果

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

结果:打印10次190

解析:

考察的是作用域和异步的知识点,这是js特有的知识点,其它程序语言没有

a:遇到异步代码,程序不等待,而将代码继续执行下去,即for循环先执行完,然后再过来执行setTime里的回调,此时i已被累加到10

b:由于js语言没有块级作用域,故而定时器内的的i就是外部的i的值,所以定时器内部打印的那个i,早就是10了

2. 请依次写下下列执行结果

var num=10;
var obj={
    num:8,
    inner:{
        num:6,
        print:function () {
            console.log(this.num);
        }
    }
}
//-----------解析-----------
num=888
//this代表上下文环境,谁调用,谁就是this,打印6,无可争议,
obj.inner.print();

//全局调用,此时的fn函数内的this就被定向到window全局了,全局之中的num为10,后来被改成了888
var fn=obj.inner.print;
fn();//888

//这个跟obj.inner.print()没区别
(obj.inner.print)();//6

//在全局下运行此函数,内部this指向的则为window
// 可以化解
// (obj.inner.print = function () {console.log(this.num);})()
// 再化简
// (function () {console.log(this.num);})()  注意知识点(xxx=123)会返回123
//会发现等价于var fn=obj.inner.print;  fn()   
(obj.inner.print = obj.inner.print)();//888

3. 请写出下列结果

var a=1
b=a
a=2
console.log(b,a)

var arr=[0,1]
var arrs=arr
arr[0]=1
console.log(arr,arrs)
结果:1,2
解析:考察基本数据类型和引用数据类型的拷贝,也就是深拷贝与浅拷贝,
a 基本类拷贝是直接复制一份在栈内存,以后两者互不影响
b 引用类型拷贝,是指针指向同一个堆内存地址,共享同一个值,相互关联

4. 请写出一下代码执行结果

var z=10;
function  foo() {
    console.log(z)
}

(function(funArg) {
    console.log(z)
})(foo)

结果:10

解析:后边那个自执行代码直接打印全局z的值,完事了,至于传参的那个函数,完全是干扰视觉

5. 请写出以下结果

function fun(n,o) {
    console.log(o)
    return {
        fun:function(m){
            return fun(m,n)
        }
    }
}
var a=fun(0); a.fun(1); a.fun(2); a.fun(3)
var b=fun(0).fun(1).fun(2).fun(3)
var c=fun(0).fun(1); c.fun(2);c.fun(3)

结果:一看题,就尼玛不想看了,长-乱

6. 请输出一下结果,并解释原因

function  test() {
    console.log(a) //undefined,js语言特性(bug),声明提升,赋值不会提升
    console.log(foo())  //2  js语言特性(bug),声明式函数存在提升
    var a=1;
    function foo() {
        return 2
    }
}
test()

7. 一行代码实现一下数组去重

var arr=[1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5]
//想考我es6是吧,太简单,es新增数据集合类型set,其特性就是不重复. 再结合es6给数组类新增的静态方法from构建新数组
console.log(Array.from(new Set(arr)))

8. 请输出一下结果

var a={n:1}
var b=a;
// js的赋值运算顺序是从右往左的,
// 不过由于“.”是优先级最高的运算符,所以这行代码先“计算”了a.x
// 这时候发生了这个事情——a指向的对象{n:1}新增了属性x(虽然这个x是undefined的)
// 然后接下来a={n:2} 使得a被重新指向堆内存中新的对象地址
//此时a和b是完全无关联的 对象
// 具体可参考:https://blog.csdn.net/yang295242361/article/details/78149872
a.x=a={n:2} 
console.log(a.x) //undefined
console.log(b.x) //Object

9. vue中 请写出一种实现无缝轮播的组件(思路)

请百度

10. 请简述vue声明周期

可以总共分为8个阶段:创建前/后, 载入前/后,更新前/后,销毁前/销毁后

简介常用的3个

created: 实例已经创建完成之后调用,在这一步,实例已经完成数据观测, 属性和方法的运算, watch/event事件回调. 然而, 挂载阶段还没有开始, $el属性目前还不可见
mounted: el被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。
activated: keep-alive组件激活时调用

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了