口试分享:2018阿里巴巴前端口试总结(问题+答案 30题)

1、运用css完成一个延续的动画结果
————————————————————————————————————————————————————————

animation:mymove 5s infinite;

@keyframes mymove {

    from {top:0px;}
    
    to {top:200px;}

}

主要考: animation 用法

值    形貌
animation-name    划定须要绑定到选择器的 keyframe 称号。
animation-duration    划定完成动画所消费的时刻,以秒或毫秒计。
animation-timing-function    划定动画的速率曲线。
animation-delay    划定在动画最先之前的耽误。
animation-iteration-count    划定动画应当播放的次数。
animation-direction    划定是不是应当轮番反向播放动画。    

————————————————————————————————————————————————————————
2、运用js完成一个延续的动画结果
最最先的思绪是用定时器完成,末了没有想的太完整,面试官给出的答案是用 requestAnimationFrame。

    var e = document.getElementById('e')
    
    var falg = true;
    
    var left = 0;
    
    setInterval(() => {
    
        left == 0 ? falg = true : left == 100 ? falg = false : ''
    
        falg ? e.style.left = ` ${left++}px` : e.style.left = ` ${left--}px`
    
    }, 1000 / 60)
    
requestAnimationFrame 由于之前没有用过这个 API 所以是现学的。
//兼容性处置惩罚

window.requestAnimFrame = (function(){

  return  window.requestAnimationFrame       ||

          window.webkitRequestAnimationFrame ||

          window.mozRequestAnimationFrame    ||

          function(callback){

            window.setTimeout(callback, 1000 / 60);

          };

})();


var e = document.getElementById("e");

var flag = true;

var left = 0;


function render() {

    left == 0 ? flag = true : left == 100 ? flag = false : '';

    flag ? e.style.left = ` ${left++}px` :

        e.style.left = ` ${left--}px`;

}


(function animloop() {

    render();

    requestAnimFrame(animloop);

})();

不足之处请斧正(毕竟是现学的)趁便查了一下上风:

浏览器可以优化并行的动画行动,更合理的从新排列行动序列,并把可以兼并的行动放在一个衬着周期内完成,从而呈现出更流通的动画结果

处理毫秒的不精确性

防止过分衬着(衬着频次太高、 tab 不可见停息等等) 注: requestAnimFrame 和 定时器一样也头一个相似的消灭要领cancelAnimationFrame。
————————————————————————————————————————————————————————
3、右侧宽度牢固,左侧自适应

第一种:

<style>

body{

    display: flex;

}

.left{

    background-color: rebeccapurple;

    height: 200px;

    flex: 1;

}

.right{

    background-color: red;

    height: 200px;

    width: 100px;

}

</style>

<body>

    <div class="left"></div>

    <div class="right"></div>

</body>

第二种

<style>

    div {

        height: 200px;

    }

    .left {

        float: right;

        width: 200px;

        background-color: rebeccapurple;

    }

    .right {

        margin-right: 200px;

        background-color: red;

    }

</style>

<body>

    <div class="left"></div>

    <div class="right"></div>

</body>

————————————————————————————————————————————————————————
4、程度垂直居中

#container{

    position:relative;

}

#center{

    width:100px;

    height:100px;

    position:absolute;

    top:50%;

    left:50%;

    transform: translate(-50%,-50%);

}

第二种

#container{

    position:relative;

}

#center{

    width:100px;

    height:100px;

    position:absolute;

    top:50%;

    left:50%;

    margin:-50px 0 0 -50px;

}

第三种

#container{

    position:relative;

}


#center{

    position:absolute;

    margin:auto;

    top:0;

    bottom:0;

    left:0;

    right:0;

}

第四种 flex

#container{

    display:flex;

    justify-content:center;

    align-items: center;

}

————————————————————————————————————————————————————————
5、四种定位的区分

static 是默认值

relative 相对定位 相对于本身原有位置举行偏移,仍处于范例文档流中

absolute 相对定位 相对于近来的已定位的先人元素, 有已定位(指 position不是 static的元素)先人元素, 以近来的先人元素为参考范例。假如无已定位先人元素, 以 body元素为偏移参照基准, 完整脱离了范例文档流。

fixed 牢固定位的元素会相对于视窗来定位,这意味着即使页面转动,它照样会停留在雷同的位置。一个牢固定位元素不会保存它原本在页面应有的闲暇。

————————————————————————————————————————————————————————
6、Flex规划用的多吗?
由于项目斟酌兼容 IE9 所以直接说用的不多

————————————————————————————————————————————————————————
7、挪动端适配怎样做的?
运用媒体查询做的相应式规划,依据差别屏幕宽度加载差别 css.
————————————————————————————————————————————————————————
8、let与var的区分?

let 为 ES6 新增加说明变量的敕令,它相似于 var,然则有以下差别:

var 声明的变量,其作用域为该语句地点的函数内,且存在变量提拔征象

let 声明的变量,其作用域为该语句地点的代码块内,不存在变量提拔

let 不允许反复声明.

————————————————————————————————————————————————————————
9、为何 var 可以反复声明?(这个就不知道了)

当我们实行代码时,我们可以简朴的理解为新变量分派一起内存,定名为 a,并赋值为 2,但在运转的时刻编译器与引擎还会举行两项分外的操纵:推断变量是不是已声明:

起首编译器对代码举行剖析拆解,从左至右碰见 var a,则编译器会讯问作用域是不是已存在叫 a 的变量了,假如不存在,则召唤作用域声明一个新的变量 a,若已存在,则疏忽 var 继承向下编译,这时候 a = 2被编译成可实行的代码供引擎运用。

引擎碰见 a=2时同样会讯问在当前的作用域下是不是有变量 a,若存在,则将 a赋值为 2(由于第一步编译器疏忽了反复声明的var,且作用域中已有 a,所以反复声明会发作值得掩盖而并不会报错)。若不存在,则顺着作用域链向上查找,若终究找到了变量 a则将其赋值 2,若没有找到,则召唤作用域声明一个变量 a并赋值为 2。 参考链接

————————————————————————————————————————————————————————
10、封装一个函数,参数是定时器的时刻,.then实行回调函数。

function sleep (time) {

  return new Promise((resolve) => setTimeout(resolve, time));

}

————————————————————————————————————————————————————————
11、一个关于 this 指向的题目

obj = {

    name: 'a',

    getName : function () {

        console.log(this.name);

    }

}


var fn = obj.getName

obj.getName()

var fn2 = obj.getName()

fn()

fn2()

————————————————————————————————————————————————————————
13 CommonJS 中的 require/exports 和 ES6 中的 import/export 区分?

CommonJS 模块的主要特征是加载时实行,即剧本代码在 require 的时刻,就会悉数实行。一旦涌现某个模块被”轮回加载”,就只输出已实行的部份,还未实行的部份不会输出。

ES6 模块是动态援用,假如运用 import 从一个模块加载变量,那些变量不会被缓存,而是成为一个指向被加载模块的援用,须要开辟者本身保证,真正取值的时刻可以取到值。

import/export 终究都是编译为 require/exports 来实行的。

CommonJS 范例划定,每一个模块内部, module 变量代表当前模块。这个变量是一个对象,它的 exports 属性(即module.exports )是对外的接口。加载某个模块,实际上是加载该模块的 module.exports 属性。

export 敕令划定的是对外的接口,必需与模块内部的变量竖立一一对应关联。

————————————————————————————————————————————————————————
14、 一行代码完成数组去重?

[...new Set([1,2,3,1,'a',1,'a'])]

————————————————————————————————————————————————————————
15、运用addEventListener点击li弹出内容,而且动态增加li以后有用(这个题没答出来??)

<ul>

    <li>1</li>

    <li>2</li>

    <li>3</li>

    <li>4</li>

</ul>


var ulNode = document.getElementById("ul");

    ulNode.addEventListener('click', function (e) {

        if (e.target && e.target.nodeName.toUpperCase() == "LI") {

            alert(e.target.innerHTML);

        }

    }, false);

————————————————————————————————————————————————————————
16、怎样推断两个对象相称?

    obj={

    a:1,

    b:2

}

obj2={

    a:1,

    b:2

}

obj3={

    a:1,

    b:2

}

最最先的思绪是遍向来推断,然则末了彷佛没有说清楚,查了下,彷佛可以转换为字符串来推断。

JSON.stringify(obj)==JSON.stringify(obj2);//true

JSON.stringify(obj)==JSON.stringify(obj3);//false

————————————————————————————————————————————————————————
17、项目做过哪些机能优化?

削减 HTTP 要求数

削减 DNS 查询

运用 CDN

防止重定向

图片懒加载

削减 DOM 元素数目

削减 DOM 操纵

运用外部 JavaScript 和 CSS

紧缩 JavaScript 、 CSS 、字体、图片等

优化 CSS Sprite

运用 iconfont

字体裁剪

多域名分发分别内容到差别域名

只管削减 iframe 运用

防止图片 src 为空

把款式表放在 中

把剧本放在页面底部 迎接补充。。。

————————————————————————————————————————————————————————
18、模块化开辟是怎样做的?

运用定名空间。

————————————————————————————————————————————————————————
19、有无运用过webpack?
我说Vue项目中运用了,然后就没问了。
————————————————————————————————————————————————————————
20、gulp本身写过使命吗?照样都用的模块?
不知道怎样怎样回复,不都是运用模块来写的么,然后就说是运用模块。


router.go(1)

router.push('/')

————————————————————————————————————————————————————————
21、Vue router 跳转和 location.href 有什么区分?
router 是 hash 转变 location.href 是页面跳转,革新页面
————————————————————————————————————————————————————————
22、Vue 双向绑定完成道理?
经由过程 Object.defineProperty 完成的
————————————————————————————————————————————————————————
23、你能完成一下双向绑定吗?

<body>

    <div id="app">

        <input type="text" id="txt">

        <p id="show-txt"></p>

    </div>

    <script>

        var obj = {}

        Object.defineProperty(obj, 'txt', {

            get: function () {

                return obj

            },

            set: function (newValue) {

                document.getElementById('txt').value = newValue

                document.getElementById('show-txt').innerHTML = newValue

            }

        })

        document.addEventListener('keyup', function (e) {

            obj.txt = e.target.value

        })

    </script>

</body>

————————————————————————————————————————————————————————
24、 React 和 Vue 有什么区分?

————————————————————————————————————————————————————————
25、 Set 和 Map 数据构造

ES6 供应了新的数据构造 Set 它相似于数组,然则成员的值都是唯一的,没有反复的值。

ES6 供应了 Map 数据构造。它相似于对象,也是键值对的鸠合,然则“键”的局限不限于字符串,各种范例的值(包含对象)都可以看成键。也就是说, Object 构造供应了“字符串—值”的对应, Map 构造供应了“值—值”的对应,是一种更完美的 Hash构造完成。

————————————————————————————————————————————————————————
26、WeakMap 和 Map 的区分?

WeakMap 构造与 Map 构造基础相似,唯一的区分是它只接收对象作为键名( null 除外),不接收其他范例的值作为键名,而且键名所指向的对象,不计入渣滓接纳机制。

WeakMap 最大的优点是可以防止内存走漏。一个仅被 WeakMap 作为 key 而援用的对象,会被渣滓接纳器接纳掉。

WeakMap 具有和 Map 相似的 set(key, value) 、 get(key)、has(key)、 delete(key) 和 clear() 要领, 没有任何与迭代有关的属性和要领。

————————————————————————————————————————————————————————
27、重排和重绘

部份衬着树(或许全部衬着树)须要从新剖析而且节点尺寸须要从新盘算。这被称为重排。注重这里最少会有一次重排-初始化页面规划。

由于节点的多少属性发作转变或许由于款式发作转变,比方转变元素背景色时,屏幕上的部份内容须要更新。如许的更新被称为重绘。

————————————————————————————————————————————————————————
28、什么情况会触发重排和重绘?

增加、删除、更新 DOM 节点

经由过程 display: none 隐蔽一个 DOM 节点-触发重排和重绘

经由过程 visibility: hidden 隐蔽一个 DOM 节点-只触发重绘,由于没有多少变化

挪动或许给页面中的 DOM 节点增加动画

增加一个款式表,调解款式属性

用户行动,比方调解窗口大小,转变字号,或许转动。

————————————————————————————————————————————————————————
29、浏览器缓存
浏览器缓存分为强缓存和协商缓存。当客户端要求某个资本时,猎取缓存的流程以下:

先依据这个资本的一些 http header 推断它是不是掷中强缓存,假如掷中,则直接从当地猎取缓存资本,不会发要求到服务器;

当强缓存没有掷中时,客户端会发送要求到服务器,服务器经由过程另一些 request header考证这个资本是不是掷中协商缓存,称为 http再考证,假如掷中,服务器将要求返回,但不返回资本,而是通知客户端直接从缓存中猎取,客户端收到返回后就会从缓存中猎取资本;

强缓存和协商缓存共同之处在于,假如掷中缓存,服务器都不会返回资本;

区分是,强缓存不对发送要求到服务器,但协商缓存会。

当协商缓存也没掷中时,服务器就会将资本发送回客户端。

当 ctrl+f5 强迫革新网页时,直接从服务器加载,跳过强缓存和协商缓存;

当 f5 革新网页时,跳过强缓存,然则会搜检协商缓存;

强缓存

Expires(该字段是 http1.0 时的范例,值为一个相对时刻的 GMT 花样的时刻字符串,代表缓存资本的逾期时刻)

Cache-Control:max-age(该字段是 http1.1 的范例,强缓存应用其 max-age 值来推断缓存资本的最大生命周期,它的值单元为秒)

协商缓存

Last-Modified(值为资本末了更新时刻,随服务器response返回)

If-Modified-Since(经由过程比较两个时刻来推断资本在两次要求时期是不是有过修正,假如没有修正,则掷中协商缓存)

ETag(示意资本内容的唯一标识,随服务器response返回)

If-None-Match(服务器经由过程比较要求头部的If-None-Match与当前资本的ETag是不是一致来推断资本是不是在两次要求之间有过修正,假如没有修正,则掷中协商缓存)

————————————————————————————————————————————————————————
假如喜好请给个赞吧,您的赞会是我们继承分享的动力!

原文转自:https://blog.ihoey.com/posts/…

    原文作者:ivyzhang
    原文地址: https://segmentfault.com/a/1190000013508719
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞