前端面试题

作者: LJQ21 | 来源:发表于2018-04-12 11:02 被阅读0次

    数组去重

    indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置。

    新建一新数组,遍历传入数组,值不在新数组就push进该新数组中

    ```

    function unip(array){

    var team=[]

    for(var i=0 ; i

    if(team.indexOf(array[i])<0){

    team.push(array[i]);

    }

    }

    return team

    }

    var arr=[1,2,3,4,5,6,7,7,7,8,8,9]

    console.log(unip(arr));

    ```

    ES6里新添加了两个很好用的东西,set和Array.from。

    set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目。

    Array.from的作用,就是可以把类数组对象、可迭代对象转化为数组

    ```

    var arr1=[1,2,3,4,4,5,5,6,7,7]

    var arr2= new Set(arr1)

    var arr3= Array.from(arr2)

    console.log(arr3)

    ```

    JavaScript中如何检测一个变量是一个String类型?请写出函数实现

    ```

    typeof(obj) === "string"

    typeof 37 === 'number';

    typeof function(){} === 'function';

    ```

    请用js去除字符串空格

    1)去除所有空格: str = str.replace(/\s*/g,"");

     2)str.trim()局限性:无法去除中间的空格

    var str = "   xiao  ming   ";

    var str2 = str.trim();

    console.log(str2);   //xiao  ming

    str.trimLeft(),str.trimRight()分别用于去除字符串左右空格

     3)使用jquery,$.trim(str)方法

    你如何获取浏览器URL中查询字符串中的参数?

    split()方法用于把一个字符串分割成字符串数组。

    function showWindowHref(){

        var sHref = "http://www.runoob.com/jquery/misc-trim.html?channelid=12333&name=xiaoming&age=23"

        var args = sHref.split('?');

        if(args[0] == sHref){

            return "";

        }

        var arr = args[1].split('&');

        var obj = {};

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

            var arg = arr[i].split('=');

            obj[arg[0]] = arg[1];

        }

        return obj;

    }

    var href = showWindowHref(); // obj

    console.log(href); // xiaoming

    js 字符串操作函数

    concat() –将两个或多个字符的文本组合起来,返回一个新的字符串。

    indexOf() –返回字符串中一个子串第一处出现的索引。如果没有匹配项,返回 -1 。

    charAt() –返回指定位置的字符。

    lastIndexOf() –返回字符串中一个子串最后一处出现的索引,如果没有匹配项,返回 -1 。

    match() –检查一个字符串是否匹配一个正则表达式。

    substr()函数 -- 返回从string的startPos位置,长度为length的字符串

    substring() –返回字符串的一个子串。传入参数是起始位置和结束位置。

    slice() –提取字符串的一部分,并返回一个新字符串。

    replace() –用来查找匹配一个正则表达式的字符串,然后使用新字符串代替匹配的字符串。

    search() –执行一个正则表达式匹配查找。如果查找成功,返回字符串中匹配的索引值。否则返回 -1 。

    split() –通过将字符串划分成子串,将一个字符串做成一个字符串数组。

    length –返回字符串的长度,所谓字符串的长度是指其包含的字符的个数。

    toLowerCase() –将整个字符串转成小写字母。

    toUpperCase() –将整个字符串转成大写字母

    怎样添加、移除、移动、复制、创建和查找节点?

    1)创建新节

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

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

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

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

      appendChild() //添加

      removeChild() //移除

      replaceChild() //替换

      insertBefore() //插入

    3)查找

      getElementsByTagName() //通过标签名称

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

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

    js判断字符是否为空的方法

    function isEmpty(obj){

        if(typeof obj == "undefined" || obj == null || obj == ""){

            return true;

        }else{

            return false;

        }

    }

    如何理解闭包?

    由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

    所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

    它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

    根据作用域链的规则,底层作用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。这里明显count 是函数内部的flag2 的那个count 。

    var count=10;   //全局作用域 标记为flag1function add(){

        var count=0;    //函数全局作用域 标记为flag2

        return function(){

            count+=1;   //函数的内部作用域        alert(count);

        }

    }var s = add()

    s();//输出1

    s();//输出2

    变量的作用域

    要理解闭包,首先必须理解Javascript特殊的变量作用域。

    变量的作用域分类:全局变量和局部变量。

    特点:

    1、函数内部可以读取函数外部的全局变量;在函数外部无法读取函数内的局部变量。

    2、函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

    使用闭包的注意点

    1)滥用闭包,会造成内存泄漏:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

    2)会改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

    什么是跨域?

    由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。存在跨域的情况:

    网络协议不同,如http协议访问https协议。

    端口不同,如80端口访问8080端口。

    域名不同,如qianduanblog.com访问baidu.com。

    子域名不同,如abc.qianduanblog.com访问def.qianduanblog.com。

    域名和域名对应ip,如www.a.com访问20.205.28.90.

    跨域请求资源的方法:

    porxy代理

    定义和用法:proxy代理用于将请求发送给后台服务器,通过服务器来发送请求,然后将请求的结果传递给前端。

    实现方法:通过nginx代理;

    注意点:1、如果你代理的是https协议的请求,那么你的proxy首先需要信任该证书(尤其是自定义证书)或者忽略证书检查,否则你的请求无法成功。

    CORS【Cross-Origin Resource Sharing】

    定义和用法:是现代浏览器支持跨域资源请求的一种最常用的方式。

    使用方法:一般需要后端人员在处理请求数据的时候,添加允许跨域的相关操作

    jsonp

    定义和用法:通过动态插入一个script标签。浏览器对script的资源引用没有同源限制,同时资源加载到页面后会立即执行(没有阻塞的情况下)。

    特点:通过情况下,通过动态创建script来读取他域的动态资源,获取的数据一般为json格式

    缺点:1、这种方式无法发送post请求(这里)

    [if !supportLists]2、[endif]另外要确定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来判定。

    垃圾回收机制

    垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

    开发过程中遇到的内存泄露情况,如何解决的?

    1、定义和用法:

    内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。C#和Java等语言采用了自动垃圾回收方法管理内存,几乎不会发生内存泄露。我们知道,浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露。

    2、内存泄露的几种情况:

    (1)、当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。

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

        btn.onclick = function(){

        btn.onclick = null;

            document.getElementById("myDiv").innerHTML = "Processing...";

        }

    [if !supportLists](2) [endif]、由于是函数内定义函数,并且内部函数--事件回调的引用外暴了,形成了闭包。闭包可以维持函数内局部变量,使其得不到释放。

    function bindEvent(){

        var obj=document.createElement("XXX");

        obj.onclick=function(){

             //Even if it's a empty function    }

        obj=null;

    }

    JavaScript数组(Array)对象

    Array对象属性

    constructor返回对创建此对象的数组函数的引用。

    length设置或返回数组中元素的数目。

    prototype使您有能力向对象添加属性和方法。

    Array对象方法

    concat()连接两个或更多的数组,并返回结果。

    join()把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。

    pop()删除并返回数组的最后一个元素。  

    shift()删除并返回数组的第一个元素

    push()向数组的末尾添加一个或更多元素,并返回新的长度。

    unshift()向数组的开头添加一个或更多元素,并返回新的长度。

    reverse()颠倒数组中元素的顺序。

    slice()从某个已有的数组返回选定的元素

    sort()对数组的元素进行排序

    splice()删除元素,并向数组添加新元素。

    toSource()返回该对象的源代码。

    toString()把数组转换为字符串,并返回结果。

    toLocaleString()把数组转换为本地数组,并返回结果。

    valueOf()返回数组对象的原始值

    jQuery库中的 $() 是什么?

    $()函数是 jQuery() 函数的别称。$() 函数用于将任何对象包裹成 jQuery 对象,接着你就被允许调用定义在 jQuery 对象上的多个不同方法。你可以将一个选择器字符串传入 $() 函数,它会返回一个包含所有匹配的 DOM 元素数组的 jQuery 对象。

    如何找到所有HTML select标签的选中项?

    $('[name=selectname] :selected')

    $(this)和 this 关键字在 jQuery 中有何不同?

    $(this)返回一个 jQuery 对象,你可以对它调用多个 jQuery 方法,比如用 text() 获取文本,用val() 获取值等等。

    而this代表当前元素,它是 JavaScript 关键词中的一个,表示上下文中的当前 DOM 元素。你不能对它调用 jQuery 方法,直到它被 $() 函数包裹,例如 $(this)。

    jquery怎么移除标签onclick属性?

    jQuery属性操作 - attr() 方法

    获得a标签的onclick属性: $("a").attr("onclick")

    删除onclick属性:$("a").removeAttr("onclick");

    设置onclick属性:$("a").attr("onclick","test();");

    jquery中addClass,removeClass,toggleClass的使用。

    $(selector).addClass(class):为每个匹配的元素添加指定的类名

    $(selector).removeClass(class):从所有匹配的元素中删除全部或者指定的类,删除class中某个值;

    $(selector).toggleClass(class):如果存在(不存在)就删除(添加)一个类

    $(selector).removeAttr(class);删除class这个属性;

    JQuery有几种选择器?

    (1)、基本选择器:#id,class,element,*;

    (2)、层次选择器:parent > child,prev + next ,prev ~ siblings

    (3)、基本过滤器选择器::first,:last ,:not ,:even ,:odd ,:eq ,:gt ,:lt

    (4)、内容过滤器选择器: :contains ,:empty ,:has ,:parent

    (5)、可见性过滤器选择器::hidden ,:visible

    (6)、属性过滤器选择器:[attribute] ,[attribute=value] ,[attribute!=value] ,[attribute^=value] ,[attribute$=value] ,[attribute*=value]

    (7)、子元素过滤器选择器::nth-child ,:first-child ,:last-child ,:only-child

    (8)、表单选择器: :input ,:text ,:password ,:radio ,:checkbox ,:submit 等;

    (9)、表单过滤器选择器::enabled ,:disabled ,:checked ,:selected

    $(document).ready()方法和window.onload有什么区别?

    (1)、window.onload方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行的。

    (2)、$(document).ready() 方法可以在DOM载入就绪时就对其进行操纵,并调用执行绑定的函数。

    如何用jQuery禁用浏览器的前进后退按钮?

      $(document).ready(function() {

        window.history.forward(1);

        //OR window.history.forward(-1);  });

    jquery中$.get()提交和$.post()提交有区别吗?

    相同点:都是异步请求的方式来获取服务端的数据;

    异同点:

    1、请求方式不同:$.get() 方法使用GET方法来进行异步请求的。$.post() 方法使用POST方法来进行异步请求的。

    2、参数传递方式不同:get请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器的,这种传递是对用户不可见的。

    3、数据传输大小不同:get方式传输的数据大小不能超过2KB 而POST要大的多

    4、安全问题: GET 方式请求的数据会被浏览器缓存起来,因此有安全问题。

    写出一个简单的$.ajax()的请求方式?

    $.ajax({

        url:'http://www.baidu.com',

        type:'POST',

        data:data,

        cache:true,

        headers:{},

    beforeSend:function(){},

        success:function(){},

        error:function(){},

        complete:function(){}

    });

    什么是盒子模型?

    在网页中,一个元素占有空间的大小由几个部分构成,其中包括元素的内容(content),元素的内边距(padding),元素的边框(border),元素的外边距(margin)四个部分。这四个部分占有的空间中,有的部分可以显示相应的内容,而有的部分只用来分隔相邻的区域或区域。4个部分一起构成了css中元素的盒模型。

    行内元素有哪些?块级元素有哪些?空(void)元素有那些?

    行内元素:a、b、span、img、input、strong、select、label、em、button、textarea块级元素:div、ul、li、dl、dt、dd、p、h1-h6、blockquote空元素:即系没有内容的HTML元素,例如:br、meta、hr、link、input、img

    简述一下src与href的区别

    href是指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,用于超链接。

    src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。

    简述同步和异步的区别

    同步是阻塞模式,异步是非阻塞模式。同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。

    px和em的区别

    相同点:px和em都是长度单位;

    异同点:px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,并且em会继承父级元素的字体大小。浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。

    浏览器的内核分别是什么?

    IE: trident内核

    Firefox:gecko内核

    Safari:webkit内核

    Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核

    Chrome:Blink(基于webkit,Google与Opera Software共同开发)

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

    渐进增强progressive enhancement:

    针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

    优雅降级graceful degradation:

    一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

    区别:

    a.优雅降级是从复杂的现状开始,并试图减少用户体验的供给

    b.渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要

    c.降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带

    sessionStorage、localStorage 和 cookie 之间的区别

    共同点:用于浏览器端存储的缓存数据

    不同点:

    (1)、存储内容是否发送到服务器端:当设置了Cookie后,数据会发送到服务器端,造成一定的宽带浪费; web storage,会将数据保存到本地,不会造成宽带浪费;

    (2)、数据存储大小不同:Cookie数据不能超过4K,适用于会话标识;web storage数据存储可以达到5M;

    (3)、数据存储的有效期限不同:cookie只在设置了Cookid过期时间之前一直有效,即使关闭窗口或者浏览器;sessionStorage,仅在关闭浏览器之前有效;localStorage,数据存储永久有效;

    (4)、作用域不同:cookie和localStorage是在同源同窗口中都是共享的;sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;

    Ajax的优缺点及工作原理?

    定义和用法:

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。Ajax 是一种用于创建快速动态网页的技术。Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

    传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。

    优点:

    1.减轻服务器的负担,按需取数据,最大程度的减少冗余请求

    2.局部刷新页面,减少用户心理和实际的等待时间,带来更好的用户体验

    3.基于xml标准化,并被广泛支持,不需安装插件等,进一步促进页面和数据的分离

    缺点:

    1.AJAX大量的使用了javascript和ajax引擎,这些取决于浏览器的支持.在编写的时候考虑对浏览器的兼容性.

    2.AJAX只是局部刷新,所以页面的后退按钮是没有用的.

    3.对流媒体还有移动设备的支持不是太好等

    AJAX的工作原理:

    1.创建ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))

    2.判断数据传输方式(GET/POST)

    3.打开链接 open()

    4.发送 send()

    5.当ajax对象完成第四步(onreadystatechange)数据接收完成,判断http响应状态(status)200-300之间或者304(缓存)执行回调函数

    请指出document load和document ready的区别?

    共同点:这两种事件都代表的是页面文档加载时触发。

    异同点:

    ready事件的触发,表示文档结构已经加载完成(不包含图片等非文字媒体文件)。

    onload事件的触发,表示页面包含图片等文件在内的所有元素都加载完成

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

    function trim(str) {

        if (str && typeof str === "string") {

            return str.replace(/(^\s*)|(\s*)$/g,""); //去除前后空白符    }

    }

    使用正则表达式验证邮箱格式

     var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/;

     var email = "example@qq.com";

     console.log(reg.test(email));  // true  

    规避javascript多人开发函数重名问题

    命名空间

    封闭空间

    js模块化mvc(数据层、表现层、控制层)

    seajs

    变量转换成对象的属性

    对象化

    请说出三种减低页面加载时间的方法

    压缩css、js文件

    合并js、css文件,减少http请求

    外部js、css文件放在最底下

    减少dom操作,尽可能用变量替代不必要的dom操作

    你所了解到的Web攻击技术

    [if !supportLists](1)[endif]XSS(Cross-Site Scripting,跨站脚本攻击):指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或者JavaScript进行的一种攻击。(2)SQL注入攻击(3)CSRF(Cross-Site Request Forgeries,跨站点请求伪造):指攻击者通过设置好的陷阱,强制对已完成的认证用户进行非预期的个人信息或设定信息等某些状态更新。

    web前端开发,如何提高页面性能优化?

    内容方面:

    1.减少 HTTP 请求 (Make Fewer HTTP Requests)

    2.减少 DOM 元素数量 (Reduce the Number of DOM Elements)

    3.使得 Ajax 可缓存 (Make Ajax Cacheable)

    针对CSS:

    1.把 CSS 放到代码页上端 (Put Stylesheets at the Top)

    2.从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)

    3.精简 JavaScript 与 CSS (Minify JavaScript and CSS)

    4.避免 CSS 表达式 (Avoid CSS Expressions)

    针对JavaScript:

    1.脚本放到 HTML 代码页底部 (Put Scripts at the Bottom)

    2.从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)

    3.精简 JavaScript 与 CSS (Minify JavaScript and CSS)

    4.移除重复脚本 (Remove Duplicate Scripts)

    面向图片(Image):

    1.优化图片

    2不要在 HTML 中使用缩放图片

    3使用恰当的图片格式

    4使用 CSS Sprites 技巧对图片优化

    浏览器是如何渲染页面的?

    渲染的流程如下:

    1.解析HTML文件,创建DOM树。

    自上而下,遇到任何样式(link、style)与脚本(script)都会阻塞(外部样式不阻塞后续外部脚本的加载)。

    2.解析CSS。优先级:浏览器默认设置<用户设置<外部样式<内联样式

    3.将CSS与DOM合并,构建渲染树(Render Tree)

    4.布局和绘制,重绘(repaint)和重排(reflow)

    相关文章

      网友评论

        本文标题:前端面试题

        本文链接:https://www.haomeiwen.com/subject/zhdnhftx.html