干货,2016最新的WEB前端开发工程师面试题(JavaScript部分)2网页前端/web开发工程师

/ 福清师大外国语学院网页前端/web开发工程师 / 2017-04-08

WEB前端开发,WEB前端开发工程师,汇鱼人才

1、eval是做什么的?

它的功能是把对应的字符串解析成JS代码并运行;

应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。

JSON字符串转换为JSON对象的时候可以用evalvar obj =eval('('+ str +')');

 

nullundefined 的区别?

null        表示一个对象被定义了,值为空值

undefined   表示不存在这个值。

 

 

typeof undefined

    //"undefined"

    undefined :是一个表示""的原始值或者说表示"缺少值",就是此处应该有一个值,但是还没有定义。当尝试读取时会返回 undefined

    例如变量被声明了,但没有赋值时,就等于undefined

 

typeof null

    //"object"

    null : 是一个对象(空对象, 没有任何属性和方法)

    例如作为函数的参数,表示该函数的参数不是对象;

 

注意:

    在验证null时,一定要使用 === ,因为 == 无法分别 null 和 undefined

 

 

再来一个例子:

 

    null

    Q:有张三这个人么?

    A:有!

    Q:张三有房子么?

    A:没有!

 

    undefined

    Q:有张三这个人么?

    A:没有!

 

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

  // 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;

        }

    };

 

3["1", "2", "3"].map(parseInt) 答案是多少?

 [1, NaN, NaN] 因为 parseInt 需要两个参数 (val, radix)

 其中 radix 表示解析时用的基数。

 map 传了 3 (element, index, array),对应的 radix 不合法导致解析失败。

 

4事件是?IE与火狐的事件机制有什么区别? 如何阻止冒泡?

 1. 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。

 2. 事件处理机制:IE是事件冒泡、Firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件;

 3. ev.stopPropagation();(旧ie的方法 ev.cancelBubble = true;

 

5什么是闭包(closure),为什么要用它?

闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。

 

闭包的特性:

 

1.函数内再嵌套函数

2.内部函数可以引用外层的参数和变量

3.参数和变量不会被垃圾回收机制回收

 

//li节点的onclick事件都能正确的弹出当前被点击的li索引

 <ul id="testUL">

    <li> index = 0</li>

    <li> index = 1</li>

    <li> index = 2</li>

    <li> index = 3</li>

</ul>

<script type="text/javascript">

    var nodes = document.getElementsByTagName("li");

    for(i = 0;i<nodes.length;i+= 1){

        nodes[i].onclick = function(){

            console.log(i+1);//不用闭包的话,值每次都是4

        }(i);

    }

</script>

 

 

 

执行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

 

6javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?

use strict是一种ECMAscript 5 添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,

 

使JS编码更加规范化的模式,消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为。

默认支持的糟糕特性都会被禁用,比如不能用with,也不能在意外的情况下给全局变量赋值;

全局变量的显示声明,函数必须声明在顶层,不允许在非函数代码块内声明函数,arguments.callee也不允许使用;

消除代码运行的一些不安全之处,保证代码运行的安全,限制函数中的arguments修改,严格模式下的eval函数的行为和非严格模式的也不相同;

 

提高编译器效率,增加运行速度;

为未来新版本的Javascript标准化做铺垫。

 

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

  使用instanceof (待完善)

   if(a instanceof Person){

       alert('yes');

   }

 

8new操作符具体干了什么呢?

     1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。

     2、属性和方法被加入到 this 引用的对象中。

     3、新创建的对象由 this 所引用,并且最后隐式的返回 this

 

var obj  = {};

obj.__proto__ = Base.prototype;

Base.call(obj);

 

9Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?

hasOwnProperty

 

javaScripthasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。此方法无法检查该对象的原型链中是否具有该属性;该属性必须是对象本身的一个成员。

使用方法:

object.hasOwnProperty(proName)

其中参数object是必选项。一个对象的实例。

proName是必选项。一个属性名称的字符串值。

 

如果 object 具有指定名称的属性,那么JavaScripthasOwnProperty函数方法返回 true,反之则返回 false

 

想了解更多关于WEB前端开发工程师的内容敬请关注汇鱼人才



公众号,微信

汇鱼网海峡创乐汇
汇鱼网海峡创乐汇