一次,我在一个相邻团队的项目中看到了代码,该代码生成了带有URL参数的字符串,随后将其插入iframe
src属性。
这篇文章看似多余,明显或过于简单,但由于它是在野生动物中发现的,因此您不应对此保持沉默,而应分享最佳实践。
原始代码如下:
const createQueryString = (param1, param2, objectId, timestamp, name) => {
const encodedTimestamp = encodeURIComponent(timestamp);
const delimiter = '&';
const queryString = `${param1}${delimiter}
param2=${param2}${delimiter}
objectId=${objectId}${delimiter}
itemTimestamp=${encodedTimestamp}${delimiter}
itemName=${name}`;
return queryString.replace(/ /g, '%20');
};
作为参考,param1
并且param2
在原来的代码有说名字。并且它们的值可以是任何字符串,其中包含很多无效的URL字符
此代码有什么问题?
- 首先,这是
encodeURIComponent
每个值都不存在的原因,每个值都可能包含绝对的任何字符。(在此任务的上下文中,这些名称由用户设置,并且可以包含各种字符,例如与号,空格或变音符); - 其次,由于模板字符串运算符,这些是多余的空格和换行符
`
;他们的代码作者正在尝试使用方法进行修复.replace()
,但是这种方法无法解决任何问题; - 第三,由于所选择的语法容易出错,因此难以阅读且代码不可扩展。
如何解决?
第一种方法:
const delimiter = '&';
const createQueryString = (param1, param2, objectId, timestamp, name) => {
const queryString = [
`param1=${encodeURIComponent(param1)}`,
`param2=${encodeURIComponent(param2)}`,
`objectId=${encodeURIComponent(objectId)}`,
`itemTimestamp=${encodeURIComponent(timestamp)}`,
`itemName=${encodeURIComponent(name)}`
].join(delimeter);
return queryString;
};
? . , encodeURIComponent
. , . .
? ! :
const createQueryString = (param1, param2, objectId, timestamp, name) => {
const queryParams = {
param1,
param2,
objectId,
itemTimestamp: timestamp,
itemName: name
};
const encodeAndJoinPair = pair => pair.map(encodeURIComponent).join('=');
return Object.entries(queryParams).map(encodeAndJoinPair).join('&');
};
. , — .
, . , .
. , ? , queryParams
. . , . , :
const encodeAndJoinPair = pair => pair
.map(encodeURIComponent)
.join('=');
const createQueryString = objectParams => Object
.entries(objectParams)
.map(encodeAndJoinPair)
.join('&');
};
utils.js
.
URLSearchParams
Web API. URLSearchParams .
:
const createQueryString = objectParams => new URLSearchParams(objectParams).toString();
Internet Explorer, , , https://www.npmjs.com/package/url-search-params-polyfill .
如果代码显得冗长,令人困惑,则可能有简单的方法可以对其进行改进。
而且还可能在Web API级别实现所需的功能。