大前端JS部分基础面试题(含答案)(一)

简介: 大前端JS部分基础面试题(含答案)

1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构?

基本数据类型:Undefined、Null、Boolean、Number、String值类型:数值、布尔值、null、undefined。引用类型:对象、数组、函数。堆栈数据结构:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出!js数组中提供了以下几个方法可以让我们很方便实现堆栈:shift:从数组中把第一个元素删除,并返回这个元素的值。unshift: 在数组的开头添加一个或更多元素,并返回新的长度push:在数组的中末尾添加元素,并返回新的长度pop:从数组中把最后一个元素删除,并返回这个元素的值。


2.声明函数作用提升?声明变量和声明函数的提升有什么区别?

(1) 变量声明提升:变量申明在进入执行上下文就完成了。只要变量在代码中进行了声明,无论它在哪个位置上进行声明, js引擎都会将它的声明放在范围作用域的顶部;
(2) 函数声明提升:执行代码之前会先读取函数声明,意味着可以把函数申明放在调用它的语句后面。只要函数在代码中进行了声明,无论它在哪个位置上进行声明, js引擎都会将它的声明放在范围作用域的顶部;
(3) 变量or函数声明:函数声明会覆盖变量声明,但不会覆盖变量赋值。同一个名称标识a,即有变量声明var a,又有函数声明function a() {},不管二者声明的顺序,函数声明会覆盖变量声明,也就是说,此时a的值是声明的函数function a() {}。注意:如果在变量声明的同时初始化a,或是之后对a进行赋值,此时a的值变量的值。eg: var a; var c = 1; a = 1; function a() { return true; } console.log(a);

3.判断数据类型?

typeof返回的类型都是字符串形式,可以判断function的类型;在判断除Object类型的对象时比较方便。判断已知对象类型的方法: instanceof,后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。

4.异步编程?

方法1:回调函数,优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱,而且每个任务只能指定一个回调函数。
方法2:时间监听,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以“去耦合”(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。
方法3:发布/订阅,性质与“事件监听”类似,但是明显优于后者。
方法4:Promises对象,是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。简单说,它的思想是,每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。

5.事件流?事件捕获?事件冒泡?

事件流:从页面中接收事件的顺序。也就是说当一个事件产生时,这个事件的传播过程,就是事件流。
IE中的事件流叫事件冒泡;事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档)。对于html来说,就是当一个元素产生了一个事件,它会把这个事件传递给它的父元素,父元素接收到了之后,还要继续传递给它的上一级元素,就这样一直传播到document对象(亲测现在的浏览器到window对象,只有IE8及下不这样
事件捕获是不太具体的元素应该更早接受到事件,而最具体的节点应该最后接收到事件。他们的用意是在事件到达目标之前就捕获它;也就是跟冒泡的过程正好相反,以html的click事件为例,document对象(DOM级规范要求从document开始传播,但是现在的浏览器是从window对象开始的)最先接收到click事件的然后事件沿着DOM树依次向下传播,一直传播到事件的实际目标;

6.如何清除一个定时器?

window.clearInterval();window.clearTimeout();

7.如何添加一个dom对象到body中?innerHTML和innerText区别?

body.appendChild(dom元素);innerHTML:从对象的起始位置到终止位置的全部内容,包括Html标签。innerText:从起始位置到终止位置的内容, 但它去除Html标签分别简述五个window对象、属性
成员对象window.event window.document window.historywindow.screen window.navigator window.externalWindow对象的属性如下:window //窗户自身window.self //引用本窗户window=window.selfwindow.name //为窗户命名window.defaultStatus //设定窗户状态栏信息window.location //URL地址,配备布置这个属性可以打开新的页面

8.数据持久化技术(ajax)?简述ajax流程

1)客户端产生js的事件2)创建XMLHttpRequest对象3)对XMLHttpRequest进行配置4)通过AJAX引擎发送异步请求5)服务器端接收请求并且处理请求,返回html或者xml内容6)XML调用一个callback()处理响应回来的内容7)页面局部刷新

9.回调函数?

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

10.什么是闭包?* 堆栈溢出有什么区别? 内存泄漏? 那些操作会造成内存泄漏?怎么样防止内存泄漏?

闭包:就是能够读取其他函数内部变量的函数。堆栈溢出:就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了别的数据。经常会在递归中发生。内存泄露是指:用动态存储分配函数内存空间,在使用完毕后未释放,导致一直占据该内存单元。直到程序结束。指任何对象在您不再拥有或需要它之后仍然存在。
造成内存泄漏:setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)防止内存泄露:1、不要动态绑定事件;2、不要在动态添加,或者会被动态移除的dom上绑事件,用事件冒泡在父容器监听事件;3、如果要违反上面的原则,必须提供destroy方法,保证移除dom后事件也被移除,这点可以参考Backbone的源代码,做的比较好;4、单例化,少创建dom,少绑事件。

11.平时工作中怎么样进行数据交互?如果后台没有提供数据怎么样进行开发?mock数据与后台返回的格式不同意怎么办?

由后台编写接口文档、提供数据接口实、前台通过ajax访问实现数据交互;在没有数据的情况下寻找后台提供静态数据或者自己定义mock数据;返回数据不统一时编写映射文件 对数据进行映射。

12 简述ajax执行流程

1

2

3

4

5

6

7

基本步骤:varxhr =null;//创建对象

if(window.XMLHttpRequest){

       xhr = newXMLHttpRequest();}else{

       xhr = newActiveXObject("Microsoft.XMLHTTP");}xhr.open(“方式”,”地址”,”标志位”);//初始化请求

   xhr.setRequestHeader(“”,””);//设置http头信息

xhr.onreadystatechange =function(){}//指定回调函数

xhr.send();//发送请求

13.自执行函数?用于什么场景?好处?

自执行函数:1、声明一个匿名函数2、马上调用这个匿名函数。作用:创建一个独立的作用域。
好处:防止变量弥散到全局,以免各种js库冲突。隔离作用域避免污染,或者截断作用域链,避免闭包造成引用变量无法释放。利用立即执行特性,返回需要的业务函数或对象,避免每次通过条件判断来处理
场景:一般用于框架、插件等场景

14.html和xhtml有什么区别?

HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的标记语言。1.XHTML 元素必须被正确地嵌套。2.XHTML 元素必须被关闭。3.标签名必须用小写字母。4.空标签也必须被关闭。5.XHTML 文档必须拥有根元素。

15. 什么是构造函数?与普通函数有什么区别?

构造函数:是一种特殊的方法、主要用来创建对象时初始化对象,总与new运算符一起使用,创建对象的语句中构造函数的函数名必须与类名完全相同。与普通函数相比只能由new关键字调用,构造函数是类的标示

16. 通过new创建一个对象的时候,函数内部有哪些改变

1

functionPerson(){}Person.prototype.friend = [];Person.prototype.name = '';// var a = new Person();// a.friend[0] = '王琦';// a.name = '程娇';// var b = new Person();// b.friend?// b.name?

1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。2、属性和方法被加入到 this 引用的对象中。3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。

17.事件委托?有什么好处?

(1)利用冒泡的原理,把事件加到父级上,触发执行效果(2)好处:新添加的元素还会有之前的事件;提高性能。

18.window.onload ==? DOMContentLoaded ?

一般情况下,DOMContentLoaded事件要在window.onload之前执行,当DOM树构建完成的时候就会执行DOMContentLoaded事件,而window.onload是在页面载入完成的时候,才执行,这其中包括图片等元素。大多数时候我们只是想在DOM树构建完成后,绑定事件到元素,我们并不需要图片元素,加上有时候加载外域图片的速度非常缓慢。

19.节点类型?判断当前节点类型?

1. 元素节点2. 属性节点3. 文本节点8. 注释节点9. 文档节点通过nodeObject.nodeType判断节点类型:其中,nodeObject 为DOM节点(节点对象)。该属性返回以数字表示的节点类型,例如,元素节点返回 1,属性节点返回 2 。

20.如何合并两个数组?数组删除一个元素?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

//三种方法。 (1)var arr1=[1,2,3];

               vararr2=[4,5,6];

               arr1 = arr1.concat(arr2);

               console.log(arr1);

 (2)vararr1=[1,2,3];

               vararr2=[4,5,6];

               Array.prototype.push.apply(arr1,arr2);

               console.log(arr1);

 (3)vararr1=[1,2,3];

               vararr2=[4,5,6];

               for(vari=0; i < arr2.length; i++) {

                   arr1.push( arr2[i] );

               }

               console.log(arr1);

21.强制转换 显式转换 隐式转换?

1

2

3

4

5

6

7

8

9

10

//强制类型转换:

Boolean(0)                // => false - 零

           Boolean(newobject())   // => true - 对象

               Number(undefined)       // =>   NaN

               Number(null)              // => 0

               String(null)              // => "null"

parseInt( )

parseFloat( )

JSON.parse( )

JSON.stringify ( )

隐式类型转换:在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加。之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的(例如:x+"" //等价于String(x)+x //等价于Number(x)x-0 //同上!!x //等价于Boolean(x),是双叹号)
显式转换:如果程序要求一定要将某一类型的数据转换为另一种类型,则可以利用强制类型转换运算符进行转换,这种强制转换过程称为显示转换。显示转换是你定义让这个值类型转换成你要用的值类型,是底到高的转换。例 int 到float就可以直接转,int i=5,想把他转换成char类型,就用显式转换(char)i

22. Jq中如何实现多库并存?

Noconfict 多库共存就是“ ”符号的冲突。方法一:利用jQuery的实用函数 ”符号的冲突。 方法一: 利用jQuery的实用函数.noConflict();这个函数归还 使的名称控制权给另一个库,因此可以在页面上使用其他库。这时,我们可以用"jQuery"这个名称调用jQuery的功能。的名称控制权给另一个库,因此可以在页面上使用其他库。这时,我们可以用"jQuery "这个名称调用jQuery的功能。 .noConflict();jQuery('#id').hide();.....//或者给jQuery一个别名var j=jQueryj=jQueryj('#id').hide();.....
方法二: (function( ))(jQuery)方法三:jQuery(function(){})(jQuery) 方法三: jQuery(function(){})通过传递一个函数作为jQuery的参数,因此把这个函数声明为就绪函数。 我们声明$为就绪函数的参数,因为jQuery总是吧jQuery对象的引用作为第一个参数传递,所以就保证了函数的执行。

23.Jq中get和eq有什么区别?

get() :取得其中一个匹配的元素。num表示取得第几个匹配的元素,get多针对集合元素,返回的是DOM对象组成的数组 eq():获取第N个元素,下标都是从0开始,返回的是一个JQuery对象

24.如何通过原生js 判断一个元素当前是显示还是隐藏状态?

1

2

3

4

if( document.getElementById("div").css("display")==='none')

if( document.getElementById("div").css("display")==='block')

$("#div").is(":hidden"); // 判断是否隐藏

$("#div").is(":visible")

25.Jq如何判断元素显示隐藏?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

//第一种:使用CSS属性

vardisplay =$('#id').css('display');

if(display == 'none'){    alert("我是隐藏的!"); }

//第二种:使用jquery内置选择器

<div id="test"> <p>仅仅是测试所用</p> </div>

if($("#test").is(":hidden")){       

    $("#test").show();   

    //如果元素为隐藏,则将它显现

}else{      

    $("#test").hide();    

    //如果元素为显现,则将其隐藏

}

//第三种:jQuery判断元素是否显示 是否隐藏

varnode=$('#id');

if(node.is(':hidden')){  //如果node是隐藏的则显示node元素,否则隐藏

  node.show(); 

}else{

  node.hide();

}

26.移动端上什么是点击穿透?

点击穿透现象有3种:点击穿透问题:点击蒙层(mask)上的关闭按钮,蒙层消失后发现触发了按钮下面元素的click事件跨页面点击穿透问题:如果按钮下面恰好是一个有href属性的a标签,那么页面就会发生跳转另一种跨页面点击穿透问题:这次没有mask了,直接点击页内按钮跳转至新页,然后发现新页面中对应位置元素的click事件被触发了
解决方案:1、只用touch最简单的解决方案,完美解决点击穿透问题把页面内所有click全部换成touch事件( touchstart 、’touchend’、’tap’)
2、只用click下下策,因为会带来300ms延迟,页面内任何一个自定义交互都将增加300毫秒延迟
3、tap后延迟350ms再隐藏mask改动最小,缺点是隐藏mask变慢了,350ms还是能感觉到慢的
4、pointer-events比较麻烦且有缺陷, 不建议使用mask隐藏后,给按钮下面元素添上 pointer-events: none; 样式,让click穿过去,350ms后去掉这个样式,恢复响应缺陷是mask消失后的的350ms内,用户可以看到按钮下面的元素点着没反应,如果用户手速很快的话一定会发现

27.Jq绑定事件的几种方式?on bind ?

jQuery中提供了四种事件监听方式,分别是bind、live、delegate、on,对应的解除监听的函数分别是unbind、die、undelegate、off
Bind( )是使用频率较高的一种,作用就是在选择到的元素上绑定特定事件类型的监听函数;
Live( )可以对后生成的元素也可以绑定相应的事件,处理机制就是把事件绑定在DOM树的根节点上,而不是直接绑定在某个元素上;
Delegate( )采用了事件委托的概念,不是直接为子元素绑定事件,而是为其父元素(或祖先元素也可)绑定事件,当在p内任意元素上点击时,事件会一层层从event target向上冒泡,直至到达你为其绑定事件的元素;
on( )方法可以绑定动态添加到页面元素的事件,on()方法绑定事件可以提升效率;

28.Jq中如何将一个jq对象转化为dom对象?

方法一:jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的DOM对象。如:var v=v =("#v") ; //jQuery对象var v= v[0];//DOM对象alert(v.checked)//检测这个checkbox是否被选中方法二:jQuery本身提供,通过.get(index)方法,得到相应的DOM对象如:varv[0]; //DOM对象alert(v.checked) //检测这个checkbox是否被选中 方法二:jQuery本身提供,通过.get(index)方法,得到相应的DOM对象如:var v= ("#v"); //jQuery对象var v=("#v"); //jQuery对象var v=("#v"); //jQuery对象var v=v.get(0); //DOM对象alert(v.checked) //检测这个checkbox是否被选中

29.Jq中有几种选择器?分别是什么?

层叠选择器、基本过滤选择器、内容过滤选择器、可视化过滤选择器、属性过滤选择器、子元素过滤选择器、表单元素选择器、表单元素过滤选择器

30.Jq中怎么样编写插件?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

//第一种是类级别的插件开发://1.1 添加一个新的全局函数 添加一个全局函数,我们只需如下定义:

jQuery.foo = function() {

     alert('This is a test. This is only a test.');  };   //1.2 增加多个全局函数 添加多个全局函数,可采用如下定义:

jQuery.foo = function() {

       alert('This is a test. This is only a test.');  };  jQuery.bar = function(param) {

      alert('This function takes a parameter, which is "'+ param + '".');  };   调用时和一个函数的一样的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar');//1.3 使用jQuery.extend(object); 

jQuery.extend({

      foo: function() {

          alert('This is a test. This is only a test.');

        },

      bar: function(param) {

          alert('This function takes a parameter, which is "'+ param +'".');

        }

     }); //1.4 使用命名空间// 虽然在jQuery命名空间中,我们禁止使用了大量的javaScript函数名和变量名。// 但是仍然不可避免某些函数或变量名将于其他jQuery插件冲突,因此我们习惯将一些方法// 封装到另一个自定义的命名空间。jQuery.myPlugin = {         foo:function() {        

  alert('This is a test. This is only a test.');        

 },        

 bar:function(param) {        

  alert('This function takes a parameter, which is "'+ param + '".');  

 }        }; //采用命名空间的函数仍然是全局函数,调用时采用的方法:

$.myPlugin.foo();        $.myPlugin.bar('baz');//通过这个技巧(使用独立的插件名),我们可以避免命名空间内函数的冲突。//第二种是对象级别的插件开发//形式1:

(function($){   

  $.fn.extend({   

   pluginName:function(opt,callback){   

             // Our plugin implementation code goes here.     

   }   

  })    })(jQuery);  //形式2:(function($) {     

   $.fn.pluginName = function() {   

        // Our plugin implementation code goes here.   

   };     })(jQuery);//形参是$,函数定义完成之后,把jQuery这个实参传递进去.立即调用执行。//这样的好处是,我们在写jQuery插件时,也可以使用$这个别名,而不会与prototype引起冲突

31.(′p+.ab′)和('p+.ab')和('.ab+p') 哪个效率高?

$('p+.ab')效率高

32..map和.map和.each有什么区别

map()方法主要用来遍历操作数组和对象,会返回一个新的数组。$.map()方法适用于将数组或对象每个项目新阵列映射到一个新数组的函数;each()主要用于遍历jquery对象,返回的是原来的数组,并不会新创建一个数组。

33.编写一个 getElementsByClassName 封装函数?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

<body>   <input type="submit"id = "sub"class="ss confirm btn"value="提交"/>   <script> window.onload = function(){ //方法一        

    varOpt = document.getElementById('sub');

    vargetClass = function(className,tagName){

        if(document.getElementsByTagName){

            varInp = document.getElementsByTagName(tagName);

            for(vari=0; i<Inp.length; i++){

                if((newRegExp('(\\s|^)'+className +'(\\s|$)')).test(Inp[i].className)){

                      returnInp[i];

                    }

                }

            }elseif(document.getElementsByClassName){

                returndocument.getElementsByClassName(className);

        }

    }                 //方法二    var aa = getClass("confirm", "input");

        functiongetClass(className, targetName){

            varele = [];

            varall = document.getElementsByTagName(targetName || "*");

            for(vari=0; i<all.length; i++){

                if(all[i].className.match(newRegExp('(\\s|^)'+confirm+'(\\s|$)'))){   

                    ele[ele.length] = all[i];

                }

            }

            returnele;

        }//方法三    function getObjsByClass(tagName, className){

           if(document.getElementsByClassName){

               alert("document.getElementsByClassName");

               returndocument.getElementsByClassName(className);

           }else{

               varel = [];

               var_el = document.getElementsByTagName(tagName);

               for(vari=0; i<_el.length; i++){

                   if(_el[i].className.indexOf(className) > -1){

                       alert(_el[i]);

                       el[_el.length] = _el[i];

                   }

               }

               alert(el);

               returnel;

           }

       }

   }

 </script></body>

34.简述下工作流程

我在之前的公司工作流程大概是这样的:公司定稿会结束以后,会进行简单的技术研讨,然后我们前端会进行先期的技术准备。前端切图人员会进行psd设计稿切图,并且将css文件进行整合。我们主要编写JS部分,其中包括搭建前端框架(大项目),编写js业务和数据持久化操作,我们也会编写js插件并且进行封装方便使用,还有就是编写JS前端组建和JS测试单元,最后将完成的JS部分与切图人员提供的HTML页面进行整合。最后对完成的页面进行功能测试、页面兼容、产品还原。然后对产品进行封存,提交测试。如果出现BUG会返回给我们开发人员进行修改,再提交测试,最后测试成功,进行版本封存。等到程序全部上线的时候进行线上测试。

35.一般使用什么版本控制工具?svn如何对文件加锁

svn加锁目的:为了避免多个人同一时间对同一个文件改动的相互覆盖,版本控制系统就必须有一套冲突处理机制。
svn加锁两种策略:乐观加锁:所有签出的文件都是可读写的,对文件的修改不必获得文件的锁,当你修改完文件签入时,会首先要求你更新本地文件,版本控制系统不会覆盖你的本地修改,而是会让你自己合并冲突后签入。
严格加锁:所有签出的文件都是只读的,任何对文件的修改必须要获得文件的锁,如果其他人没有拥有该文件的锁,那么版本控制系统就会授权给你文件的锁,并将文件设置为可编辑的。
svn两种加锁步骤:乐观加锁:选择你想要获取锁定的文件,然后右键菜单点击TortoiseSVN 选取获取锁定。
严格加锁:在想要采取严格加锁的文件或目录上点击右键,使用TortoiseSVN 属性菜单,点击新建属性,选择需要锁定。

36. git 和 svn的区别?

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

37. jquery和zepto有什么区别?

1.针对移动端程序,Zepto有一些基本的触摸事件可以用来做触摸屏交互(tap事件、swipe事件),Zepto是不支持IE浏览器的,这不是Zepto的开发者Thomas Fucks在跨浏览器问题上犯了迷糊,而是经过了认真考虑后为了降低文件尺寸而做出的决定,就像jQuery的团队在2.0版中不再支持旧版的IE(6 7 8)一样。因为Zepto使用jQuery句法,所以它在文档中建议把jQuery作为IE上的后备库。那样程序仍能在IE中,而其他浏览器则能享受到Zepto在文件大小上的优势,然而它们两个的API不是完全兼容的,所以使用这种方法时一定要小心,并要做充分的测试。
2.Dom操作的区别:添加id时jQuery不会生效而Zepto会生效。
3.zepto主要用在移动设备上,只支持较新的浏览器,好处是代码量比较小,性能也较好。jquery主要是兼容性好,可以跑在各种pc,移动上,好处是兼容各种浏览器,缺点是代码量大,同时考虑兼容,性能也不够好。

38. (function())和window.onload和(function(){})和window.onload 和 (document).ready(function(){})

window.onload:用于当页面的所有元素,包括外部引用文件,图片等都加载完毕时运行函数内的函数。load方法只能执行一次,如果在js文件里写了多个,只能执行最后一个。
(document).ready(function())和(document).ready(function(){})和(function(){})都是用于当页面的标准DOM元素被解析成DOM树后就执行内部函数。这个函数是可以在js文件里多次编写的,对于多人共同编写的js就有很大的优势,因为所有行为函数都会执行到。而且$(document).ready()函数在HMTL结构加载完后就可以执行,不需要等大型文件加载或者不存在的连接等耗时工作完成才执行,效率高。

39. Jq中 attr 和 prop 有什么区别

对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。

40. 简述下 this 和定义属性和方法的时候有什么区别?Prototype?

this表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window; 如果在函数中使用this,则this指代什么是根据运行时此函数在什么对象上被调用。 我们还可以使用apply和call两个全局方法来改变函数中this的具体指向。
prototype本质上还是一个JavaScript对象。 并且每个函数都有一个默认的prototype属性。
在prototype上定义的属性方法为所有实例共享,所有实例皆引用到同一个对象,单一实例对原型上的属性进行修改,也会影响到所有其他实例。

41. 什么是预编译语音|预编译处理器?

Sass是一种CSS预处理器语言,通过编程方式生成CSS代码。因为可编程,所以操控灵活性自由度高,方便实现一些直接编写CSS代码较困难的代码。
同时,因为Sass是生成CSS的语言,所以写出来的Sass文件是不能直接用的,必须经过编译器编译成CSS文件才能使用。
CSS 预处理器是一种语言用来为 CSS 增加一些编程的的特性,无需考虑浏览器的兼容性问题,例如你可以在 CSS 中使用变量、简单的程序逻辑、函数等等在编程语言中的一些基本技巧,可以让你的 CSS 更见简洁,适应性更强,代码更直观等诸多好处。最常用的css预处理器有sass、less css、 stylus。

42.ajax 和 jsonp ?

ajax和jsonp的区别:相同点:都是请求一个url不同点:ajax的核心是通过xmlHttpRequest获取内容jsonp的核心则是动态添加标签来调用服务器 提供的js脚本。</blockquote>

大前端JS部分基础面试题(含答案)(二):https://developer.aliyun.com/article/1413391

相关文章
|
12小时前
|
存储 缓存 监控
2024春招小红书前端面试题分享
2024春招小红书前端面试题分享
14 3
|
3天前
|
XML 前端开发 JavaScript
前端简介(HTML+CSS+JS)
前端简介(HTML+CSS+JS)
|
3天前
|
前端开发 JavaScript 数据处理
前端新手指南:如何解决JavaScript导出CSV文件不完整的问题
【6月更文挑战第4天】在JavaScript中处理CSV文件时,需要特别注意一些特殊字符,例如逗号、双引号、换行符等。这些字符可能会影响CSV文件的解析,导致数据错乱。
17 0
|
3天前
|
JavaScript 前端开发 网络协议
前端JS发起的请求能暂停吗?
在讨论前端JS发起的请求是否能暂停时,需要明确两个概念:什么状态可以被认为是“暂停”?以及什么是JS发起的请求?
59 1
前端JS发起的请求能暂停吗?
|
5天前
|
存储 前端开发 JavaScript
前端面试题23-34
通过对 Promise 和 ECMAScript6 的深入理解,可以更好地应对现代 JavaScript 开发中的复杂异步操作和新特性,提升代码质量和开发效率。
10 2
|
5天前
|
前端开发 JavaScript 虚拟化
前端面试题12-22
ES6(ECMAScript 2015)是 JavaScript 的重要版本,引入了许多新特性和语法,提升了语言的功能和可用性。ES6 的主要特性包括箭头函数、类、模板字符串、解构赋值、默认参数、Promise、模块化、Generator 函数、async 函数、Proxy 和 Reflect 等。这些特性不仅简化了代码的编写和维护,还为开发者提供了更多的编程范式和工具。了解和掌握 ES6 的特性是现代 JavaScript 开发的必备技能。
6 1
|
5天前
|
JSON 前端开发 JavaScript
前端面试题01-11
Map是ES6引入的一种新的键值对集合数据结构,类似于对象,但键的范围不限于字符串,还可以是任何类型的值。Map保持键值对的插入顺序,提供更灵活的键值对操作方法,如`set()`、`get()`、`delete()`、`has()`等。
5 1
|
6天前
|
前端开发 JavaScript 安全
TypeScript作为一种静态类型的JavaScript超集,其强大的类型系统和面向对象编程特性为微前端架构的实现提供了有力的支持
【6月更文挑战第11天】微前端架构借助TypeScript提升开发效率和代码可靠性。 TypeScript提供类型安全,防止微前端间通信出错;智能提示和自动补全加速跨代码库开发;重构支持简化代码更新。通过定义公共接口确保一致性,用TypeScript编写微前端以保证质量。集成到构建流程确保顺利构建打包。在微前端场景中,TypeScript是强有力的语言选择。
23 2
|
11天前
|
Web App开发 资源调度 JavaScript
【保姆级】前端使用node.js基础教程
【6月更文挑战第3天】Node.js 是基于 Chrome V8 引擎的 JavaScript 运行环境,用于服务器端编程。常用命令包括:安装 Node.js,通过 `node -v` 查看版本;使用 npm(Node 包管理器)进行初始化、安装/卸载包、查看版本和更新;运行 `.js` 脚本;使用 `node inspect` 调试;借助 nodemon 实现自动重启;通过 `npm list` 管理包;
5 0
|
1月前
|
JSON JavaScript 前端开发
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗