前端面试

    xiaoxiao2022-07-04  126

    1.请用js去除字符串空格

    ( 1 ) replace正则匹配方法

      去除字符串内所有的空格:str = str.replace(/\s*/g,"");

      去除字符串内两头的空格:str = str.replace(/^\s*|\s*$/g,"");

    去除字符串内左侧的空格:str = str.replace(/^\s*/,"");

    去除字符串内右侧的空格:str = str.replace(/(\s*$)/g,"");

         ( 2 ) str.trim()方法

    trim()方法是用来删除字符串两端的空白字符并返回,trim方法并不影响原来的字符串本身,它返回的是一个新的字符串。

    缺陷:只能去除字符串两端的空格,不能去除中间的空格

         ( 3 ) JQ方法:$.trim(str)方法

      $.trim() 函数用于去除字符串两端的空白字符。

    注意:$.trim()函数会移除字符串开始和末尾处的所有换行符,空格(包括连续的空格)和制表符。如果这些空白字符在字符串中间时,它们将被保留,不会被移除。

    2.jQuery中的delegate函数的作用?

    为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数

    当点击按钮时,隐藏或显示 p 元素:

    $(“div”).delegate(“button”,”click”,function(){       $(“p”).slideToggle(); });

    3.什么是盒子模型?

    所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。

    CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容。

    盒模型允许我们在其它元素和周围元素边框之间的空间放置元素。

    4.比较typeof和instanceOf?

    相同点:都常用来判断一个变量是否为空,或者是什么类型的

    不同点:

    1typeof:返回值是一个字符串,用来说明变量的数据类型(number,boolean,string,function,object,undefined)。

           用法:

    判断一个变量是否存在 If(typeof(a) != “undefined”){      Alert(1); }

     

    对于Array,Null等特殊对象使用typeof一律返回object,这正是typeof的局限性。

    ( 2 ) instanceOf用于判断一个变量是否属于某个对象的实例。

    Var a = new Array(); alert(a instanceof Array); //true alert(a instanceof Object); //true

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

    优雅降级Web站点在所有新式浏览器中都能正常工作,如果用户使用的是老式浏览器,则代码会检查以确认它们是否能正常工作。由于IE独特的盒模型布局问题,针对不同版本的IEhack实践过优雅降级了,为那些无法支持功能的浏览器增加候选方案,使之在旧式浏览器上以某种形式降级体验却不至于完全失效.渐进增强:从被所有浏览器支持的基本功能开始,逐步地添加那些只有新式浏览器才支持的功能,向页面增加无害于基础浏览器的额外样式和功能的。当浏览器支持时,它们会自动地呈现出来并发挥作用。

    6.Web storage 与cookie相比存在的优势?

    存储空间更大:能提供5MB的存储空间(不同浏览器提供的空间不同),Cookie仅4KB。存储内容不会发送到服务器:当设置了Cookie后,Cookie的内容会随着请求一并发送到服务器,这对于本地存储的数据是一种浪费。而Web Storage中的数据则仅仅是存在本地,不会与服务器发生任何交互。更多丰富易用的接口:Web Storage提供了一套更为丰富的接口,使得数据操作更为简便。独立的存储空间:每个域(包括子域)有独立的存储空间,每个存储空间是完全独立的,因此不会造成数据混乱。

    7.对闭包的理解?

    指有权访问另一个函数作用域中的变量的函数. 创建闭包常见方式,就是在一个函数内部创建另一个函数。 function a(){     var n = 0;     function inc() {         n++;         console.log(n);     }     inc();   inc();   }      a(); //控制台输出1,再输出2

    8.JavaScript中实现继承的方法?

    原型继承优点是继承了父类的模板,又继承了父类的原型对象,缺点就是父类实例传参,不是子类实例化传参,不符合常规语言的写法。 //  父类 function Persion(name,age){ this.name = name; this.age = age; } // 父类的原型对象属性 Persion.prototype.id = 10; // 子类 function Boy(sex){ this.sex = sex; }  // 继承实现 Boy.prototype = new Persion('c5',27); var b = new Boy(); alert(b.name)// c5 alert(b.id)//10

    2.类继承(借用构造函数的方式继承)优点是方便了子类实例传参,缺点就是不继承了父类的原型对象

    //  父类         function Persion(name,age){            this.name = name;            this.age = age;         }         // 父类的原型对象属性         Persion.prototype.id = 10;         // 子类         function Boy(name,age,sex){            //call apply 实现继承            Persion.call(this,name,age);            this.sex = sex;         }          var b = new Boy('c5',27,'男');          alert(b.name)// c5          alert(b.id)//undinfind 父类的

    3.混合继承(原型继承和类继承)优点方便了子类实例传参,缺点就是Boy.pertotype = new Persion()  函数又实例一次,函数内部变量又重复实例一次,大程序时候会很好性能

    //  父类 function Persion(name,age){ this.name = name; this.age = age; } // 父类的原型对象属性 Persion.prototype.id = 10; // 子类 function Boy(name,age,sex){ //call apply 实现继承 Persion.call(this,name,age); this.sex = sex; } // 原型继承实现  参数为空 代表 父类的实例和父类的原型对象的关系了  Boy.prototype = new Persion(); var b = new Boy('c5',27,'男'); alert(b.name)// c5 alert(b.id)//10

    9.减少页面加载时间的方法?

    减少http请求(合并文件、合并图片)。优化图片文件,减少其尺寸,特别是缩略图,一定要按尺寸生成缩略图然后调用,不要在网页中用resize方法实现,虽然这样看到的图片外形小了,但是其加载的数据量没有减少。(可以采用web图像保存,减少颜色数等等方法)。图像格式的选择(GIF:提供的颜色较少,可用在一些对颜色要求不高的地方)。压缩JavaScript、css代码。(百度搜索“css代码压缩”)。服务器启用gzip压缩功能:将要传输的文件压缩后传输到客户端再解压,在网络传输数据量会减小。(服务器性能不好的网站,慎用)。标明高度和宽度:方便浏览器给未加载完的图片腾出空位,继续加载后面的内容。网址后面加上“/”:对服务器而言,不加斜杠服务器会多一次判断的过程,加上就会直接返回网站设置的存放在网站根目录下的默认页面。

    10.什么是跨域,跨域请求资源的方法有哪些?

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

    存在跨域的情况:

    网络协议不同,入http协议访问https协议端口不同,如80端口访问8080端口域名不同,如qianduanblog.com访问baidu.com子域名不同,如abc.qianduanblog.com访问def.qianduanblog.com域名和域名对应的ip不同,如www.a.com访问20.105.28.90

        2.方法

    proxy代理

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

    实现方法:通过nginx代理;

         2.CORS Cross-Origin Resource Sharing

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

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

    res.writeHead(200, {     "Content-Type": "text/html; charset=UTF-8",     "Access-Control-Allow-Origin":'http://localhost',     'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',     'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type' });

          3.jsonp

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

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

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

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

    <script>     function testjsonp(data) {        console.log(data.name); // 获取返回的结果     } </script> <script>     var _script = document.createElement('script');     _script.type = "text/javascript";     _script.src = "http://localhost:8888/jsonp?callback=testjsonp";     document.head.appendChild(_script); </script>

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

    减少http请求(合并CSS、JavaScript、图片)使用浏览器缓存(设置HTTP头中的Cache-Control和Expires属性)服务端启用压缩)Css放在页面最上面、JavaScript放在页面最下面(把JavaScript代码放到</body>标签之前)精简css和js文件(java -jar yuicompressor-2.4.2.jar api.js > api.min.js   java -jar yuicompressor-2.4.2.jar style.css > style.min.css)减少对DOM的操作(减少对DOM元素的查询和修改,查询时可将其赋值给局部变量)正确理解Repaint和Reflow(通过设置class样式,position为fixed或者absolute)使用JSON格式进行数据交互减少cookie传输使用CDN加速

    12.数组去重?

    (1) /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ function uniq(array){     var temp = []; //一个新的临时数组     for(var i = 0; i < array.length; i++){         if(temp.indexOf(array[i]) == -1){             temp.push(array[i]);         }     }     return temp; } var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5]; console.log(uniq(aa));

    (2)

    /* * 速度最快, 占空间最多(空间换时间) * * 该方法执行的速度比其他任何方法都快, 就是占用的内存大一些。 * 现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键, * 不是的话给对象新增该键并放入新数组。 * 注意点:判断是否为js对象键时,会自动对传入的键执行“toString()”, * 不同的键可能会被误认为一样,例如n[val]-- n[1]、n["1"]; * 解决上述问题还是得调用“indexOf”。*/ function uniq(array){     var temp = {}, r = [], len = array.length, val, type;     for (var i = 0; i < len; i++) {         val = array[i];         type = typeof val;         if (!temp[val]) {             temp[val] = [type];             r.push(val);         } else if (temp[val].indexOf(type) < 0) {             temp[val].push(type);             r.push(val);         }     }     return r; } var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5]; console.log(uniq(aa));

    13.未完待续。。。

    最新回复(0)