每日一题 (2.10)

113 阅读3分钟

代码

温故
## 解析 URL 参数为对象

答案

const parseURL = (url)=>{
    const parseObj = {}
    url.split("?")[1].split("&").map(item=>{
        if (item.indexOf("=") > -1){
            const [key,value] = item.split("=");
            parseObj[key] = decodeURIComponent(value)
        }else {
            parseObj[item] = true
        }
    })
    return parseObj
}
知新
## 字符串模板
let template = '我是{{name}},年龄{{age}},性别{{sex}}'; 
let person = { name: '布兰', age: 12 }

render(template, person); // 我是布兰,年龄12,性别undefined

答案

const render = (template,obj)=>{
    const reg = /{{(\w+)}}/
    if (reg.test(template)){
        const key = reg.exec(template)[1]
        template = template.replace(reg,obj[key])
        return render(template,obj)
    }
    return template
}

test:用来测试给定的templete字符串是否包含字符。exec:用来解析你拿到的字符串,返回一个数组,第一个参数是匹配到的字符串,第二个参数如果正则中包含括号就解析括号内的字符串,如果没有就为该匹配的字符串的index

常识类:

温故

ajax的过程?

const resquest = new XMLHttpRequest();
request.open("GET",URL,"true"); //第一个是方法,第二个是URL,可以相对路径也可以绝对路径,第三个是是否异步
request.send();
request.onreadystatechange = (res)=>{
    if(res.status === 200 && res.readystate === 4){
        //成功
    }
}

状态码分类:
1xx:继续,此时已经收到一部分请求的内容,其他的正在等待
2xx:成功
3xx:重定向
4xx:错误,网络本地错误,url拼写等等
5xx:服务器错误

知新

状态码200和304的区别? 这个要从浏览器请求网页的方式讲起。
浏览器第一次遇到url地址,首先会去跟服务器发送对应的请求,于是状态码返回200 OK,此时所有的数据都将会被设置一个缓存过期时间,修改文件时间和缓存保存在本地。接着第二次网页又遇到这个url的时候,就会去跟本地的缓存过期时间对比,如果时间并没有超过,就会返回一个200 OK(from chache)。如果超过了,浏览器会将之前保存修改文件时间和一部分第一次请求收到的数据发送给服务器进行询问,如果发现两者均相同,则返回之前的缓存,状态码为304 Not Modified。如果两者中有一个不同,此时认定网页发生了改变,就会再次发送请求,重复第一次请求的过程
nginx怎么解决history模式路由向服务器发送请求?
当我们使用history模式进行路由的跳转的时候,不同于hash模式,history模式依靠的是h5的api进行的跳转。比如我们在路径/index的时候,我们能访问到,接着访问/index/name的时候因为原理是本地的路由跳转,于是我们也能访问到,而当我们刷新页面的时候,因为此时直接访问的额路径/index/name,但是nginx不知道,于是就变成了空白的页面。
此时写上try_files $uri $uri/ /index这句话。这句话的作用在于在nginx发现访问不了的时候,会根据最后写的url作为根路径加上url进行访问,于是之前无法解读的/index/name就能被访问到了。(这段我也不大懂,不知道对不对,以后会了后端再来看看)