面试题20

1.什么是事件代理且描述事件代理的原理及为什么要用事件代理?

2.移动端1px问题,为什么会有?如何解决?

3.解释jsonp的原理

4.在工作中你是如何优化自己的代码的?

5.axios是什么?如何使用?描述其实现登录的流程用JS去掉数组里面重复的数据,并且打印出来

6.var    arr = [a,b,c,d,d,e,a,b,f,g]


1.什么是事件代理且描述事件代理的原理及为什么要用事件代理?

    事件委托(事件代理)就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。        例:取快递,需要通过他人运送到指定位置,方可获取

    原理:事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事件,举个例子:页面上有这么一个节点树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序a>li>ul>div,有这样一个机制,那么我们给最外面的div加点击事件,那么里面的ul,li,a做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托它们父级代为执行事件。

    为什么用事件代理:

    在JavaScript中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能,因为需要不断的与dom节点进行交互,访问dom的次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间.    如果用事件委托,就会将所有的操作放到js程序里面,与dom的操作就只需要交互一次,这样就能大大的减少与dom的交互次数,提高性能.

2.移动端1px问题,为什么会有?如何解决?

    设备的分辨率不同.因为Retine屏的出现,分辨率变为普通屏幕的2倍,1px的边框在devicePixelRatio=2的retina屏下会显示成2px

    解决方法:

        1.小数值

            div {

               border: 1px solid #000;

            }

            @media (-webkit-min-device-pixel-ratio: 2) {

                  div {

                        border: .5px solid #000;

                  }

            }

       2.border-image

            .border-image-1px {

                border-width: 1px 0px;

                -webkit-border-image: url(border.png) 2 0 stretch;

                border-image: url(border.png) 2 0 stretch;

        3.background-img渐变

            .border {

                background:

                        linear-gradient(180deg, black, black 50%, transparent 50%) top    left  / 100% 1px no-repeat,

                        linear-gradient(90deg,  black, black 50%, transparent 50%) top    right / 1px 100% no-repeat,

                        linear-gradient(0,      black, black 50%, transparent 50%) bottom right / 100% 1px no-repeat,

                        linear-gradient(-90deg, black, black 50%, transparent 50%) bottom left  / 1px 100% no-repeat;

                }

        4.box-shadow

            .shadow {

                -webkit-box-shadow:0 1px 1px -1px rgba(255, 0, 0, 0.5);

                box-shadow:0 1px 1px -1px rgba(255, 0, 0, 0.5);

            }

        5.viewport

            <meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

        6.transform:scale(0.5)

            div {

                   height: 1px;

                  background: #000;

                  transform: scaleY(0.5);

                  transform-origin: 0 0;

             }

3.解释jsonp的原理

    由于同源策略的限制,XMLHttpRequest只允许请求前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后再服务端输出JSON数据并执行回调函数,从而解决跨域数据请求

4.在工作中你是如何优化自己的代码的?

    一. 尽量采用div+css布局您的页面,div+css布局的好处是让搜索引擎爬虫能够更顺利的、更快的、更友好的爬完您的页面;div+css布局还可以大量缩减网页大小,提高浏览的速度,使得代码更简洁、流畅、更容易放置更多内容。

    二. 尽量缩减您的页面大小,因为搜索引擎爬虫每次爬行您的站点时,存储数据的容量有限,一般建议100KB以下,越小越好,但不能小于5KB。网页大小减少还有一个好处,能够促使您的站点形成巨大的内部链接网。

    三. 尽量少用无用的图片和flash。内容索引所派出的搜索引擎爬虫,不认识图片,只能根据图片ALT,TITLE”等属性的内容判断图片的内容。对于flash搜索引擎爬虫更是视而不见。

    四. 尽量满足w3c标准,网页代码的编写满足W3C标准,能够提升网站和搜索引擎的友好度,因为搜索引擎收录标准,排名算法,都是在W3C标准的基础上开发的。

    五. 尽量更深层次套用标签h1、h2、h3、h4、h5…..,让搜索引擎能够分辨清晰网页那一块很重要,那一块次之。

    六. 尽量少用JS,JS代码全部用外部调用文件封装。搜索引擎不喜欢JS,影响网站的友好度指数。

    七. 尽量不使用表格布局,因为搜索引擎对表格布局嵌套3层以内的内容懒的去抓取。搜索引擎爬虫有时候也是比较懒的,望各位一定要保持代码和内容在3层以内。

    八. 尽量不让CSS分散在HTML标记里,尽量封装到外部调用文件。如果CSS出现在HTML标记里,搜索引擎爬虫就要分散注意力去关注这些对优化没有任何意义的东西,所以建议封装到专用CSS文件中。

    九.清理垃圾代码,要把代码编辑环境下敲击键盘上的空格键所产生的符号;把一些默认属性代码,不会影响显示的代码;注释语句如果对代码可读性没有太大影响,清理这些垃圾代码,会减少不少的空间。

5.axios是什么?如何使用?描述其实现登录的流程用JS去掉数组里面重复的数据,并且打印出来    

    Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get、post请求。

    使用:安装模块    npm    install    axios

    或者直接引入    <scriptsrc="https://unpkg.com/axios/dist/axios.min.js"></script>

    axios官网文档上取消请求的两种方式

        使用CancelToken.source工厂创建一个取消令牌:

            varCancelToken = axios.CancelToken;

            varsource = CancelToken.source();

            axios.get('/user/12345', {

                cancelToken: source.token

            }).catch(function(thrown){

            if(axios.isCancel(thrown)) {

                console.log('Request canceled', thrown.message);

            }else{

                // 处理错误

                }

            });

            //取消请求(消息参数是可选的)

        source.cancel('操作被用户取消。');


还可以通过将执行器函数传递给CancelToken构造函数来创建取消令牌:

        varCancelToken = axios.CancelToken;

        varcancel;

        axios.get('/ user / 12345',{

            cancelToken:newCancelToken(functionexecutor(c){

                //一个执行器函数接收一个取消函数作为参数

              cancel = c;

              })

            });

            // 取消请求    

        clear();

        根据文档上的第二种方法,我们可以在拦截器里统一处理取消重复请求

        letpending = [];//声明一个数组用于存储每个ajax请求的取消函数和ajax标识

        letcancelToken = axios.CancelToken;

        letremovePending =(config) =>{

            for(letpinpending){

            if(pending[p].u === config.url +'&'+ config.method) {//当当前请求在数组中存在时执行函数体

                    pending[p].f();//执行取消操作    

                    pending.splice(p,1);//把这条记录从数组中移除

                }

            }    

        }

                //添加请求拦截器

                axios.interceptors.request.use(config=>{

                removePending(config);//在一个ajax发送前执行一下取消操作

                config.cancelToken =newcancelToken((c)=>{

            // 这里的ajax标识我是用请求地址&请求方式拼接的字符串,当然你可以选择其他的一些方式

                pending.push({u: config.url +'&'+ config.method,f: c });

                });

            returnconfig;

                   },error => {

                returnPromise.reject(error);

               });

            //添加响应拦截器

        axios.interceptors.response.use(response=>{

removePending(res.config);//在一个ajax响应后再执行一下取消操作,把已经完成的请求从pending中移除

                returnresponse;

              },error =>{

            return{data: { } }; 返回一个空对象,主要是防止控制台报错

              });

6.var    arr = [a,b,c,d,d,e,a,b,f,g]

    一.

var    arr = [a,b,c,d,d,e,a,b,f,g]
function distinct(arr) {

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

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

          if(arr[i] === arr[j]) {

              arr.splice(j, 1);

              j--;

          }

      }

  }

  return arr;

}

    二.

var    arr = [a,b,c,d,d,e,a,b,f,g]
function distinct(arr) {

  return Array.from(new Set(arr));

}   

var newArr = distinct(arr);

console.log(newArr);

    三.

var    arr = [a,b,c,d,d,e,a,b,f,g]

    function distinct(arr) {

         let newArr = [];

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

             if(newArr.indexOf(arr[i]) === -1) {

                 newArr.push(arr[i]);

             }

         }

         return newArr;

    }

四.

var    arr = [a,b,c,d,d,e,a,b,f,g]

    function distinct(arr) {

          arr = arr.sort();

          let newArr = [];

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

              if(arr[i] !== arr[i-1]) {

                  newArr.push(arr[i]);

              }

          }

          return newArr;

      }

  五.

    var    arr = [a,b,c,d,d,e,a,b,f,g]

        function distinct(arr) {

      let newArr = [];

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

          if(!newArr.includes(arr[i])) {

              newArr.push(arr[i]);

          }

      }

      return newArr;

}

六.

    var    arr = [a,b,c,d,d,e,a,b,f,g]

    function distinct(arr) {

      return arr.filter((item,index, arr) => arr.indexOf(item) === index);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容

  • 今天面试回来,稍微整理下今天被问到的题目,呀,回答的是乱七八糟,最后百度整理下,以供以后学习。 1,vue 中事件...
    AlisaMfz阅读 478评论 0 0
  • 转载:为了永久查看,我都cv 过来,省的原作者删除后找不到。 起因:1、这是前端面试的经典题型,要去找工作的小伙伴...
    七色烟火阅读 488评论 0 4
  • 一直以来,对js的一些概念还是不清晰的,很多都没有搞明白,今天无意间在群里见他们提起事件委托,所以查找了一些资料,...
    蝴蝶结199007阅读 286评论 1 3
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,580评论 0 7
  • 起因: 1、这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的; 2、其实我一直都没弄明白,写这个一是为了...
    Vicky丶Amor阅读 735评论 2 16