JavaScript面试题集锦

1.js基础

1.eval是做什么的?

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

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

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

2.什么是window对象? 什么是document对象?

 window对象是指浏览器打开的窗口。

 document对象是Document对象(HTML 文档对象)的一个只读引用,window对象的一个属性。

3.null,undefined 的区别?

 null      表示一个对象是“没有值”的值,也就是值为“空”;

 undefined     表示一个变量声明了没有初始化(赋值);

 undefined不是一个有效的JSON,而null是;

 undefined的类型(typeof)是undefined;

 null的类型(typeof)是object;

 

 Javascript将未赋值的变量默认值设为undefined;

 Javascript从来不会将变量设为null。它是用来让程序员表明某个用var声明的变量时没有值的。

 typeof undefined

    //"undefined"

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

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

 typeof null

    //"object"

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

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

 

 注意:

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

    null == undefined // true

    null === undefined // false

 再来一个例子:

    null

    Q:有张三这个人么?

    A:有!

    Q:张三有房子么?

    A:没有!

 

    undefined

    Q:有张三这个人么?

    A:有!

    Q: 张三有多少岁?

    A: 不知道(没有被告诉)

* ["1", "2", "3"].map(parseInt) 答案是多少?
 parseInt() 函数能解析一个字符串,并返回一个整数,需要两个参数 (val, radix),

 其中 radix 表示要解析的数字的基数。【该值介于 2 ~ 36 之间,并且字符串中的数字不能大于radix才能正确返回数字结果值】;

 但此处 map 传了 3 个 (element, index, array),我们重写parseInt函数测试一下是否符合上面的规则。

 

 function parseInt(str, radix) {

     return str+'-'+radix;

 };

 var a=["1", "2", "3"];

 a.map(parseInt);  // ["1-0", "2-1", "3-2"] 不能大于radix

 

 因为二进制里面,没有数字3,导致出现超范围的radix赋值和不合法的进制解析,才会返回NaN

 所以["1", "2", "3"].map(parseInt) 答案也就是:[1, NaN, NaN]

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

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

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

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

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

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

 

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

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

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

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

 

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

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

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

 hasOwnProperty

 


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

 使用方法:

 object.hasOwnProperty(proName)

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

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

 

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

8.JSON 的了解?

 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。

 它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小

 如:{"age":"12", "name":"back"}

 

 JSON字符串转换为JSON对象:

 var obj =eval('('+ str +')');

 var obj = str.parseJSON();

 var obj = JSON.parse(str);

 

 JSON对象转换为JSON字符串:

 var last=obj.toJSONString();

 var last=JSON.stringify(obj);

9.js延迟加载的方式有哪些?

defer和async、动态创建DOM方式(用得最多)、按需异步载入js

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

  this === window ? 'browser' : 'node';

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

11.javascript的typeof返回哪些数据类型

alert(typeof [1, 2]); //object

    alert(typeof 'leipeng'); //string

    var i = true;

    alert(typeof i); //boolean

    alert(typeof 1); //number

 

 

    var a;

    alert(typeof a); //undefined

    function a(){;};

    alert(typeof a) //function

12.例举3种强制类型转换和2种隐式类型转换?

强制(parseInt(),parseFloat(),Number())

隐式(== ,!=)

13.split() 、join() 的区别

前者是切割成数组的形式,后者是将数组转换成字符串

14.数组方法pop() push() unshift() shift()

* push()尾部添加 pop()尾部删除
* unshift()头部添加 shift()头部删除
* map() : 遍历数组中的元素, 返回一个新数组(包含回调函数返回的数据)
* filter():遍历数组中的元素, 返回一个新数组(包含回调函数返回true的元素)
15.事件绑定和普通事件有什么区别

1)  普通添加事件的方法:

var btn = document.getElementById("hello");

btn.onclick = function(){

    alert(1);

}

btn.onclick = function(){

    alert(2);

}

执行上面的代码只会alert 2

 

*  事件绑定方式添加事件:
var btn = document.getElementById("hello");

btn.addEventListener("click",function(){

    alert(1);

},false);

btn.addEventListener("click",function(){

    alert(2);

},false);

执行上面的代码会先alert 1 再 alert 2

*  普通添加事件的方法不支持添加多个事件,最下面的事件会覆盖上面的,而事件绑定   (addEventListener)方式添加事件可以添加多个。
*  addEventListener不兼容低版本IE
*  普通事件无法取消
*  addEventLisntener还支持事件冒泡+事件捕获
* IE和DOM事件流的区别
1.执行顺序不一样、

2.参数不一样

3.事件加不加on

4.this指向问题

17.IE和标准下有哪些兼容性的写法

var ev = ev || window.event

document.documentElement.clientWidth || document.body.clientWidth

var target = ev.srcElement||ev.target

18.如何阻止事件冒泡和事件默认行为

//阻止事件冒泡

if(typeof ev.stopPropagation=='function') {  //标准的

    ev.stopPropagation();

} else { //非标准IE

    window.event.cancelBubble = true;

}

//阻止事件默认行为

return false

* window.onload 和document ready的区别
window.onload 是在dom文档树加载完和所有文件加载完之后执行一个函数
document.ready原生中没有这个方法,jquery中有 $().ready(function),在dom文档树加
载完之后执行一个函数(注意,这里面的文档树加载完不代表全部文件加载完)。

 

$(document).ready要比window.onload先执行

window.onload只能出来一次,$(document).ready可以出现多次

20.”==”和“===”的不同

前者会自动转换类型

后者不会

21.JavaScript是一门什么样的语言,它有哪些特点?


javaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。JavaScript兼容于ECMA标准,因此也称为ECMAScript。

 

基本特点

1. 是一种解释性脚本语言(代码不进行预编译)。

2. 主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。

3. 可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。

跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。

22.JavaScript的数据类型都有什么?

基本数据类型:String,boolean,Number,Undefined, Null

引用数据类型:Object, Array, Function

那么问题来了,如何判断某变量是否为数组数据类型?

方法一.判断其是否具有“数组性质”,如slice()方法。可自己给该变量定义slice方法, 故有时会失效

方法二.obj instanceof Array 在某些IE版本中不正确

方法三.方法一二皆有漏洞,在ECMA Script5中定义了新方法Array.isArray(), 保证其兼容 性,最好的方法如下:

    if(typeof Array.isArray==="undefined"){

   Array.isArray = function(arg){

         return Object.prototype.toString.call(arg)==="[object Array]"

     };  

}

23.当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做?

直接在DOM里绑定事件:<div onclick=”test()”></div>

在JS里通过onclick绑定:xxx.onclick = test

通过事件添加进行绑定:addEventListener(xxx, ‘click’, test)

那么问题来了,Javascript的事件流模型都有什么?

“事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播

“事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的

“DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡

24.看下列代码输出为何?解释原因。

var a;

alert(typeof a); // undefined

alert(b); // 报错

解释:Undefined是一个只有一个值的数据类型,这个值就是“undefined”,在使用var
声明变量但并未对其赋值进行初始化时,这个变量的值就是undefined。而b由于未声 明将报错。注意未申明的变量和声明了未赋值的是不一样的。

25.看下列代码,输出什么?解释原因。

var undefined;

undefined == null; // true

1 == true;   // true

2 == true;   // false

0 == false;  // true

0 == '';     // true

NaN == NaN;  // false

[] == false; // true

[] == ![];   // true // true  == false 打印false

 

undefined与null相等,但不恒等(===)

一个是number一个是string时,会尝试将string转换为number

尝试将boolean转换为number,0或1

尝试将Object转换成number或string,取决于另外一个对比量的类型

所以,对于0、空字符串的判断,建议使用 “===” 。“===”会先判断两边的值类型, 类型不匹配时为false。

那么问题来了,看下面的代码,输出什么,foo的值为什么?

var foo = "11"+2-"1";

console.log(foo);

console.log(typeof foo);

执行完后foo的值为111,foo的类型为String。

 

 

* 已知数组 var stringArr = [“This”,“ is”, “Baidu”, “Campus” ], Alert出 “This is
Baidu Campus”;
alert(stringArray.join(“”))

* 已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”

function combo(msg){

    var arr=msg.split("-");

    for(var i=1;i<arr.length;i++){

     arr[i]=arr[i].charAt(0).toUpperCase()+arr[i]

.substr(1,arr[i].length-1);

    }

    msg=arr.join("");

    return msg;

}

 

 

* 输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26

var d = new Date();

// 获取年,getFullYear()返回4位的数字

var year = d.getFullYear();

// 获取月,月份比较特殊,0是1月,11是12月

var month = d.getMonth() + 1;

var d = new Date();

// 获取年,getFullYear()返回4位的数字

var year = d.getFullYear();

// 获取月,月份比较特殊,0是1月,11是12月

var month = d.getMonth() + 1;

 

 

* 将字符串”<tr><td>{$id}</td><td>{$name}</td></tr>”中的{$id}替换成10,{$name}替换成Tony
(使用正则表达式)

"<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>".replace(/{\$id}/g,
'10').replace(/{\$name}/g, 'Tony');

 

* 为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义

function escapeHtml(str) {

return str.replace(/[<>”&]/g, function(match) {

    switch (match) {

                   case “<”:

                      return “<”;

                   case “>”:

                      return “>”;

                   case “&”:

                      return “&”;

                   case “\””:

                      return “"”;

      }

  });

}

 

 

* foo = foo||bar ,这行代码是什么意思?为什么要这样写?
如果foo存在,值不变,否则把bar的值赋给foo。

短路表达式:作为”&&”和”||”操作符的操作数表达式,这些表达式在进行求值时, 只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值。

* 看下列代码,将会输出什么?(变量声明提升)

var foo = 1;

(function(){

    console.log(foo);

    var foo = 2;

    console.log(foo);

})()

答案:输出undefined 和 2。上面代码相当于:

var foo = 1;

(function(){

    var foo;

    console.log(foo); //undefined

    foo = 2;

    console.log(foo); // 2;   

})()

函数声明与变量声明会被JavaScript引擎隐式地提升到当前作用域的顶部,但是只提升名称不会提升赋值部分。

 

 

 

* 用js实现随机选取10–100之间的10个数字,存入一个数组,并排序。

function randomNub(aArray, len, min, max) {

               if (len >= (max - min)) {

                   return '超过' + min + '-' + max + '之间的个数范围' + (max - min - 1)
+ '个的总数';

               }

               if (aArray.length >= len) {

                   aArray.sort(function(a, b) {

                       return a - b

                   });

                   return aArray;

               }

               var nowNub = parseInt(Math.random() * (max - min - 1)) + (min +
1);

               for (var j = 0; j < aArray.length; j++) {

                   if (nowNub == aArray[j]) {

                       randomNub(aArray, len, min, max);

                       return;

                   }

               }

               aArray.push(nowNub);

               randomNub(aArray, len, min, max);

               return aArray;

                 

                 var arr=[];

                 randomNub(arr,10,10,100);

 

 

34.把两个数组合并,并删除第二个元素。

var array1 = ['a','b','c'];

var bArray = ['d','e','f'];

var cArray = array1.concat(bArray);

cArray.splice(1,1);

35.有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL
中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:’1′, b:’2′, c:”, d:’xxx’
, e:undefined}。

function serilizeUrl(url) {

    var urlObject = {};

    if (/\?/.test(url)) {

        var urlString = url.substring(url.indexOf("?") + 1);

        var urlArray = urlString.split("&");

        for (var i = 0, len = urlArray.length; i < len; i++) {

            var urlItem = urlArray[i];

            var item = urlItem.split("=");

            urlObject[item[0]] = item[1];

        }

        return urlObject;

    }

    return null;

}

36.正则表达式构造函数var reg=new RegExp(“xxx”)与正则表达字面量var reg=//有什么不同?匹配邮箱的正则表达式?

当使用RegExp()构造函数的时候,不仅需要转义引号(即\”表示”),并且还需要双反斜杠(即\\表示一个\)。使用正则表达字面量的效率更高。 

邮箱的正则匹配:

    var regMail =
/^([a-zA-Z0-9_-])[email protected]([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;

37.写一个function,清除字符串前后的空格。

if (!String.prototype.trim) {

    String.prototype.trim = function() {

    return this.replace(/^\s+/, "").replace(/\s+$/,"");

 }

}

//测试 

var str = " \t\n test string ".trim();

alert(str == "test string"); // alerts "true"

38.以下两个变量a和b,a+b的哪个结果是NaN?

A、var a=undefined; b=NaN

B、var a= ‘123’; b=NaN X

C、var a =undefined , b =NaN

D、var a=NaN , b='undefined' X

39.下面的JavaScript语句中,( )实现检索当前页面中的表单元素中的所有文本框,并将它们全部清空

A. for(vari=0;i< form1.elements.length;i++) {

if(form1.elements.type==”text”)

form1.elements.value=”";}

B. for(vari=0;i<document.forms.length;i++) {

if(forms[0].elements.type==”text”)

forms[0].elements.value=”";

}

C. if(document.form.elements.type==”text”)

form.elements.value=”";

D. for(vari=0;i<document.forms.length; i++){

for(var j=0;j<document.forms.elements.length; j++){

if(document.forms.elements[j].type==”text”)

document.forms.elements[j].value=”";

}

}

40.typeof运算符返回值中有一个跟javascript数据类型不一致,它是?如何判断是不是数组?

Array,Array.isArray(data)