小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一石二鸟的一个小问题,既可以用来熟悉绝对URI格式中的内容,也可以借此熟悉几种数组中的操作~
本文包括下述几点内容,大家按需阅读~🧐
URI URL傻傻分不清楚?
绝对URI的格式
逐步递进三种方式查询字符串参数
简单遍历🥺
用Array.prototype.map()优化一下查询方法🤔
利用Array.prototype.reduce()一行完成查询(骄傲脸😎)
1.URI、URL傻傻分不清楚?
第二次读《图解HTTP》时,突然发现自己之前一直说“输入URL...”之类的内容,但是并不清楚URL的父类:URI是怎么样一个含义,今天来学习一下!
URI的定义
Uniform Resource Identifier 的缩写 即为 URI,中文名称是“统一Uniform资源Resource标识符Identifier” (配合上单词还是蛮好理解的~)
RFC2396分别对这三个单词进行了如下定义:
-
Uniform 规定统一的格式,可以方便处理多种不同类型的资源
-
Resourse
资源的定义是“可标识的任何东西”。除了文档文件、图像、服务等可以区别于其他类型的,都可以作为资源。
- Identifier 标识可标识的对象,也成为标识符。
综上所述,URI 就是由某个协议方案表示的资源的定位标识符。协议方案是指访问资源所使用的协议类型名称。
何为URL 何为URI
Uniform Resource Locator(统一资源定位符)
Uniform Resource Identifier(统一资源标识符)
二者在定义上很相似,作用也同样相似
当时看完上面这些《图解HTTP》中的定义我是有点懵的,那啥时候用URL URI啊,这俩有啥区别啊?
所以我求助了万能的百度,学习了下😂
URI用字符串标识某一互联网资源,而URL标识资源的地点(互联网上所处的位置)
说得大白话一些,URI就是“可以唯一标识一个资源”的一个标识符
URL就是“提供找到该资源的一个路径”,所以URL是URI(因为满足了URI的“唯一标识一个资源”)
可以看看下面RFC3986中给出的例子,urn(一本书的isbn)可以标识一本书,但这不是一个路径,所以不是URL
可见URL是URI的子集
“RFC3986:统一资源标识符(URI)通用语法”中列举了几种 URI 例子,如下所示。
充分理解的基础上,可以用URL替换URI~(某个URI不能准确寻址的话,就不能把它理解为URL了!)
2.绝对URI(URL)的格式
表示指定的URI,要使用涵盖全部信息的绝对URI、绝对URL以及相对URL(从浏览器基本URI处指定的URL /image/logo.gif这样的~)
来看看格式——
这其中的字符串分别的作用如下:(直接贴出来读书笔记了-太懒😢😢)
3.利用JavaScript获取URL地址中查询字符串参数
学习完URI相关内容,来看道面试题🧐
let url = "https://github.com/FangzhouSu/Constant-Front-End-Study/?a=1&b=2&c=3"上面我们学习到了URI格式中,查询字符串是针对已指定的文件路径内的资源,是位于“?”后面的内容
所以我们解题的关键就变为了“找到合适的方法来获取这个特定位置的字符串”
这题面试官肯定咱用高级一些的方法写出来,我们可以用到归并方法reduce
- 利用Array.prototype.reduce()一行完成查询(骄傲脸😎)
url.split('?')[1].split('&').reduce((obj, item) => (
obj[item.split('=')[0]] = item.split('=')[1], obj), {}
)
先将查询字符串划分为字符串数组
之后使用reduce方法进行归并
获得查询字符串以及对应参数,存在一个对象里面
感觉这个方法在好多其他场景也可以有应用的吧~(应该吧~后端接口需要返回过来的不都是这种JSON类型的数据嘛🤔)
总之reduce方法的妙用是很多的,一定要数量掌握呐~
下面两种方法就很简单了,不过能写出来可以证明我们思维很发散嘛~要了解的!
- 简单遍历🥺
console.log(getUrlArr());
function getUrlArr() {
let arr = [];
let url = "https://github.com/FangzhouSu/Constant-Front-End-Study/?a=1&b=2&c=3"
let str = url.split("?")[1];
let arr1 = str.split("&");
for(let i = 0; i < arr1.length; i++) {
let value = arr1[i].split("=")[1];
arr.push(value);
}
return arr;
}
-
用Array.prototype.map()优化一下查询方法🤔
let obj = {};
let result = url.split('?')[1].split('&').map((item) =>
(obj[item.split('=')[0]] = item.split('=')[1])
)
console.log(obj);
个人认为map 方法和reduce方法在这个例子的应用中是异曲同工的~只不过没有初始化obj的这个功能