国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

你不知道的 Node.js util

開發(fā) 前端
在 JavaScript 中,進(jìn)行變量的類型校驗是一個非常令人頭疼的事,如果只是簡單的使用 typeof 會到各種各樣的問題。

[[435192]]

從類型判斷說起

在 JavaScript 中,進(jìn)行變量的類型校驗是一個非常令人頭疼的事,如果只是簡單的使用 typeof 會到各種各樣的問題。

舉幾個簡單的🌰:

  1. console.log(typeof null) // 'object' 
  2. console.log(typeof new Array) // 'object' 
  3. console.log(typeof new String) // 'object' 

后來,大家發(fā)現(xiàn)可以使用 Object.prototype.toString() 方法來進(jìn)行變量類型的判斷。

  1. const getTypeString = obj => Object.prototype.toString.call(obj) 
  2.  
  3. getTypeString(null) // '[object Null]' 
  4. getTypeString('string') //'[object String]' 
  5. getTypeString(new String) //'[object String]' 

對 toString() 方法進(jìn)行代理,可以得到一個類型字符串,我們就可以在這個字符串上面搞事情。

  1. const getTypeString = obj => { 
  2.   return Object.prototype.toString.call(obj) 
  3. const isType = type => { 
  4.   return obj => { 
  5.     return getTypeString(obj) === `[object ${type}]` 
  6.   } 
  7.  
  8. const isArray = isType('Array') // 該方法一般通過 Array.isArray 代替 
  9.  
  10. const isNull = isType('Null'
  11. const isObject = isType('Object'
  12. const isRegExp = isType('RegExp'
  13. const isFunction = isType('Function'
  14. const isAsyncFunction = isType('AsyncFunction'
  1. isNull(null) // true 
  2. isObject({}) // true 
  3. isRegExp(/\w/) // true 
  4. isFunction(() => {}) // true 
  5. isAsyncFunction(async () => {}) // true 

But,在 Node.js 中,內(nèi)部其實是有一組用來判斷變量類型的 api 的。而且功能異常豐富,除了基礎(chǔ)類型的判斷,還支持判斷 Promise 對象、Date 對象、各種ArrayBuffer。

  1. const types = require('util/types'
  2.  
  3. types.isDate(new Date) // true 
  4. types.isPromise(new Promise(() => {})) // true 
  5. types.isArrayBuffer(new ArrayBuffer(16)) // true 

嚴(yán)格相等

在 JavaScript 中,對象、數(shù)組等變量在判斷相等的過程中,如果用 === 通常只會判斷這兩個變量是否指向同一內(nèi)存地址。如果想判斷對象的鍵對應(yīng)的所有值是否相等,需要對兩個對象進(jìn)行遍歷。在 util 中,也提供了一個方法可以用來判斷兩個對象是否嚴(yán)格相等:util.isDeepStrictEqual(val1, val2)

  1. const util = require('util'
  2.  
  3. const val1 = { name'shenfq' } 
  4. const val2 = { name'shenfq' } 
  5.  
  6. console.log('val1 === val2', val1 === val2) // false 
  7. console.log('isDeepStrictEqual', util.isDeepStrictEqual(val1, val2)) // true 

該方法同樣可以用來判斷數(shù)組,是否嚴(yán)格相等:

  1. const util = require('util'
  2.  
  3. const arr1 = [1, 3, 5] 
  4. const arr2 = [1, 3, 5] 
  5.  
  6. console.log('arr1 === arr2', arr1 === arr2) // false 
  7. console.log('isDeepStrictEqual', util.isDeepStrictEqual(arr1, arr2)) // true 

Error First & Promise

早期的 Node API 都是 Error First 風(fēng)格的,也就是所有的異步函數(shù)都會接受一個回調(diào)函數(shù),該回調(diào)的一個參數(shù)為 error 對象,如果正常返回 error 對象為 null,后面的參數(shù)為成功響應(yīng)的結(jié)果。

  1. // 下面是一個讀取文件的示例 
  2. const fs = require('fs'
  3. fs.readFile('nginx.log', (error, data) => { 
  4.   if (error) { 
  5.     // 讀取文件失敗 
  6.     console.error(error) 
  7.     return 
  8.   } 
  9.   // 讀取文件成功,打印結(jié)果 
  10.   console.log(data) 
  11. }) 

在 Node 8 發(fā)布的時候,新增了一個 promisify 接口,用于將 Error First 風(fēng)格的 API 轉(zhuǎn)為 Promise API。

  1. const fs = require('fs'
  2. const util = require('util'
  3.  
  4. const readFile = util.promisify(fs.readFile) 
  5. readFile('./2021-11-11.log', { encoding: 'utf-8' }) 
  6.   .then(text => console.log(text))  
  7.  .catch(error => console.error(error)) 

不過,后來也有很多人覺得這些原生 API 支持 Promise 的方式太過繁瑣,每個 API 都需要單獨的包裝一層 promisify 方法。在 Node 10 發(fā)布的時候,原生模塊都新增了一個 .promises 屬性,該屬性下的所有 API 都 Promise 風(fēng)格的。

  1. const fs = require('fs').promises 
  2. fs.readFile('./2021-11-11.log', { encoding: 'utf-8' }) 
  3.   .then(text => console.log(text))  
  4.  .catch(error => console.error(error)) 

 

注意:Node 14 后,promises API 又新增了一種引入方式,通過修改包名的方式引入。

  1. const fs = require('fs/promises'
  2. fs.readFile('./2021-11-11.log', { encoding: 'utf-8' }) 
  3.   .then(text => console.log(text))  
  4.  .catch(error => console.error(error)) 

除了將 Error First 風(fēng)格的 API 轉(zhuǎn)為 Promise API,util 中還提供 callbackify 方法,用于將 async 函數(shù)轉(zhuǎn)換為 Error First 風(fēng)格的函數(shù)。

下面通過 callbackify 將 promise 化的 fs 還原為 Error First 風(fēng)格的函數(shù)。

  1. const fs = require('fs/promises'
  2. const util = require('util'
  3.  
  4. const readFile = util.callbackify(fs.readFile) 
  5. readFile('./2021-11-12.log', { encoding: 'utf-8' }, (error, text) => { 
  6.   if (error) { 
  7.     console.error(error) 
  8.     return 
  9.   } 
  10.   console.log(text) 
  11. }) 

調(diào)試與輸出

如果有開發(fā)過 Node 服務(wù),應(yīng)該都用過 debug 模塊,通過該模塊可以在控制臺看到更加明晰的調(diào)試信息。

  1. const debug = require('debug'
  2. const log = debug('app'
  3.  
  4. const user = { name'shenfq' } 
  5.  
  6. log('當(dāng)前用戶: %o'user

其實,通過 util.debug 也能實現(xiàn)類似的效果:

  1. const debug = require('debug'
  2. const log = debug('app'
  3.  
  4. const user = { name'shenfq' } 
  5.  
  6. log('當(dāng)前用戶: %o'user

只是在啟動時,需要將 DEBUG 環(huán)境變量替換為 NODE_DEBUG。

如果你有認(rèn)真看上面的代碼,應(yīng)該會發(fā)現(xiàn),在 log('當(dāng)前用戶: %o', user) 方法前面的字符串中,有一個 %o 占位符,表示這個地方將會填充一個對象(object)。這與 C 語言或 python 中的,printf 類似。同樣,在 util 模塊中,直接提供了格式化的方法:util.format。

  1. const { format } = require('util'
  2.  
  3. console.log( 
  4.   format('當(dāng)前用戶: %o', { 
  5.     name'shenfq', age: 25 
  6.   }) 

除了 %o 占位符,不同的數(shù)據(jù)類型應(yīng)使用不同的占位符。

JavaScript 中的對象是一個很復(fù)雜的東西,除了直接使用 util.format 外加 %o 占位符的方式格式化對象,util 中還提供了一個叫做 inspect 方法來進(jìn)行對象格式化。

  1. const { inspect } = require('util'
  2.  
  3. const user = { 
  4.   age: 25, 
  5.   name'shenfq'
  6.   work: { 
  7.     name'coding'
  8.     seniority: 5 
  9.   } 
  10.  
  11. console.log(inspect(user)) 

這么看 inspect 好像什么都沒做,但是 inspect 方法還有第二個參數(shù),用來進(jìn)行格式化時的一些個性化配置。

  • depth: number:控制顯示層級;
  • sorted: boolean|Function: 是否按照key的編碼值進(jìn)行排序;
  • compact: boolean:是否進(jìn)行單行顯示;

當(dāng)然上面只是一部分配置,更詳細(xì)的配置可查閱 node 文檔,下面我們寫幾個案例:

所有的屬性都換行顯示:

  1. inspect(user, { 
  2.  compact: false 
  3. }) 

只格式化對象第一層的值:

  1. inspect(user, { 
  2.   depth: 0, 
  3.  compact: false 
  4. }) 

按照key值的編碼倒序輸出:

  1. inspect(user, { 
  2.  compact: false
  3.   sorted: (a, b) => a < b ? 1 : -1 
  4. }) 

 

 

責(zé)任編輯:姜華 來源: 自然醒的筆記本
相關(guān)推薦

2018-12-12 15:05:13

2021-12-29 11:38:59

JS前端沙箱

2020-07-28 08:26:34

WebSocket瀏覽器

2020-06-12 09:20:33

前端Blob字符串

2024-02-05 11:55:41

Next.js開發(fā)URL

2020-07-03 14:30:34

Node內(nèi)存前端

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享機(jī)制操作系統(tǒng)

2021-02-01 23:23:39

FiddlerCharlesWeb

2011-09-15 17:10:41

2011-12-09 11:16:48

Node.js

2010-08-23 09:56:09

Java性能監(jiān)控

2025-08-13 06:06:39

Node.jsAPMWorker

2020-12-14 07:51:16

JS 技巧虛值

2022-11-04 08:19:18

gRPC框架項目

2020-09-15 08:35:57

TypeScript JavaScript類型

2024-04-26 09:03:31

Node.jsCurrent發(fā)布版

2010-07-12 10:03:50

ibmdwjava

2021-10-17 13:10:56

函數(shù)TypeScript泛型

2021-12-22 09:08:39

JSON.stringJavaScript字符串
點贊
收藏

51CTO技術(shù)棧公眾號

日本欧美不卡| 久久青草免费| av毛片久久久久**hd| 精品三级国产| 色婷婷国产精品| 国产精品天天av精麻传媒| 午夜片欧美伦| 91高清视频免费| 日韩av免费在线看| 欧美精品一区在线观看| 99在线免费观看| 国产麻豆视频精品| 国产精品视频入口| 最新国产一区| 日韩视频第一页| www.在线视频| 麻豆精品在线视频| 国产精品免费福利| 综合伊人久久| 中文字幕亚洲专区| 国产欧洲在线| 欧美日韩dvd在线观看| av三级在线播放| 国产精品美女久久久久aⅴ| 超碰成人免费在线| 久久国产夜色精品鲁鲁99| 久久免费99精品久久久久久| 欧美成年人视频网站| 亚洲综合在线电影| 一区二区三区在线免费视频| 日韩美女中文字幕| 黑人巨大精品| 亚洲欧洲日产国产网站| 成人一级视频| 欧美国产日产韩国视频| 亚洲精品视频一区二区三区| 可以在线观看的av| 国产情侣一区| 色综合影院在线| 夜夜躁日日躁狠狠久久88av| 日本一区二区在线| 91亚洲国产高清| 日韩电视剧免费观看网站| 老司机很黄的视频免费| 亚洲激情欧美激情| 91xxx在线观看| 日本免费一区二区三区等视频| 日韩小视频网站| 欧美日韩成人网| 欧美日本一道| 亚洲精品国产精品乱码不99 | 亚洲污视频在线观看| 在线天堂av| 亚洲人成在线播放网站岛国 | 午夜日本精品| 国产在线一区二区三区播放| 在线国产一区二区| 女同一区二区| 久草在线在线精品观看| 欧美狂野激情性xxxx在线观| 91蜜桃免费观看视频| 欧美成人福利在线观看| 亚洲在线免费视频| 在线视频亚洲欧美中文| 青青在线免费观看视频| 欧美专区在线播放| www.精品| 久久综合伊人| 久久久久久网站| 免费视频成人| 国产视频久久久久| 日韩色淫视频| 91久久精品www人人做人人爽| 国产精品qvod| 特级西西444| 欧美午夜电影网| 久久精品国语| 成人性片免费| 黄色漫画在线免费观看| 新片速递亚洲合集欧美合集| 久久久不卡影院| 国产区精品视频在线观看豆花| 我的公把我弄高潮了视频| 欧美一级日韩不卡播放免费| 青青久久av| 奇米视频888战线精品播放| 亚洲乱码国产乱码精品精98午夜| 345成人影院| 国产成人免费观看| 国产精品久久久久久福利一牛影视| 国精一区二区三区| 成人免费观看www在线| 国产欧美日韩在线播放| 丝袜美腿亚洲一区二区| 精品一区二区三区影院在线午夜| 91成人在线| 999在线免费视频| 天天色综合4| 九九免费精品视频在线观看| 91精品免费视频| 狠狠色丁香婷综合久久| 国产女人水真多18毛片18精品| 久久成人免费网站| 99reav2| 欧美精品九九99久久| 国产一区二区视频在线看| 亚洲bt天天射| www.日本不卡| 在线免费看黄| 69av在线播放| 国产精品 日产精品 欧美精品| 一个人看的www一区| zzijzzij亚洲日本成熟少妇| 影音先锋久久久| 亚洲36d大奶网| 国产视频综合在线| 亚洲色图网站| 国内外成人免费在线视频| 欧美va日韩va| 99久久久久| 亚洲 中文字幕 日韩 无码| 日韩欧美一区二区免费| 国产一区二区三区网| 免费在线观看视频a| 3d成人h动漫网站入口| 精品免费一区二区| 青青艹视频在线| 亚洲第一级黄色片| 欧美视频网站| 永久www成人看片| 一区二区三区加勒比av| 欧美a级在线观看| 91久久久亚洲精品| 久久久噜噜噜久噜久久综合| 污视频网站免费在线观看| 国产精品一区=区| 国产欧美一区二区精品性色超碰| 福利小视频在线| 亚洲自拍偷拍区| 亚洲午夜精品在线| 成人在线tv视频| 日本三级免费网站| 国产拍欧美日韩视频二区| 波多野一区二区| 国产欧美精品一区二区三区| 亚洲男同性恋视频| 精品中文字幕一区二区三区四区| 中文字幕欧美人与畜| 欧美一区二区三区四区在线观看| 91综合在线| 导航福利在线| 国产不卡av在线免费观看| 久久久99免费| 成人免费91| 国产男女无遮挡| 久久精品一偷一偷国产| 丁香六月综合激情| 视频一区在线免费看| 欧美亚洲色图视频| 中文字幕久久久| av电影一区二区| 国产精品xnxxcom| 国产精品宾馆在线精品酒店| 日韩在线视频二区| 久久久久99精品国产片| 成人盗摄视频| 快色在线观看| 成人淫片在线看| 欧美三级乱人伦电影| 国产欧美短视频| gogo在线高清视频| 日韩欧美视频第二区| 亚洲精品福利在线观看| 国产麻豆视频一区| 懂色av色香蕉一区二区蜜桃| 国产wwwxx| 国产精品一区久久| 欧美日本免费一区二区三区| 日本中文在线一区| 日韩欧美精品一区二区综合视频| 奇米精品一区二区三区| 高清欧美性猛交| 亚洲国产欧美在线| 国产欧美一级| 播放一区二区| 99爱免费视频| 国产乱肥老妇国产一区二 | 爽爽淫人综合网网站| 免费av不卡在线观看| 中文字幕色呦呦| 欧美日韩国产第一页| 亚洲一区二区三区爽爽爽爽爽| 欧美/亚洲一区| 国产理论在线| 在线黄色免费观看| 成人在线视频电影| 亚洲性视频网站| 亚洲国产美女搞黄色| 日韩高清不卡一区二区| 国产精品视频一区视频二区|