面试题集锦(JS-v1)

二、JS基础

1、javascript的typeof返回哪些数据类型

object number function boolean underfind string

typeof null;//object

typeof isNaN;//

typeof isNaN(123)

typeof [];//object

Array.isARRAY(); es5

toString.call([]);//”[object Array]”

var arr=[];

arr.constructor;//Array

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

强制(parseInt,parseFloat,Number())

隐式(==)

1==”1”//true

null==undefined//true

3、split() join() 的区别

前者是切割成数组的形式,

后者是将数组转换成字符串

4、数组方法pop() push() unshift() shift()

Push()尾部添加 pop()尾部删除

Unshift()头部添加 shift()头部删除

5、事件绑定和普通事件有什么区别

传统事件绑定和符合W3C标准的事件绑定有什么区别?

div1.onclick=function(){};

<button  onmouseover=””></button>

1、如果说给同一个元素绑定了两次或者多次相同类型的事件,那么后面的绑定会覆盖前面的绑定

2、不支持DOM事件流 事件捕获阶段è目标元素阶段=>事件冒泡阶段

addEventListener

1、  如果说给同一个元素绑定了两次或者多次相同类型的事件,所以的绑定将会依次触发

2、  支持DOM事件流的

3、  进行事件绑定传参不需要on前端

addEventListener(“click”,function(){},true);//此时的事件就是在事件冒泡阶段执行

ie9开始,ie11 edge:addEventListener

ie9以前:attachEvent/detachEvent

1、  进行事件类型传参需要带上on前缀

2、  这种方式只支持事件冒泡,不支持事件捕获

事件绑定是指把事件注册到具体的元素之上,普通事件指的是可以用来注册的事件

6、IE和DOM事件流的区别

1.执行顺序不一样、

2.参数不一样

3.事件加不加on

4.this指向问题

IE9以前attachEvent(“onclick”)、detachEvent(“onclick”)

IE9开始跟DOM事件流是一样的,都是addEventListener

7、IE和标准下有哪些兼容性的写法

var ev = ev || window.event

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

var target = ev.srcElement||ev.target

8callapply的区别

call和apply相同点:

都是为了用一个本不属于一个对象的方法,让这个对象去执行

 

toString.call([],1,2,3)

toString.apply([],[1,2,3])

Object.call(this,obj1,obj2,obj3)

Object.apply(this,arguments)

9b继承a的方法

考点:继承的多种方式

function b(){}

b.protoototype=new a;

10JavaScript this指针、闭包、作用域

this:指向调用上下文

闭包:内层作用域可以访问外层作用域的变量

作用域:定义一个函数就开辟了一个局部作用域,整个js执行环境有一个全局作用域

11、事件委托是什么

符合W3C标准的事件绑定addEventLisntener /attachEvent

让利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!

12、闭包是什么,有什么特性,对页面有什么影响

闭包就是能够读取其他函数内部变量的函数。

闭包的缺点:滥用闭包函数会造成内存泄露,因为闭包中引用到的包裹函数中定义的变量都永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数

13、如何阻止事件冒泡和默认事件

e. stopPropagation();//标准浏览器

event.canceBubble=true;//ie9之前

阻止默认事件:

为了不让a点击之后跳转,我们就要给他的点击事件进行阻止

return false

e.preventDefault();

14、添加 删除 替换 插入到某个接点的方法

obj.appendChild()

obj.insertBefore() //原生的js中不提供insertAfter();

obj.replaceChild()//替换

obj.removeChild()//删除

15、javascript的本地对象,内置对象和宿主对象

本地对象为array obj regexp等可以new实例化

内置对象为gload Math 等不可以实例化的

宿主为浏览器自带的document,window 等

16、document load 和document ready的区别

Document.onload 是在结构和样式加载完才执行js

window.onload:不仅仅要在结构和样式加载完,还要执行完所有的样式、图片这些资源文件,全部加载完才会触发window.onload事件

Document.ready原生种没有这个方法,jquery中有 $().ready(function)

17”==”“===”的不同

前者会自动转换类型

后者不会

1==”1”

null==undefined

===先判断左右两边的数据类型,如果数据类型不一致,直接返回false

   之后才会进行两边值的判断

18、javascript的同源策略

一段脚本只能读取来自于同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合

http,ftp:协议

主机名;localhost

端口名:80:http协议的默认端口

https:默认端口是8083

同源策略带来的麻烦:ajax在不同域名下的请求无法实现,

如果说想要请求其他来源的js文件,或者json数据,那么可以通过jsonp来解决

19、编写一个数组去重的方法

var arr=[1,1,3,4,2,4,7];

=>[1,3,4,2,7]

一个比较简单的实现就是:

1、  先创建一个空数组,用来保存最终的结果

2、  循环原数组中的每个元素

3、  再对每个元素进行二次循环,判断是否有与之相同的元素,如果没有,将把这个元素放到新数组中

4、  返回这个新数组

 

function oSort(arr) {  
var result ={};
var newArr=[];
for(var i=0;i<arr.length;i++){
if(!result[arr]) {
newArr.push(arr)
result[arr]=1
}
}
return newArr
}</arr.length;i++)

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

没有标准答案。

运行环境:浏览器中的JS引擎(v8.。。)

语言特性:面向对象,动态语言:

//动态语言的特性
var num=10;//num是一个数字类型
num="jim";//此时num又变成一个字符串类型
//我们把一个变量用来保存不同数据类型的语言称之为一个动态语言
//静态语言:c# java c c++
//静态语言在声明一个变量就已经确定了这个变量的数据类型,
//  而且在任何时候都不可以改变他的数据类型

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

基本特点

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

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

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

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

21、JavaScript的数据类型都有什么?

基本数据类型:String,Boolean,number,undefined,object,Null

引用数据类型:Object(Array,Date,RegExp,Function)

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

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

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

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

toString.call(18);//”[object Number]”

toString.call(“”);//”[object String]”

解析这种简单的数据类型直接通过typeof就可以直接判断

toString.call常用于判断数组、正则这些复杂类型

toString.call(/[0-9]{10}/)//”[object RegExp]”

 

 

 

 

 

 

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

  Array.isArray = function(arg){

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

    };

}

22、已知ID的Input输入框,希望获取这个输入框的输入值,怎么做?(不使用第三方框架)

 

document.getElementById(“ID”).value

23、希望获取到页面中所有的checkbox怎么做?(不使用第三方框架)

 

 

 

 

 

 

 

 

var domList = document.getElementsByTagName(‘input’)

var checkBoxList = [];//返回的所有的checkbox

var len = domList.length;  //缓存到局部变量

while (len--) {  //使用while的效率会比for循环更高

  if (domList[len].type == ‘checkbox’) {

      checkBoxList.push(domList[len]);

  }

}

24、设置一个已知ID的DIV的html内容为xxxx,字体颜色设置为黑色(不使用第三方框架)

 

 

 

var dom = document.getElementById(“ID”);

dom.innerHTML = “xxxx”

dom.style.color = “#000”

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

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

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

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

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

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

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

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

26、看下列代码输出为何?解释原因。

 

 

 

var a;

alert(typeof a); // “undefined”

//alert(b); // 报错

b=10;

alert(typeof b);//”number”

 

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

undefined会在以下三种情况下产生:

1、 一个变量定义了却没有被赋值

2、 想要获取一个对象上不存在的属性或者方法:

3、 一个数组中没有被赋值的元素

注意区分undefined跟not defnied(语法错误)是不一样的

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

 

 

var a = null;

alert(typeof a); //object

解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”。

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

 

 

 

 

 

 

 

 

 

var undefined;//此时undefined这个变量的值是undefined

undefined == null; // true

1 == true;   // true

此时会把布尔类型的值转换为数字类型 true=1 false=0

2 == true;   // false

0 == false;  // true

0 == '';     // true

NaN == NaN;  // false

[] == false; // true

[] == ![];   // true

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

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

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

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

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

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

 

 

 

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

console.log(foo);//111

console.log(typeof foo);

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

29、看代码给答案。

 

 

 

 

 

var a = new Object();

a.value = 1;

b = a; {value:1}

b.value = 2;

alert(a.value);//2

答案:2(考察引用数据类型细节)

30、已知数组var stringArray = [“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("-");//[get,element,by,id]

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

        arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);//Element

    }

    msg=arr.join("");//msg=” getElementById”

    return msg;

}

(考察基础API)

31、var numberArray = [3,6,2,4,1,5]; (考察基础API)

1) 实现对该数组的倒排,输出[5,1,4,2,6,3]

2) 实现对该数组的降序排列,输出[6,5,4,3,2,1]

 

 

 

 

 

 

 

 

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;

}

32、输出今天的日期,以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;

// 变成两位

month = month < 10 ? '0' + month : month;

// 获取日

var day = d.getDate();

day = day < 10 ? '0' + day : day;

alert(year + '-' + month + '-' + day);

33、将字符串”<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’);

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

 

function escapeHtml(str) {

//[<>”&]:中括号中字符只要其中的一个出现就代表满足条件

//给replace第二个参数传递一个回调函数,回调函数中参数就是匹配结果,如果匹配不到就是null

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

    switch (match) {

      case “<”:

         return “&lt;”;

      case “>”:

          return “&gt;”;

      case “&”:

          return “&amp;”;

      case “\””:

         return “&quot;”;

     }

  });

}

35foo = foo||bar ,这行代码是什么意思?为什么要这样写?

这种写法称之为短路表达式

答案:if(!foo) foo = bar; //如果foo存在,值不变,否则把bar的值赋给foo。

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

注意if条件的真假判定,记住以下是false的情况

空字符串、false、undefined、null、0

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

 

 

 

 

 

 

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引擎隐式地提升到当前作用域的顶部,但是只提升名称不会提升赋值部分。

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

 

 

 

 

 

 

 

 

 

var iArray = [];

funtion getRandom(istart, iend){

        var iChoice = istart - iend +1;

        return Math.floor(Math.random() * iChoice + istart;

}

Math.random()就是获取0-1之间的随机数(永远获取不到1)

for(var i=0; i<10; i++){

var result= getRandom(10,100);

        iArray.push(result);

}

iArray.sort();

 

 

38、把两个数组合并,并删除第二个元素。

 

 

 

 

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

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

var cArray = array1.concat(bArray);

cArray.splice(1,1);

39、怎样添加、移除、移动、复制、创建和查找节点(原生JS,实在基础,没细写每一步)

1)创建新节点

createDocumentFragment()    //创建一个DOM片段

createElement()   //创建一个具体的元素

createTextNode()   //创建一个文本节点

2)添加、移除、替换、插入

appendChild()      //添加

removeChild()      //移除

replaceChild()      //替换

insertBefore()      //插入

3)查找

getElementsByTagName()    //通过标签名称

getElementsByName()     //通过元素的Name属性的值

getElementById()        //通过元素Id,唯一性

40、有这样一个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;

}

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

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

邮箱的正则匹配:

 

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

24.看下面代码,给出输出结果。

 

 

 

 

 

for(var i=1;i<=3;i++){

  setTimeout(function(){

      console.log(i);   

  },0); 

};

答案:4 4 4。

原因:Javascript事件处理器在线程空闲之前不会运行。追问,如何让上述代码输出1 2 3?

 

 

 

 

 

 

 

 

for(var i=1;i<=3;i++){

   setTimeout((function(a){  //改成立即执行函数

       console.log(a);   

   })(i),0); 

};

1           //输出

2

3

42、写一个function,清除字符串前后的空格。(兼容所有浏览器)

使用自带接口trim(),考虑兼容性:

 

if (!String.prototype.trim) {

 String.prototype.trim = function() {

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

//\s匹配空白字符:回车、换行、制表符tab 空格

 }

}

 // test the function

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

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

43、Javascript中callee和caller的作用?

arguments.callee:获得当前函数的引用

caller是返回一个对函数的引用,该函数调用了当前函数;

callee是返回正在被执行的function函数,也就是所指定的function对象的正文。

那么问题来了?如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,第n个月能繁殖成多少对兔子?(使用callee完成)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

var result=[];

function fn(n){  //典型的斐波那契数列

   if(n==1){

        return 1;

   }else if(n==2){

           return 1;

   }else{

        if(result[n]){

                return result[n];

        }else{

                //argument.callee()表示fn()

                result[n]=arguments.callee(n-1)+arguments.callee(n-2);

                return result[n];

        }

   }

}

44、Javascript中, 以下哪条语句一定会产生运行错误?      答案(  BC   )

A、   var _变量=NaN;B、var 0bj = [];C、var obj = //;  D、var obj = {};

//正确答案:BC

45、以下两个变量a和b,a+b的哪个结果是NaN?      答案(   C  )

A、var a=undefind; b=NaN //拼写

B、var a=‘123’; b=NaN//字符串

C、var a =undefined , b =NaN

D、var a=NaN , b='undefined'//”Nan”

 

//var a=10; b=20; c=4;  ++b+c+a++
//21+4+10=35;

46、var a=10; b=20; c=4;  ++b+c+a++ 以下哪个结果是正确的?答案(  B  )

A、   34   B、35  C、36  D、37

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

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=”";

}

}

48、要将页面的状态栏中显示“已经选中该文本框”,下列JavaScript语句正确的是( A )

A. window.status=”已经选中该文本框”

B. document.status=”已经选中该文本框”

C. window.screen=”已经选中该文本框”

D. document.screen=”已经选中该文本框”

49、以下哪条语句会产生运行错误:(A)正确答案:A、D

 

       A.var obj = ();B.var obj = [];C.var obj = {};D.var obj = //;

50、以下哪个单词不属于javascript保留字:(B)

 

    A.with

    B.parent

    C.class

    D.void

51、请选择结果为真的表达式:(C)

 

    A.null instanceof Object

    B.null === undefined

    C.null == undefined

    D.NaN == NaN

52、Javascript中, 如果已知HTML页面中的某标签对象的id=”username”,用____document.getElementById(‘username’)___ _方法获得该标签对象。

53、typeof运算符返回值中有一个跟javascript数据类型不一致,它是________”function”_________。

typeof Number

typeof Object

54、定义了一个变量,但没有为该变量赋值,如果alert该变量,javascript弹出的对话框中显示___undefined______ 。

55、分析代码,得出正确的结果。

var a=10, b=20 , c=30;

++a;

a++;

e=++a+(++b)+(c++)+a++;

alert(e);

弹出提示对话框:77

var a=10, b=20 , c=30;
++a;//a=11
a++;//a=11
e=++a+(++b)+(c++)+a++;
//a=12  13+21+30+13=77
alert(e);

56、写出函数DateDemo的返回结果,系统时间假定为今天

function DateDemo(){

 var d, s="今天日期是:";

 d = new Date();

s += d.getMonth() + "/";

s += d.getDate() + "/";

s += d.getFullYear();

return s;}

结果:今天日期是:7/17/2010

57、写出程序运行的结果?

for(i=0, j=0; i<10, j<6; i++, j++){

k = i + j;}

结果:10

for(i=0, j=0; i<10, j<6; i++, j++){
    //j=5 i=5
    k = i + j;//k=10
}
//结果:10

58、阅读以下代码,请分析出结果:

    var arr = new Array(1 ,3 ,5);

    arr[4]='z';//[1,3,5,undefined,’z’]

    arr2 = arr.reverse();//arr2=[’z’,undefined,5,3,1];

                        //arr=[’z’,undefined,5,3,1]

    arr3 = arr.concat(arr2);

    alert(arr3);

弹出提示对话框:z,,5,3,1,z,,5,3,1

reverse 方法颠倒数组中元素的位置,并返回该数组的引用。

59、补充按钮事件的函数,确认用户是否退出当前页面,确认之后关闭窗口; <html>

<head>

<script type=”text/javascript” >

function closeWin(){

//在此处添加代码

if(confirm(“确定要退出吗?”)){

window.close();

}

}

</script>

</head>

<body>

<input type=”button”value=”关闭窗口”onclick=”closeWin()”/>

</body>

</html>

posted @ 2017-01-14 10:39  波吉大王子  阅读(114)  评论(0)    收藏  举报