2019 前端面试押题卷(1)【初级】

242 阅读6分钟

CSS样式

1.请解释一下CSS3的Flexbox(弹性盒布局模型),以及适用场景?

回答要点 Flexbox是什么

答:Flexbox是一种新的布局方式,目的是提供一种更加高效的方式对元素进行布局、对齐、分配空白空间。

在元素的尺寸未知或动态变化(如%百分比)时也能正常的工作。

详细补充:

在弹性模型下,会调整元素的尺寸和顺序来最好地填充所有可用的空间。当容器的尺寸由于屏幕大小或窗口尺寸发生变化时,其中包含的元素也会被动态地调整。

举例:

例如,当容器尺寸变大时,其中包含的元素会被拉伸以占满多余的空白空间;当容器尺寸变小时,元素会被缩小以防止超出容器的范围。

弹性盒布局是与方向无关的。

  • 对比传统布局模型:

传统的布局方式中,block 布局是把块在垂直方向从上到下依次排列的;

而 inline 布局则是在水平方向来排列。

弹性盒布局并没有这样内在的方向限制,可以由开发人员自由操作。

  • 使用场景:

在不同的屏幕下,保证同一行的所有元素能够按照一定的比例填充整行布局。

举例:

在进行浮动时,增加了元素的填充和边框也能动态调整浮动元素在整行的宽度,不至于被挤到下一行显示。

2.用css创建一个三角形的原理是什么,并写出相应的代码?

回答要点:是什么

css三角采用的是均分原理,以矩形的对角线分配出上、右、下、左4个三角形(在答题纸上画出图形)

3.有哪些CSS定位方式?每个定位方式介绍一下。

回答要点:定位有哪些,怎么用

position:static

元素遵循常规流。top 、right、bottom、left等属性不会被应用

position:relative

对象遵循常规流,并且参照自身在常规流中的位置通过 <' top '>,<'right '>,<' bottom '>,<'left '>属性进行偏移时不影响常规流中的任何元素。

position:absolute

对象脱离常规流,使用 <' top '>,<' right '>,<' bottom '>,<' left '>等属性进行绝对定位,盒子的偏移位置不影响常规流中的任何元素,其margin不与其他任何margin折叠。

position:fixed:

对象脱离常规流,使用 <' top '>,<'right '>,<' bottom '>,<'left '>等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。

CSS样式3新增的

position:center:

对象脱离常规流,使用 <' top '>,<'right '>,<' bottom '>,<'left '>等属性指定盒子的位置或尺寸大小。盒子在其包含容器垂直水平居中。盒子的偏移位置不影响常规流中的任何元素,其margin不与其他任何margin折叠。

JavaScript

1.判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母、数字、下划线,总长度为5~20

使用正则表达式

var reg=/^[a-zA-Z]\w{4,19}$/;
reg.test("要判断的字符串");

2.截取字符串hnfcedu.com中的.com

方法1:

var src ="hnfcedu.com";
var index = src.indexOf(".");
var str = src.substring(index + 1);
console.log(str);

方法2:

var reg=/\.com/
var word =reg.exec("hnfcedu.com")[0];
console.log(word)

3.判断一个字符串中出现次数最多的字符,统计这个次数

方法一:

function count(str){
    var words=[str[0]];//初始化数组,为字符串的第一个字母
    var numbers=[1]; //统计系统字符的数目
    for(var i=1;i<str.length;i++){//循环遍历所有的字母
        var w=str[i];//获取字符
        var flag=false; //设置是否出现了相同的标记
        for(varj=0;j<words.length;j++){//匹配查找出来的元素
            var w2=words[j];
            if(w2==w){//有相同的元素
                numbers[j]+=1; //累计数目
                flag=true;
                break;//退出循环
            }
        }
        if(!flag){
            words.push(w);//添加新字符
            numbers.push(1); //添加数目
        }
    }
    //构建数目最多的字母对象信息
    var max={word:words[0],num:numbers[0],index:0};
    for(var i=1;i<numbers.length;i++){
        if(max.num<numbers[i]){
            max.num=numbers[i];
            max.index=i;
        }
    }
    max.word=words[max.index];
    return max;
}

方法2:正则表达式

function count(str) {
    str =str.split('').sort().join("");
    var reg = /(.)\1{0,}/igm;
    var words = str.match(reg);
    var maxLen = words[0];
    for (var i = 1; i < words.length;i++) {
        if(maxLen.length<words[i].length){
            maxLen=words[i];
        }
    }
    return maxLen;
}

4.如何显示/隐藏一个DOM元素?

方法一: obj.style.visibility="visible"; obj.style.visibility="hidden";

方法二: obj.style.display="block";obj.style.display="none";

方法三: obj.style.fontSize=0;obj.style.height=0;

5.如何打印日志?

console.log("Loglevel");//普通日志

console.debug("Debuglevel");//调试级别

console.info("Infolevel");//普通消息

console.warn("Warnlevel");//警告信息

console.error("Errorlevel");//错误日志

6.JavaScript有哪几种数据类型

Number

String

Boolean

Null

Undefined

Object

7.请给出异步加载JS方案,不少于两种

这个问题个人理解有歧义,是异步加载数据有几种js方案还是异步加载js文件有几种方案?

  • 第一种理解的方案,异步加载数据的js方案

方案一:使用XMLHttpRequest或是 ActiveXObject(IE)

方法二:使用Worker

方法三:使用Jquery $.ajax()

  • 第二种理解:异步加载js,这H5新增的

方法一:async

例如:<script type="text/javascript"src="demo_async.js" async="async"></script>

方法二:defer,只支持IE

例如:<script type="text/javascript"defer="defer"></script>

8.多浏览器检测用过什么工具?

本人采用的浏览器兼容测试工具是 IETester和BrowserShots

9.JavaScript中如何对一个对象进行深度克隆

function deepClone(obj){
    var cloneObject={};//创建空对象
    for(var k in obj){
        cloneObject[k]=obj[k];
    }
    return cloneObject;
}

10.前端开发有哪些优化方案

我用到过的优化有:

  • 优化1:合并请求

合并请求的主要目的是减少浏览器对服务器发起的请求数,从而减少在发起请求过程中花费的时间。

  • 优化2:域名拆分

域名拆分主要是为了增加浏览器下载的并行度,让浏览器能同时发起更多的请求,

  • 优化3:异步加载

异步加载图片、js、数据等,减少IO的阻塞

  • 优化4:使用缓存

将数据缓存在本地,减少数据的请求

  • 优化5:压缩文件

对js、css文件进行压缩

11.请编写一个JavaScript函数parseQueryString,他的用途是把URL参数解析为一个对象,

如:var url = "http://www.hnfcedu.com/eg?key0=0&key1=1&key2=2";

答:

var url = "http://www.hnfcedu.com/eg?key0=0&key1=1&key2=2";

function parseQueryString(url){
    var index=url.indexOf("?");
    var paraStr=url.substring(index+1);
    var json=eval("({"+paraStr.replace(/=/igm,":\"").replace(/&/igm,"\",")+"\"})");
    console.log(json);
    return json;
}
parseQueryString(url);
// { key0: '0', key1: '1', key2: '2' }

12.定义两个类,B继承A

function A(){
}
function B(){
}
B.prototype=new A();

13.什么是闭包?下面这个ul,如何点击每一列的时候alert其index?

<ul id="test">
    <li>这是第一条</li>
    <li>这是第二条</li>
    <li>这是第三条</li>
</ul>

闭包:在JavaScript中局部变量被一个函数引用,变量也是函数中的一部分。

代码实现:

<script>
    var ul = document.getElementById('test');
    var list = ul.children;
    for(var i=0; i< list.length; i++){
        (function (i) {
            list[i].onclick = function () {
                console.log(i);
            }
        })(i);// 闭包的行为
    }
</script>

14.有一个表格,当点击表头的属性区域,使表格的信息进行排序切换功能,第一次点击为降序排列,再一次点击为升序排列。

<table border="1" align="center" width="400"id="tab">
<thead>
<tr>
    <td id="name">姓名</td>
    <td id="power">力量</td>
    <td id="quick">敏捷</td>
    <td id="smart">智力</td>
</tr>
</thead>
<tbody>
<tr id="div0">
    <td>众神之王</td>
    <td>19</td>
    <td>15</td>
    <td>20</td>
</tr>
<tr id="div1">
    <td>月之骑士</td>
    <td>15</td>
    <td>22</td>
    <td>15</td>
</tr>
<tr id="div2">
    <td>流浪剑客</td>
    <td>23</td>
    <td>15</td>
    <td>14</td>
</tr>
<tr id="div3">
    <td>德鲁伊</td>
    <td>17</td>
    <td>24</td>
    <td>13</td>
</tr>
</tbody>
</table>

答:

<script type="text/javascript"> 
   var tab =document.getElementById("tab");
    var tbody = tab.tBodies[0];//获取tbody对象
    var bodies = tbody.children;//获取以对象
    var trs = []; 
   for(var i = 0; i < bodies.length; i++) {
        trs.push(bodies[i]);//对象转数组 
   }
   var cells = tab.tHead.rows[0].cells;//获取所有的头部信息
    for (var i = 0; i < cells.length; i++) {
        cells[i].onclick = function () {
            //获取点击对象的排序类型 
           var sortType = this.sortType;//获取点击单元格的排序类型[自定义属性 sortType]
            if (sortType) {//自定义属性存在
                sortType= sortType =="asc" ? "desc" : "asc";//改变排序类型
            } else {
                sortType = "asc";//默认升序
            } 
           this.sortType = sortType;//添加自定义属性
            //获取单元格的序号
            var index = this.cellIndex;
            var results = trs.sort(function (a,b) {//自定义排序逻辑
                var aValue =a.cells[index].innerText;//获取对应单元格的内容
                var bValue =b.cells[index].innerText;//获取对应单元格的内容
                var cValue=aValue.localeCompare(bValue);//通过比较决定排序规则
                return sortType =="asc"? cValue:-cValue;//做升序或降序排列 正数为升序,负数为降序
            });            tbody.innerHTML = "";
            for (var i = 0; i < results.length;i++) {
                tbody.appendChild(results[i]); 
           }
        }
    }
</script>