# util
* `[Doc]` URL
* `[Doc]` Query Strings (ćĽčŻ˘ĺ珌串)
* `[Doc]` Utilities (ĺŽç¨ĺ˝ć°)
* `[Basic]` ćŁĺ襨螞ĺź
## URL
```javascript
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â href â
ââââââââââââŹâŹââââââââââââŹââââââââââââââââââŹââââââââââââââââââââââââââââŹââââââââ¤
â protocol ââ auth â host â path â hash â
â ââ ââââââââââââŹâââââââźâââââââââââŹââââââââââââââââ⤠â
â ââ â hostname â port â pathname â search â â
â ââ â â â âââŹââââââââââââââ⤠â
â ââ â â â â â query â â
" http: // user:pass @ host.com : 8080 /p/a/t/h ? query=string #hash "
â ââ â â â â â â â
ââââââââââââ´â´ââââââââââââ´âââââââââââ´âââââââ´âââââââââââ´ââ´âââââââââââââââ´ââââââââ
```
### 轏äšĺ珌
常č§çéčŚč˝Źç§ťçĺ珌ĺ襨:
|ĺ珌|encodeURI|
|---|---|
|`' '`|`'%20'`|
|`<`|`'%3C'`|
|`>`|`'%3E'`|
|`"`|`'%22'`|
|```|`'%60'`|
|`\r`|`'%0D'`|
|`\n`|`'%0A'`|
|`\t`|`'%09'`|
|`{`|`'%7B'`|
|`}`|`'%7D'`|
|`|`|`'%7C'`|
|`\\`|`'%5C'`|
|`^`|`'%5E'`|
|`'`|'%27'|
ćłäşč§Łć´ĺ¤? ä˝ ĺŻäťĽčżć ˇ:
```javascript
Array(range).fill(0)
.map((_, i) => String.fromCharCode(i))
.map(encodeURI)
```
range ĺ
ćĽä¸Ş 255 čŻčŻ (doge
## Query Strings
query string ĺąäş URL çä¸é¨ĺ, č§ä¸ćš URL ç襨. ĺ¨ Node.js ä¸ćĺ
罎ćäžä¸ä¸Ş `querystring` ç樥ĺ.
|ćšćł|ćčż°|
|---|---|
|.parse(str[, sep[, eq[, options]]])|ĺ°ä¸ä¸Ş query string 解ć为 json 寚蹥|
|.unescape(str)|äž .parse č°ç¨çĺ
罎解轏äšćšćł, ć´é˛ĺşćĽäťĽäžç¨ćˇčŞčĄćżäťŁ|
|.stringify(obj[, sep[, eq[, options]]])|ĺ°ä¸ä¸Ş json 寚蹥轏ć˘ć query string|
|.escape(str)|äž .stringify č°ç¨çĺ
罎轏äšćšćł, ć´é˛ĺşćĽäťĽäžç¨ćˇčŞčĄćżäťŁ|
Node.js ĺ
罎ç querystring çŽĺ寚äşć桹庌ççťćĺ°ä¸ćŻć. č§ĺŚä¸:
```javascript
const qs = require('qs'); // 珏ä¸ćš
const querystring = require('querystring'); // Node.js ĺ
罎
let obj = { a: { b: { c: 1 } } };
console.log(qs.stringify(obj)); // 'a%5Bb%5D%5Bc%5D=1'
console.log(querystring.stringify(obj)); // 'a='
let str = 'a%5Bb%5D%5Bc%5D=1';
console.log(qs.parse(str)); // { a: { b: { c: '1' } } }
console.log(querystring.parse(str)); // { 'a[b][c]': '1' }
```
> <a name="q-get-param"></a> HTTP ĺŚä˝éčż GET ćšćł (URL) äź é let arr = [1,2,3,4] çťćĺĄĺ¨?
```javascript
const qs = require('qs');
let arr = [1,2,3,4];
let str = qs.stringify({arr});
console.log(str); // arr%5B0%5D=1&arr%5B1%5D=2&arr%5B2%5D=3&arr%5B3%5D=4
console.log(decodeURI(str)); // 'arr[0]=1&arr[1]=2&arr[2]=3&arr[3]=4'
console.log(qs.parse(str)); // { arr: [ '1', '2', '3', '4' ] }
```
éčż `https://your.host/api/?arr[0]=1&arr[1]=2&arr[2]=3&arr[3]=4` ĺłĺŻäź éć arr ć°çťäź éçťćĺĄĺ¨
## util
util.is*() äť v4.0.0 ĺźĺ§č˘Ťä¸ĺťşčŽŽä˝żç¨ĺłĺ°ĺşĺź (deprecated). 大ćŚçĺşĺźĺĺ , çŹč
个人莤为ćŻçť´ć¤čżäşĺč˝ĺĺä¸čŽ¨ĺĽ˝, čä¸ç°ĺ¨ćľčĄç轎ĺéŁäšĺ¤. éŁäšä¸ä¸ćŻĺ
ˇä˝ĺ襨:
* util.debug(string)
* util.error([...strings])
* util.isArray(object)
* util.isBoolean(object)
* util.isBuffer(object)
* util.isDate(object)
* util.isError(object)
* util.isFunction(object)
* util.isNull(object)
* util.isNullOrUndefined(object)
* util.isNumber(object)
* util.isObject(object)
* util.isPrimitive(object)
* util.isRegExp(object)
* util.isString(object)
* util.isSymbol(object)
* util.isUndefined(object)
* util.log(string)
* util.print([...strings])
* util.puts([...strings])
* util._extend(target, source)
ĺ
śä¸ĺ¤§é¨ĺé˝ĺŻäťĽä˝ä¸şé˘čŻé˘ćĽéŽĺŚä˝ĺŽç°.
### util.inherits
> Node.js ä¸çť§ćż (util.inherits) çĺŽç°?
https://github.com/nodejs/node/blob/v7.6.0/lib/util.js#L960
```javascript
/**
* Inherit the prototype methods from one constructor into another.
*
* The Function.prototype.inherits from lang.js rewritten as a standalone
* function (not on Function.prototype). NOTE: If this file is to be loaded
* during bootstrapping this function needs to be rewritten using some native
* functions as prototype setup using normal JavaScript does not work as
* expected during bootstrapping (see mirror.js in r114903).
*
* @param {function} ctor Constructor function which needs to inherit the
* prototype.
* @param {function} superCtor Constructor function to inherit prototype from.
* @throws {TypeError} Will error if either constructor is null, or if
* the super constructor lacks a prototype.
*/
exports.inherits = function(ctor, superCtor) {
if (ctor === undefined || ctor === null)
throw new TypeError('The constructor to "inherits" must not be ' +
'null or undefined');
if (superCtor === undefined || superCtor === null)
throw new TypeError('The super constructor to "inherits" must not ' +
'be null or undefined');
if (superCtor.prototype === undefined)
throw new TypeError('The super constructor to "inherits" must ' +
'have a prototype');
ctor.super_ = superCtor;
Object.setPrototypeOf(ctor.prototype, superCtor.prototype);
};
```
## ćŁĺ襨螞ĺź
ćŁĺ襨螞ĺźććŠççŠĺŚä¸ç¨ćĽć述大čçĽçťĺ
çä¸ç§čĄ¨čžžĺź, 袍 GNU ç大čĄĺćżćĽĺĺ珌串ĺšé
äšĺĺ¨ĺćŹçé衯ä¸ć¸čĄć¸čż.
ć´çä¸..
## 常ç¨ć¨Ąĺ
[Awesome Node.js](https://github.com/sindresorhus/awesome-nodejs)
[Most depended-upon packages](https://www.npmjs.com/browse/depended)
> <a name="q-traversal"></a> ĺŚä˝čˇĺć个ć䝜多ä¸ććçćäťśĺ?
ä¸ä¸ŞçŽĺçäžĺ:
```javascript
const fs = require('fs');
const path = require('path');
function traversal(dir) {
let res = []
for (let item of fs.readdirSync(dir)) {
let filepath = path.join(dir, item);
try {
let fd = fs.openSync(filepath, 'r');
let flag = fs.fstatSync(fd).isDirectory();
fs.close(fd); // TODO
if (flag) {
res.push(...traversal(filepath));
} else {
res.push(filepath);
}
} catch(err) {
if (err.code === 'ENOENT' && // link ćäťśćä¸ĺź
!!fs.readlinkSync(filepath)) { // ĺ¤ććŻĺŚ link ćäťś
res.push(filepath);
} else {
console.error('err', err);
}
}
}
return res.map((file) => path.basename(file));
}
console.log(traversal('.'));
```
ĺ˝çśäšĺŻäťĽ Oh my [glob](https://github.com/isaacs/node-glob):
```javascript
const glob = require("glob");
glob("**/*.js", (err, files) {
if (err) {
throw new Error(err);
}
console.log('Here you are:', files.map(path.basename));
});
```