20家前端面试题参考

题目来自前端面试--四月二十家前端面试题分享,知道某一题目时可以直接ctrl+f找答案,有些选择题或者输出结果的题目就没放到这里,一起学习交流~

1、CSS实现垂直水平居中

解:

.box {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    margin: auto;
    width: 400px;
    height: 400px;
    border: 1px solid red;
    display: flex;
    justify-content: center;
    align-items: center;
}

.con {
    height: 100px;
    width: 100px;
    background-color: red;
}

2、原生JS或JQ循环出li中的内容

解:

// JS版本
var aLi = document.querySelectorAll('ul li');
aLi.forEach(function(item, index, arr){
    console.log(item.innerHTML);
});
// JQ版本
$('ul li').each(function(index, item){
    console.log(item.innerHTML);// item是原生的DOM元素喔
});

3、Ajax请求的时候GET和POST的区别

解:

GET大小限制,安全低,POST则相反
GET请求需考虑缓存问题,POST无需关心
POST请求必须设置Content-Type值为application/x-form-www-urlencoded
GET请求的参数写在url里,所以send函数发送的参数为null,而POST请求的数据需要写在send中

4、JS中函数split()和join()的区别

解:

// 根据传入参数的不同,字符串拆分成数组和数组拆分成字符串
var str = 'my name is moka.';
var arr = str.split(" ");
console.log(arr);// ["my", "name", "is", "moka."]

str = arr.join(" ");
console.log(str);// my name is moka.

5、熟悉微信小程序吗

解:

实事求是的随便扯点吧...去面试时可以先关注下该公司是否有做这个,根据情况往要点子上扯

6、HTTP状态码及其含义

解:

1开头表示信息类:收到请求正在处理中
2开头表示成功类:请求被正确接收,理解和处理,例如:200
3开头表示重定向类:请求失败
4开头表示客户端错误:请求有错误,例如:404代表请求内容不存在
5开头表示服务器错误:服务器不能完成对请求的处理:如 500

7、设置元素浮动后,该元素的display值是多少

解:

var oBox = document.querySelector('#box');
console.log(getComputedStyle(oBox, "null")['display']);// block

// PS:猛一瞅这题吓我一跳,难道不是block吗,事实就是block...

8、请描述cookie、sessionStorage、localStorage的区别

解:

同:
    都是保存在浏览器端,且同源的(同协议,同域名和同端口)
异:
    cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递,sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存;

    cookie数据有路径(path)的概念,可以限制cookie只属于某个路径下;
    
    cookie数据不能超过4k,同时因为每次http请求都会携带cookie,所以cookie只适合保存很小的数据,如会话标识,sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大;

    数据有效期不同,sessionStorage仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持,localStorage始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据,cookie在设置的过期时间之前一直有效;

    作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面,localStorage 在所有同源窗口中都是共享的,cookie也是在所有同源窗口中都是共享的;

    Web Storage 支持事件通知机制,可以将数据更新的通知发送给监听者,其api接口使用更方便

9、请解释你对盒模型的理解,以及如何在CSS中告诉浏览器使用不同的盒模型来渲染你的布局

解:

W3C标准盒子模型:宽是宽,高是高
IE盒子模型:宽高包括padding和border
box-sizing: border-box;// 变为IE盒子模型

10、下面的语句的返回值是什么

var a = 6;
setTimeout(function(){
    alert(a);
    a = 666;
}, 1000);
a = 66;

解:

是66,setTimeout是异步的

11、CSS选择符有class选择符,还有另外两种是什么,按优先级

解:

选择符多了去了,后代、兄弟、属性,这里问的应该是常用的ID和标签,优先级:ID、class、标签

12、前端页面有行为层JS和另外两个层是什么,作用是什么

解:

HTML(结构)和CSS(样式),假如盖一个楼:HTML就是整体楼空荡荡的框架,CSS相当于粉刷装修,JS就是给屋子里面通电后,电视机,空调,电脑等一系列功能性的东西

13、你做的页面在哪些内核浏览器测试过,说出3种

解:

Trident(IE内核)
Gecko(Firefox内核)
Webkit(Safari内核)

14、在jQuery中被誉为工厂函数的是

解:

$()
我的第一印象以为是要问工具方法有哪些:$.extend()、$.type()、$.proxy()

15、要动态改变层中内容可以使用的方法有

解:

innerHTML/innerText

16、当按键盘A时,使用onkeydown事件打印even.keyCode的结果是

解:

65

17、能设置或返回下拉列表中被选选项的索引号是什么属性

解:

selectedIndex 

18、希望图片具有”提交”按钮同样的功能,该如何编写表单提交

解:

在图片的onClick事件中手动提交

19、ping基于什么协议

解:

// 涨姿势了
ICMP:Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息

20、JS如何操作select中的值

解:

// http://www.cnblogs.com/jiujiaoyangkang/p/6797315.html 

21、console.log(1&&2)和console.log(1||2)结果是

解:

2和1,"&&"是同真才为真,开始1是真,还不能确定最终的结果,所以会继续往下运行是2,"||"是有真即真,1是真已经能确定结果就不会往下走了

22、下面代码的输出结果

解:

window.val = 1;
var json = {
    val: 10,
    dbl: function(){
        this.val *= 2;
    }
};
json.dbl();// json.val = 20
var dbl = json.dbl;
dbl();// window.val = 2
json.dbl.call(window);// window.val = 4
console.log(window.val + json.val);// 24
(function(){
    var val = 1;
    var json = {
        val: 10,
        dbl: function(){
            val *= 2;
        }
    };
    json.dbl();
    alert(json.val + val);// 12
}());
var foo = "Hello";
(function(){
    var bar = " world";
    alert(foo + bar);// Hello world
})();
alert(foo + bar);// Uncaught ReferenceError: bar is not defined
(function func(){
    var a = b = 'res';
})();
console.log(b);// res
console.log(a);// a is not defined

23、请实现下列的findDocList方法

var docs = [
    {
        id: 1,
        words: ['hello','world']
    },
    {
        id: 2,
        words: ['hello','kids']
    },
    {
        id: 3,
        words: ['hello','dogs']
    }
];
findDocList(docs, ['hello']);// 文档1,文档2,文档3
findDocList(docs, ['hello','world']);// 文档1

解:

function findDocList(docs, arr){
    for(var i = 0;i < docs.length; i++){
        var oBar = false;
        for(var j = 0;j < arr.length; j ++){
            var str = arr[j];
            if(docs[i].words.indexOf(str) == -1){
                oBar = true;
            }
        }
        if(!oBar){
            console.log('文档' + docs[i].id);
        }
    }
}

24、用JS写一个继承实例

解:

// 构造函数A
function A() {
    this.name = 'aaa';
}
A.prototype.showName = function() {
    console.log(this.name);
};
// 构造函数B
function B(){ /*...*/ }
// 继承开始
B.prototype = new A();
B.prototype.constructor = B;
// 使用
var b1 = new B();
b1.showName();

25、移动端如何适配不同手机屏幕,你的适配方案是什么

解:

百分比、REM、Flexible,后面展开说...

26、编写JS深度克隆函数deepClone

解:

// 浅拷贝
var json1 = {
    name: 'aaa',
    age: 25,
    data: {
        a: 1,
        b: 2
    }
};

function copy(parent, child) {
    var child = child || {};
    for(var i in parent) {
        child[i] = parent[i];
    }
    return child;
}

var json2 = copy(json1);
json2.data.a = 3;
console.log(json1.data.a);// json1.data.a受影响也变成3了
console.log(json2.data.a);
// 深拷贝:利用递归
var json1 = {
    name: 'aaa',
    age: 25,
    data: {
        a: 1,
        b: 2
    }
};

function deepCopy(parent, child) {
    var child = child || {};// 并不是直接声明一个新child为空{},传过来的就用传过来的
    for(var i in parent) {
        if(typeof parent[i] === 'object') {
            child[i] = (parent[i].constructor === Array) ? [] : {};// child.data = {};
            deepCopy(parent[i], child[i]);// {a: 1,b: 2},传过去的是child.data的空json
        }
        else {
            child[i] = parent[i];// child.data.a ...
        }
    }
    return child;
}

var json2 = deepCopy(json1);
json2.data.a = 3;
console.log(json1.data.a);// json1.data.a不受影响,仍旧是1
console.log(json2.data.a);

27、有一个数组a = [8, 10, 30, 55, 78, 90, 1],新建一个数组b,b从a中一次随机选取一个元素,取完为止

解:

var a = [8, 10, 30, 55, 78, 90, 1];
var b = [];
for(var i=0; i

27、假设发现有一篇文章,var content = "大量文字...",过滤其中的敏感词汇,如何发现敏感词汇并将其背景标记为红色

解:





    
    敏感词高亮
    
    



    
君子曰:学不可以已。   青,取之于蓝,而青于蓝;冰,水为之,而寒于水。木直中绳,輮以为轮,其曲中规,虽有槁暴,不复挺者,輮使之然也。故木受绳则直,金就砺则利,君子博学而日参省乎己,则知明而行无过矣。故不登高山,不知天之高也;不临深溪,不知地之厚也;不闻先王之遗言,不知学问之大也。干、越、夷、貉之子,生而同声,长而异俗,教使之然也。诗曰:「嗟尔君子,无恒安息。靖共尔位,好是正直。神之听之,介尔景福。」神莫大于化道,福莫长于无祸。

28、请用JS实现数组的快速排序

解:

推荐阮一峰老师的文章快速排序的JS实现

//  在数据集之中,选择一个元素作为"基准"
//  所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边
//  对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止
var arr = [3, 1, 4, 6, 5, 7, 2];
function quickSort(arr) {
    if(arr.length == 0) {
        return [];
    }
    var cIndex = Math.floor(arr.length / 2);
    var c = arr.splice(cIndex, 1);// 从索引n开始删除m个元素,并返回删除的元素,原来数组改变
    var l = [];
    var r = [];
    for (var i = 0; i < arr.length; i++) {
        if(arr[i] < c) {
            l.push(arr[i]);
        }
        else {
            r.push(arr[i]);
        }
    }
    return quickSort(l).concat(c, quickSort(r));
}
console.log(quickSort(arr));

29、编写sum()函数求和,非number类型参数需要进行过滤

解:

function sum() {
    var result = 0;
    for(var i = 0; i < arguments.length; i ++) {
        if(isNaN(arguments[i])){// 不是数字
            continue;
        }
        result += arguments[i];
    }
    console.log(result);
}
sum(7, 'aaa', 8, 'bbb');

30、写一个方法将字符串“abcdefg”逆序

解:

var str = "abcdefg";
function reverseStr(str) {
    return  str.split("").reverse().join("");
}
console.log( reverseStr(str) );

31、,让radio为选中状态

解:

// 注意两种不同的书写形式,jQuery中prop相当于原生"."的操作形式,attr相当于setAttribute
input.checked = true;
setAttribute('checked','checked');

32、HTML5为什么只需要写

解:

HTML5不基于SGML,因此不需要对DTD进行引用,只需要doctype来规范浏览器的行为即可。

33、

解:

link引用CSS时,在页面载入时同时加载;@import需要页面网页完全载入以后加载

link是XHTML标签,是普通DOM节点,无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持

34、HTML5离线缓存有几种方式

解:

localStorage和sessionStorage两种

35、Doctype作用,标准模式与兼容模式各有什么区别

解:

作用:告知浏览器的解析器用什么文档标准解析这个文档
区别:标准模式的排版和JS运作模式都是以该浏览器支持的最高标准运行,兼容模式顾名思义...

36、如何修改chrome记住密码后自动填充表单的黄色背景

解:

// 使用足够大的纯色内阴影来覆盖默认的背景色
input: -webkit-autofill {
    -webkit-box-shadow: 0 0 0px 1000px white inset;
}
// 或者关闭这个自带功能
autocomplete=‘off’

37、介绍JS的基本数据类型

解:

基本:number、string、boolean、null、undefined
引用:object

38、如何将字符串转换为数字,例如"12.3b"

解:

parseInt/parseFloat

39、如何将浮点数点左边的数12000000.11每3位添加一个逗号

解:

// 试着先理解,关于正则后面专门再写吧
var num = 12000000.11;

function addDot(num) {
    // ?=表示“只能是”,(\d{3})+:表示3的倍数个数字
    return num && num.toString().replace( /(\d)(?=(\d{3})+\.)/g, function($1, $2) {
        return $2 + ',';
    } );
}

var newNum = addDot(num);
console.log(newNum);

40、实现数组的随机排序,2种方法以上

解:

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.sort(function(num1, num2) {
    // -1表示每次num1在num2的前面,1则相反,用Math.random()和0.5相比较,也就实现随机的正反,即随机排序
    return Math.random() > 0.5 ? -1 : 1;
});
console.log(arr);

41、this在JS中如何工作的

解:

// case1:看方法名前面是否有点,有的话点前面是谁this就是谁
function fn(){
    console.log(this);
}
var obj = {
    fn:fn
};
fn();// this > window,严格模式下undefined
obj.fn();// this > obj

..........

function Person(){
    this.name = "yangk";
}
Person.prototype.showName = function(){
    console.log(this.name);
};
var p1 = new Person;
p1.showName();// this > p1
p1.__proto__.showName();// this > p1.__proto__
Person.prototype.showName();// this > p1.prototype
// case2:自执行函数中的this永远是window,严格模式下是undefined
(function(){
    console.log(this);// this > window
})();
~function(){
    console.log(this);// this > window
}();
// case3:元素的某一个行为绑定一个方法,this > 元素
function fn(){
    console.log(this);
}
oDiv.onclick = fn;
oDiv.onclick = fn();// 注意这里是执行的返回结果返回!!!!!!undefined
oDiv.onclick = function(){
    fn();// this  >  window
};
// case4:使用call/apply强制改变this
var obj = {
    fn: function(){
        console.log(this);
    }
};
obj.fn();// this > obj
obj.fn.call(12);// this > 12

.........

function sum(){
    
}
sum.call(100,100...)// 第一个参数是this,后面对应接受的形参,没有undefined
sum.call();//在非严格模式下,call的第一个参数不写或者写null/undefined,默认的this都是window,严格模式下写谁就是谁,写null就是null,不写是undefined
apply(obj,[...]);

42、请至少用两种方法实现两个变量对调,不借用第三个变量的情况下

解:

// 首先想到的是利用ES6的解构赋值
var a = 'Aaa';
var b = 'Bbb';

[a, b] = [b, a];
console.log(a);
console.log(b);
// 下面这种方法适用a和b都是数字的情况,还可以用位运算(^)有兴趣的研究下
var a = 666;
var b = 888;

a = a + b;// 先变和
b = a - b;// 和减b自然等于a,然后赋给b
a = a - b;// 和减b,此时的b已经是调换后的b了
console.log(a);
console.log(b);
// 把a变成一个JSON,也可以把a变成一个Array
var a = 'Aaa';
var b = 'Bbb';

a = {
    a: b,
    b: a// 此时的a还是'Aaa'
};
b = a.b;
a = a.a;
console.log(a);
console.log(b);
// 此方法神妙,不知道哪位大神想的,随意感受下
var a = 'Aaa';
var b = 'Bbb';

a = [b, b = a][0];// b = a先执行
console.log(a);
console.log(b);

43、实现一个300300的canvas画布,内含100100的红色矩形

解:

var oCanvas = document.createElement("canvas");
// 注意canvas设置宽高的正确姿势,不是oCanvas.style.width,其不是普通的DOM元素,有自己规则
oCanvas.width = 300;
oCanvas.height = 300;
document.body.appendChild(oCanvas);

var oGC = oCanvas.getContext('2d');

oGC.fillRect(50, 50, 100, 100);// L, T, W, H
oGC.fillStyle = "red";

44、用CSS或者JS实现物体的平移动画

解:

// CSS
利用transform:translate(x, y)
// JS
利用定时器

45、一个满屏“品”字布局如何设计

解:

// 定位或浮动,不具体写了

46、::before双冒号和单冒号的区别,解释其作用

解:

// 伪对象选择符和伪类选择符,双冒号是CSS3新增的,配合content在内容最前面添加一些内容

47、HTML5有哪些新特性

解:

// case1:新增/废除了一些标签,例如新增header,废除s、big
// case2:canvas
// case3:数据存储
// case4:Web Socket
// ...

48、如何判断变量是否是数组

解:

// typeof
// instanceof
// constructor
// Object.prototype.toString.call()

49、谈谈对闭包的理解

解:

// http://www.cnblogs.com/jiujiaoyangkang/p/5879384.html

50、列举一下JS垃圾回收方法以及原理

解:

// 详见JavaScript高级程序设计第78页

待续...

你可能感兴趣的:(20家前端面试题参考)