wkiwi的博客

面试问题集合

发布时间:6年前热度: 4362 ℃评论数:
1.Ajax请求被缓存的几种处理方式

一、通过URL添加后缀的方式
这种方式是我们大家都会使用的技巧,大多人都知道
例如:
本来请求的地址是: /home/action?
加查询参数后缀后:/home/action?ran=Match.Random();
后缀查询参数变量可以自定义,只需要每次都变化即可!

二、通过Jquery的Ajax API设置相关属性

var LoadTime = function () {
    $.ajaxSetup({ cache: false });
    $.ajax({
        url: '@Url.Action("currTime")',
        success: function (result) {
            $("#currTime").html(result);
        }
    })
}


三、通过定制响应

我们都知道http请求头重包请求的相关属性,此种方式通过控制消息头中的Cache-Control包头,并将其设置为”No-Cache”,这样只是浏览器不对结果缓存.
1、在ajax发送请求前加上 xmlHttpRequest.setRequestHeader(“Cache-Control”,”no-cache”);
2、在服务端加 header(“Cache-Control: no-cache, must-revalidate”);
3、在ajax发送请求前加上 xmlHttpRequest.setRequestHeader(“If-Modified-Since”,”0″);

2.实现获取任意月份有多少天的函数
function getMonthLength(date) {
  let d = new Date(date)
  // 将日期设置为下月一号
  d.setMonth(d.getMonth()+1)
  d.setDate('1')
  // 获取本月最后一天
  d.setDate(d.getDate()-1)
  return d.getDate(); 
}

function getMonthLength(year, month){
  return new Date(year, month, 0).getDate()
}


3.怎样用只一个6升和5升的水壶装3升水

先把5升的装满倒入6升的壶,然后再5升装满倒入6升。6升的水壶清空,把5升壶里的4升水倒进去。重新打满5升的壶,倒入6升的壶,正好剩下3升水。


4.vuex在页面刷新时如何处理
由于vue自身特性的原因,vuex中的数据在页面刷新之后其中的数据会初始化,这就导致组件之间通过vuex传递的数据在用户f5刷新页面之后会丢失

这里结合h5的localStorage实现页面刷新之后数据不丢失的方法
const store = new Vuex.Store({
  // 定义状态
  state: {
    lang: localStorage.getItem("changeLang") || 'zh', //先去localStorage中获取数据
    myInfo: JSON.parse(localStorage.getItem("myInfo")) || {}, //这里使用JSON.parse是因为我localStorage中保存的是一个对象字符串
  },
  //修改状态
  mutations:{
    setInfo(state,info){
      localStorage.setItem('myInfo', JSON.stringify(info)); //将传递的数据先保存到localStorage中
      state.myInfo = info;// 之后才是修改state中的状态
    },
    changeLangEvent(state, type) {
      localStorage.setItem('changeLang', type);
      state.lang = type;
    },
  },
})
export default store


5.vue中你用过哪些服务端渲染

skeleton,

6. jQuery中的extend()

Objectj Query.extend( target, object1, [objectN])
用一个或多个其他对象来扩展一个对象,返回被扩展的对象


var settings = { validate: false, limit: 5, name: "foo" }; 
var options = { validate: true, name: "bar" }; 
jQuery.extend(settings, options); 
结果:settings == { validate: true, limit: 5, name: "bar" }

jQuery.fn.extend = jQuery.prototype.extend

你可以拓展一个对象到jQuery的 prototype里去,这样的话就是插件机制了。

(function( $ ){
  $.fn.tooltip = function( options ) {
  };
  //等价于
  var tooltip = {
    function(options){
    }
  };
  $.fn.extend(tooltip) = $.prototype.extend(tooltip) = $.fn.tooltip
})( jQuery );

7.js实现深克隆

// 方法一 利用迭代
// 思路是:判定要克隆的对象是不是引用类型,如果是引用类型,则继续迭代,如果该项是基本类型,则直接复制。
function deepClone(obj){
    let newObj=Array.isArray(obj)?[]:{}

    if(obj&&typeof obj ==="object"){
        for(let key in obj){
            if(obj.hasOwnProperty(key)){
                newObj[key]=(obj && typeof obj[key]==='object')?deepClone(obj[key]):obj[key];
            }
        }
    }
    return newObj
}

let a=[{c:1},2,3,4],
b=deepClone(a);
a[0]={c:2};
console.log(a,b);
//方法2  利用JSON对象的方法
//主要是利用JSON.stringify和JSON.parse,这种办法只能实现纯数据的克隆,如果存在function则会直接忽略,不会进行复制操作

function deepClone2(obj){
    return JSON.parse(JSON.stringify(obj))
}

let a1={a: 1, b: function() {}}
b1=deepClone2(a1);
console.log(a1,b1);

8.js 斐波那契数列实现

递归 function fib(n){

if(n==1||n==2){

return 1; }

return fbnq(n-1)+fbnq(n-2);

}
fbnq(10);
//55

function fibonacci(n){ var a = 0, b = 1, num = 0; if (n==0){ return 0; }else if(n==1){ return 1; } for(var i=1;i<n;i++){ num = a + b; a = b; b = num; } return num; }


面试,面试宝典

手机扫码访问