JavaScript面试技术问题

  • JavaScript原型,原型链?有什么特点?

  • 说几条写JavaScript的基本规范?

    1.不要在同一行声明多个变量。
    2.请使用 ===/!==来比较true/false或者数值
    3.使用对象字面量替代new Array这种形式
    4.不要使用全局函数。
    5.Switch语句必须带有default分支
    6.函数不应该有时候有返回值,有时候没有返回值。
    7.For循环必须使用大括号
    8.If语句必须使用大括号
    9.for-in循环中的变量 应该使用var关键字明确限定作用域,从而避免作用域污染。
  • eval是做什么的?

    它的功能是把对应的字符串解析成JS代码并运行;
    应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。
  • nullundefined的区别?

  • 写一个通用的事件侦听器函数。

        // event(事件)工具集,来源:github.com/markyun
        markyun.Event = {
            // 页面加载完成后
            readyEvent : function(fn) {
                if (fn==null) {
                    fn=document;
                }
                var oldonload = window.onload;
                if (typeof window.onload != 'function') {
                    window.onload = fn;
                } else {
                    window.onload = function() {
                        oldonload();
                        fn();
                    };
                }
            },
            // 视能力分别使用dom0||dom2||IE方式 来绑定事件
            // 参数: 操作的元素,事件名称 ,事件处理程序
            addEvent : function(element, type, handler) {
                if (element.addEventListener) {
                    //事件类型、需要执行的函数、是否捕捉
                    element.addEventListener(type, handler, false);
                } else if (element.attachEvent) {
                    element.attachEvent('on' + type, function() {
                        handler.call(element);
                    });
                } else {
                    element['on' + type] = handler;
                }
            },
            // 移除事件
            removeEvent : function(element, type, handler) {
                if (element.removeEventListener) {
                    element.removeEventListener(type, handler, false);
                } else if (element.datachEvent) {
                    element.detachEvent('on' + type, handler);
                } else {
                    element['on' + type] = null;
                }
            },
            // 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)
            stopPropagation : function(ev) {
                if (ev.stopPropagation) {
                    ev.stopPropagation();
                } else {
                    ev.cancelBubble = true;
                }
            },
            // 取消事件的默认行为
            preventDefault : function(event) {
                if (event.preventDefault) {
                    event.preventDefault();
                } else {
                    event.returnValue = false;
                }
            },
            // 获取事件目标
            getTarget : function(event) {
                return event.target || event.srcElement;
            },
            // 获取event对象的引用,取到事件的所有信息,确保随时能使用event
            getEvent : function(e) {
                var ev = e || window.event;
                if (!ev) {
                    var c = this.getEvent.caller;
                    while (c) {
                        ev = c.arguments[0];
                        if (ev && Event == ev.constructor) {
                            break;
                        }
                        c = c.caller;
                    }
                }
                return ev;
            }
        };
  • Node.js的适用场景?

    高并发、聊天、实时消息推送
  • 介绍js的基本数据类型。

    number,string,boolean,object,undefined
  • Javascript如何实现继承?

    通过原型和构造器
  • ["1","2", "3"].map(parseInt) 答案是多少?

     [1, NaN, NaN] 因为 parseInt 需要两个参数 (val, radix),其中 radix 表示解析时用的基数。map 传了 3 (element, index, array),对应的 radix 不合法导致解析失败。
  • 如何创建一个对象?(画出此对象的内存图)

      function Person(name, age) {
        this.name = name;
        this.age = age;
        this.sing = function() { alert(this.name) }
      }
  • 谈谈This对象的理解。

    thisjs的一个关键字,随着函数使用场合不同,this的值会发生变化。
    
    但是有一个总原则,那就是this指的是调用函数的那个对象。
    
    this一般情况下:是全局对象Global。 作为方法调用,那么this就是指这个对象
  • 事件是?IE与火狐的事件机制有什么区别?如何阻止冒泡?

     1. 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。
     2. 事件处理机制:IE是事件冒泡、火狐是 事件捕获;
     3. ev.stopPropagation();
  • 什么是闭包(closure),为什么要用它?

    执行say667(),say667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在.使得Javascript的垃圾回收机制GC不会收回say667()所占用的资源,因为say667()的内部函数的执行需要依赖say667()中的变量。这是对闭包作用的非常直白的描述.
    
      function say667() {
        // Local variable that ends up within closure
        var num = 666;
        var sayAlert = function() { alert(num); }
        num++;
        return sayAlert;
    }
    
     var sayAlert = say667();
     sayAlert()//执行结果应该弹出的667
  • "usestrict";是什么意思?使用它的好处和坏处分别是什么?

  • 如何判断一个对象是否属于某个类?

      使用instanceof (待完善)
    
       if(a instanceof Person){
           alert('yes');
       }
  • new操作符具体干了什么呢?

         1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
         2、属性和方法被加入到 this 引用的对象中。
         3、新创建的对象由 this 所引用,并且最后隐式的返回 this 
    
    var obj  = {};
    obj.__proto__ = Base.prototype;
    Base.call(obj);
  • Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?

    hasOwnProperty
  • JSON的了解?

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
    它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小
    {"age":"12", "name":"back"}
  • js延迟加载的方式有哪些?

    deferasync、动态创建DOM方式(用得最多)、按需异步载入js
  • ajax是什么?

  • 同步和异步的区别?

  • 如何解决跨域问题?

    jsonpiframewindow.namewindow.postMessage、服务器上设置代理页面
  • 模块化怎么做?

    立即执行函数,不暴露私有成员

        var module1 = (function(){
            var _count = 0;
            var m1 = function(){
              //...
            };
            var m2 = function(){
              //...
            };
            return {
              m1 : m1,
              m2 : m2
            };
          })();
  • AMDModules/Asynchronous-Definition)、CMDCommonModule Definition)规范区别?

  • 异步加载的方式有哪些?

      (1) defer,只支持IE
    
      (2) async
    
      (3) 创建script,插入到DOM中,加载完毕后callBack
  • documen.writeinnerHTML的区别

document.write只能重绘整个页面

innerHTML可以重绘页面的一部分

  • .call().apply()的区别?

      例子中用 add 来替换 subadd.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);
    
      注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
    
        function add(a,b)
        {
            alert(a+b);
        }
    
        function sub(a,b)
        {
            alert(a-b);
        }
    
        add.call(sub,3,1);
  • JqueryjQueryUI 有啥区别?

    *jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。
    
    *jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。
     提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等
  • JQuery的源码看过吗?能不能简单说一下它的实现原理?

  • jquery中如何将数组转化为json字符串,然后再转化回来?

jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:

    $.fn.stringifyArray = function(array) {
        return JSON.stringify(array)
    }

    $.fn.parseArray = function(array) {
        return JSON.parse(array)
    }

    然后调用:
    $("").stringifyArray(array)
  • 针对jQuery的优化方法?

    *基于Class的选择性的性能相对于Id选择器开销很大,因为需遍历所有DOM元素。
    
    *频繁操作的DOM,先缓存起来再操作。用Jquery的链式调用更好。
     比如:var str=$("a").attr("href");
    
    *for (var i = size; i < arr.length; i++) {}
     for 循环每一次循环都查找了数组 (arr) .length 属性,在开始循环的时候设置一个变量来存储这个数字,可以让循环跑得更快:
     for (var i = size, length = arr.length; i < length; i++) {}
  • JavaScript中的作用域与变量声明提升?

  • 如何编写高性能的Javascript

  • 那些操作会造成内存泄漏?

    内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
    垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
    
    setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
    闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
  • JQuery一个对象可以同时绑定多个事件,这是如何实现的?

  • 如何判断当前脚本运行在浏览器还是node环境中?(阿里)

    通过判断Global对象是否为window,如果不为window,当前脚本没有运行在浏览器中

其他问题

  • 你遇到过比较难的技术问题是?你是如何解决的?

  • 常使用的库有哪些?常用的前端开发工具?开发过什么应用或组件?

  • 页面重构怎么操作?

  • 列举IE与其他浏览器不一样的特性?

  • 99%的网站都需要被重构是那本书上写的?

  • 什么叫优雅降级和渐进增强?

  • WEB应用从服务器主动推送Data到客户端有那些方式?

  • Node的优点和缺点提出了自己的看法?

    *(优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,
      因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。
      此外,与Node代理服务器交互的客户端代码是由javascript语言编写的,
      因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
    
    *(缺点)Node是一个相对新的开源项目,所以不太稳定,它总是一直在变,
      而且缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。
  • 你有哪些性能优化的方法?

     (看雅虎14条性能优化原则)。
    
      1) 减少http请求次数:CSS Sprites, JSCSS源码压缩、图片大小控制合适;网页GzipCDN托管,data缓存 ,图片服务器。
    
      2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
    
      3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
    
      4) 当需要设置的样式很多时设置className而不是直接操作style
    
      5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
    
      6) 避免使用CSS Expressioncss表达式)又称Dynamic properties(动态属性)
    
      7) 图片预加载,将样式表放在顶部,将脚本放在底部  加上时间戳。
    
      8) 避免在页面的主体布局中使用tabletable要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢。
      对普通的网站有一个统一的思路,就是尽量向前端优化、减少数据库操作、减少磁盘IO。向前端优化指的是,在不影响功能和体验的情况下,能在浏览器执行的不要在服务端执行,能在缓存服务器上直接返回的不要到应用服务器,程序能直接取得的结果不要到外部取得,本机内能取得的数据不要到远程取,内存能取到的不要到磁盘取,缓存中有的不要去数据库查询。减少数据库操作指减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让你的程序完成(例如join查询),减少磁盘IO指尽量不使用文件系统作为缓存、减少读写文件次数等。程序优化永远要优化慢的部分,换语言是无法“优化”的。
  • http状态码有那些?分别代表是什么意思?

    100-199 用于指定客户端应相应的某些动作。
    200-299 用于表示请求成功。
    300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
    400-499 用于指出客户端的错误。400    1、语义有误,当前请求无法被服务器理解。401   当前请求需要用户验证 403  服务器已经理解请求,但是拒绝执行它。
    500-599 用于支持服务器错误。 503 – 服务不可用
  • 一个页面从输入URL到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好)

        查找浏览器缓存
        DNS解析、查找该域名对应的IP地址、重定向(301)、发出第二个GET请求
        进行HTTP协议会话
        客户端发送报头(请求报头)
        服务器回馈报头(响应报头)
        html文档开始下载
        文档树建立,根据标记请求所需指定MIME类型的文件
        文件显示
        [
        浏览器这边做的工作大致分为以下几步:
    
        加载:根据请求的URL进行域名解析,向服务器发起请求,接收文件(HTMLJSCSS、图象等)。
    
        解析:对加载到的资源(HTMLJSCSS等)进行语法解析,建议相应的内部数据结构(比如HTMLDOM树,JS的(对象)属性表,CSS的样式规则等等)
        }
  • 除了前端以外还了解什么其它技术么?你最最厉害的技能是什么?

  • 你常用的开发工具是什么,为什么?

  • 对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?

         前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近。
        1、实现界面交互
        2、提升用户体验
        3、有了Node.js,前端可以实现服务端的一些事情
    
    
    前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,
    
     参与项目,快速高质量完成实现效果图,精确到1px
    
     与团队成员,UI设计,产品经理的沟通;
    
     做好的页面结构,页面重构和用户体验;
    
     处理hack,兼容、写出优美的代码格式;
    
     针对服务器的优化、拥抱最新前端技术。
  • 加班的看法?

    加班就像借钱,原则应当是------救急不救穷
  • 平时如何管理你的项目?

            先期团队必须确定好全局样式(globe.css),编码模式(utf-8) 等;
    
            编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);
    
            标注样式编写人,各模块都及时标注(标注关键样式调用的地方);
    
            页面进行标注(例如 页面 模块 开始和结束);
    
            CSSHTML 分文件夹并行存放,命名都得统一(例如style.css);
    
            JS 分文件夹存放 命名以该JS功能为准的英文翻译。
    
            图片采用整合的 images.png png8 格式文件使用 尽量整合在一起使用方便将来的管理
  • 如何设计突发大规模并发架构?

  • 说说最近最流行的一些东西吧?常去哪些网站?

        Node.jsMongodbnpmMVVMMEANthree.js
  • 移动端(AndroidIOS)怎么做好用户体验?

        清晰的视觉纵线、信息的分组、极致的减法、
        利用选择代替输入、标签及文字的排布方式、
        依靠明文确认密码、合理的键盘利用、
  • 你在现在的团队处于什么样的角色,起到了什么明显的作用?

  • 你认为怎样才是全端工程师(FullStack developer)?

  • 介绍一个你最得意的作品吧?

  • 你的优点是什么?缺点是什么?

  • 如何管理前端团队?

  • 最近在学什么?能谈谈你未来35年给自己的规划吗?

  • 想问公司的问题?

        问公司问题:
        目前关注哪些最新的Web前端技术(未来的发展方向)?
        前端团队如何工作的(实现一个产品的流程)?
        公司的薪资结构是什么样子的?

前端学习网站推荐

1. 极客标签:     http://www.gbtags.com/

2. 码农周刊:     http://weekly.manong.io/issues/

3. 前端周刊:     http://www.feweekly.com/issues

4. 慕课网:       http://www.imooc.com/

5. div.iohttp://div.io 

6. Hacker Newshttps://news.ycombinator.com/news

7. InfoQhttp://www.infoq.com/

8. w3cplushttp://www.w3cplus.com/

9. Stack Overflowhttp://stackoverflow.com/

10.w3schoolhttp://www.w3school.com.cn/

11.mozillahttps://developer.mozilla.org/zh-CN/docs/Web/JavaScript


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值