encodeURIComponenet会编码如下这些字符#:;/?$&+,@=,而encodeURI不会
v8代码片段如下
// 代码片段一 v8/src/uri.h
// 第三个参数不一样
// ES6 section 18.2.6.4 encodeURI (uri)
static MaybeHandle<String> EncodeUri(Isolate* isolate, Handle<String> uri) {
return Encode(isolate, uri, true);
}
// ES6 section 18.2.6.5 encodeURIComponenet (uriComponent)
static MaybeHandle<String> EncodeUriComponent(Isolate* isolate,
Handle<String> component) {
return Encode(isolate, component, false);
}
// 代码片段二 v8/src/uri.cc Encode方法
// 如果is_uri为true并且字符为uri separator则跳过encode
if (IsUnescapePredicateInUriComponent(cc1) ||
(is_uri && IsUriSeparator(cc1))) {
buffer.Add(cc1);
} else {
EncodeSingle(cc1, &buffer);
}
// 代码片段三 v8/src/uri.cc
// 跳过encode的字符
bool IsUriSeparator(uc16 c) {
switch (c) {
case '#':
case ':':
case ';':
case '/':
case '?':
case '$':
case '&':
case '+':
case ',':
case '@':
case '=':
return true;
default:
return false;
}
}