前端部分高频面试题


该文整理了部分目前公司在面试前端时问的重复率较高的问题,持续更新中

1.http相关问题

问:http是什么?http的组成?http的状态码?http的请求方法?http和https的区别?

1.1 http是什么?

http(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定。也就是说,http协议规定了超文本传输所要遵守的规则。
附赠:那么网页在输入URL到加载,http究竟做了哪些工作呢?请看下图
在这里插入图片描述

1.2 http的组成?

HTTP请求由状态行、请求头、请求正文三部分组成:

  • 状态行:包括请求方式Method、资源路径URL、协议版本Version;
  • 请求头:包括一些访问的域名、用户代理、Cookie等信息;
  • 请求正文:就是HTTP请求的数据。

1.3 http的状态码?

http的状态码告知从服务端请求得结果。

  • 1xx:接受的请求正在处理。
  • 2xx:请求正常,处理完毕
    • 200 一切正常
    • 204 请求处理成功,但没有资源返回
    • 206 客户端对资源某一部分的请求
  • 3xx:需要进行附加操作完成
    • 301 请求资源被分配新的url
    • 302 请求资源临时被分配新的url
    • 303 请求对应的资源存在着另一个url
  • 4xx:服务器无法处理请求
    • 400 请求报文中存在错误的语法
    • 401 发送的请求需要http认证
    • 403 服务器拒绝客户端访问
    • 404 服务器没有请求的资源
  • 5xx:服务器处理请求错误
    • 500 内部资源出现故障
    • 503 服务器暂时处于高负荷或者停机维护状态

1.4 http的请求方法?

请求方式Method一般有GET、POST、PUT、DELETE,含义分别是获取、修改、上传、删除,其中GET方式仅仅为获取服务器资源,方式较为简单,因此在请求方式为GET的HTTP请求数据中,请求正文部分可以省略,直接将想要获取的资源添加到URL中。

1.5 http与https的区别?

https是什么?
安全超文本传输协议 它是一个安全通信通道,基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的 安全版。

区别:

  • 传输方式不同:http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
  • 连接方式不同:http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • 安全度不同:http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
  • 费用不同:https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
  • 传输效率不同:因为https需要加密,所以传输效率比http低一些。
  • 防劫持上:防劫持性:HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。

2. 前端页面如何实现性能优化?

  • 1.css放置在页面顶部,js文件依据需求放置。
  • 2.尽可能少的设置全局变量。
  • 3.尽量减少Dom操作。
  • 4.不要在标签中设置样式,尽量引入外部的css文件。
  • 5.减少http请求,合理设置http缓存。
  • 6.使用浏览器缓存。
  • 7.如果遇到大文件,可以将大文件放置在一个定时器中,利用异步操作,等其他文件加载完成以后再去加载大文件。
  • 8.图片的优化。
  • 9.图片的懒加载。
  • 10.减少cookie存储,尽量使用localstorage存储本地数据。
  • 11.使用JSON格式来进行数据交换,使用CDN加速,使用HTTP缓存。
  • 12.使用DNS预解析
    详情请点击此处跳转(或者去博主的主页)

3. 数组的相关问题

3.1 数组的去重

1.for循环嵌套,利用splice去重

function newArr(arr){
    for(var i=0;i<arr.length;i++){
        for(var j=i+1;j<arr.length;j++)
            if(arr[i]==arr[j]){ 
            //如果第一个等于第二个,splice方法删除第二个
            arr.splice(j,1);
            j--;
            }
        }
	return arr;
    }
var arr1 = [1,1,2,5,6,3,5,5,6,8,9,8];
console.log(newArr(arr1))

2.新建数组,利用indexof()去重

此方法也是es5中比较简单的方法之一,基本思路是新建一个数组,原数组遍历传入新数组,判断值是否存在,值不存在就加入该新数组中;该方法“indexOf”是es5的方法,IE8以下不支持。

   function newArr(array){ 
    //一个新的数组 
    var arrs = []; 
    //遍历当前数组 
    for(var i = 0; i < array.length; i++){ 
        //如果临时数组里没有当前数组的当前值,则把当前值push到新数组里面 
        if (arrs.indexOf(array[i]) == -1){ 
            arrs.push(array[i])
        }; 
    } 
    return arrs; 
} 
var arr1 = [1,1,2,5,5,6,8,9,8];
console.log(newArr(arr1))

3.利用ES6的Set去重

  function newArr(arr){
    return Array.from(new Set(arr))
}
 
var arr = [1,1,2,9,6,9,6,3,1,4,5];
 
console.log(newArr(arr))

4.使用对象记录重复的元素,以及出现的次数

下方案例在去重的同时,也显示了数据重复的次数,本案例摘自博客园TZ张无忌,
点击查看详情

    // 首先声明一个数组稍后使用
    var _arr = ['旅行箱', '旅行箱', '小米', '大米', '大米', '大米', '大米'];
    // 创建一个空数组存放数据
    var _res = []; //
    // 先对数组进行排序,相同的字符会排在一起
    _arr.sort();
    // 对整个数组进行遍历
    for (var i = 0; i < _arr.length;) {
        // 默认出现次数为0
        var count = 0;
        // 声明一个变量J,让J等于I,如果下一个字符等于当前索引,就把count的值加1
        for (var j = i; j < _arr.length; j++) {
            if (_arr[i] == _arr[j]) {
                count++;
            }
        }
        // 然后把当前索引I保存下来,依旧count的值存起来
        _res.push([_arr[i], count]);
        i += count;
    }
    //_res 二维数维中保存了 值和值的重复数
    var _newArr = [];
    for (var i = 0; i < _res.length; i++) {
        // console.log(_res[i][0] + "重复次数:" + _res[i][1]);
        _newArr.push(_res[i][0] + 'x' + _res[i][1]);
    }
    console.log(_newArr)

3.2 数组排序

1.冒泡排序

依次对数组中相邻数字进行比较(两两比较),大的放后面

//定义一个杂乱的数组
var arr = [5,99,2,9,1,5,67,7,10,23] 
//大循环,用于遍历数组每个元素    
for(var i=0;i<arr.length-1;i++){  
//小循环,用于将数组中的某个元素与其它所有元素相比较       
    for(var j=0;j<arr.length-i-1;j++){ 
        //声明一个局部变量,当作第三个空瓶子  
        var sum;
        //判断当前元素和后一个元素的大小,如果当前元素比后一个元素大                         
        if(arr[j]>arr[j+1]){             
            sum = arr[j+1];     //将后一个元素(小元素)放在空瓶子里
            arr[j+1] = arr[j];  //将当前元素(大元素)放在后一个元素的位置
            arr[j] = sum;       //将小元素从空瓶子中拿出来,放在当前元素的位置
        }
    } 
}
console.log(arr);//完成循环之后,初始数组的顺序已经发生改变

2. 选择排序

将第一位依次与后面的元素相比较,得到最小值,与第一位交换。再用第二位依次与后面元素相比较,得到最小值,与第二位交换。
从原始数据中找到最小元素,并放在数组的最前面。然后再从下面的元素中找到最小元素,放在之前最小元素的后面,直到排序完成。

var arr = [5,99,2,9,1,5,67,7,10,23]
for(var i=0;i<arr.length-1;i++){       //大循环,需要比对的次数
    var min = arr[i];                  //假定一个最小值
    var minIndex = i;                  //假定最小值的索引
    for(var j=i+1;j<arr.length;j++){   //小循环,每次需要比对的次数
        if(min>arr[j]){                //判断最小值是否为真的最小值
            min = arr[j];              //获取真正的最小值
            minIndex = j;              //获取真正最小值的索引
        }
    }

    arr[minIndex] = arr[i];            //将当前元素放在最小值的位置
    arr[i] = min;                      //将最小值放在当前元素的位置
}
console.log(arr);                      //输入排序好的数组  

3. 对包含对象的数组排序

要求根据对象中的年龄进行由大到小的顺序排列,实际开发中,会经常碰到这种需求。
例如将数据[{‘name’: ‘张三’, age: 26},{‘name’: ‘李四’, age: 12},{‘name’: ‘王五’, age: 37},{‘name’: ‘赵六’, age: 4}]按照年龄进行排序。
在此之前我们先来回顾一下sort方法

  • sort()排序不会产生新的数组,而是原地排序
  • sort()不添加function() 时,默认按照字符串的Unicode码位点(code point)排序。
  • sort()如果指明了 function(x,y) ,那么数组会按照调用该函数的返回值排序。
    1、function(x,y) 返回值为小于 0 ,那么 x 会被排列到 y 之前.
    2、function(x,y) 返回值为 0 ,那么 x和 y 的位置保持相对不变.
    3、function(x,y) 返回值为大于 0 ,那么 x 会被排列到 y 之后.
'use strict';
var arr = [10, 20, 1, 2];
arr.sort()
//排序过后 arr = [1, 10, 2, 20]

arr.sort(function(x, y) {
  return x - y
})
//排序过后 arr = [1, 2, 10, 20]

//使用箭头函数
arr.sort((x, y) => { return x - y })

接下来我们对数据进行排序,依照年龄从小到大进行排序。

var arr = [{'name': '张三', age: 26},{'name': '李四', age: 12},{'name': '王五', age: 37},{'name': '赵六', age: 4}];
var objectArraySort = function (keyName) {
 return function (objectN, objectM) {
  var valueN = objectN[keyName]
  var valueM = objectM[keyName]
  if (valueN < valueM) return -1
  else if (valueN > valueM) return 1
  else return 0
 }
}
arr.sort(objectArraySort('age'))
console.log(arr) 
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值