精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你不知道的 Node.js util

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

[[435192]]

從類型判斷說起

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

舉幾個簡單的🌰:

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

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

  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() 方法進行代理,可以得到一個類型字符串,我們就可以在這個字符串上面搞事情。

  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 中,內部其實是有一組用來判斷變量類型的 api 的。而且功能異常豐富,除了基礎類型的判斷,還支持判斷 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 

嚴格相等

在 JavaScript 中,對象、數組等變量在判斷相等的過程中,如果用 === 通常只會判斷這兩個變量是否指向同一內存地址。如果想判斷對象的鍵對應的所有值是否相等,需要對兩個對象進行遍歷。在 util 中,也提供了一個方法可以用來判斷兩個對象是否嚴格相等: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 

該方法同樣可以用來判斷數組,是否嚴格相等:

  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 風格的,也就是所有的異步函數都會接受一個回調函數,該回調的一個參數為 error 對象,如果正常返回 error 對象為 null,后面的參數為成功響應的結果。

  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.   // 讀取文件成功,打印結果 
  10.   console.log(data) 
  11. }) 

在 Node 8 發布的時候,新增了一個 promisify 接口,用于將 Error First 風格的 API 轉為 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 發布的時候,原生模塊都新增了一個 .promises 屬性,該屬性下的所有 API 都 Promise 風格的。

  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 風格的 API 轉為 Promise API,util 中還提供 callbackify 方法,用于將 async 函數轉換為 Error First 風格的函數。

下面通過 callbackify 將 promise 化的 fs 還原為 Error First 風格的函數。

  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. }) 

調試與輸出

如果有開發過 Node 服務,應該都用過 debug 模塊,通過該模塊可以在控制臺看到更加明晰的調試信息。

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

其實,通過 util.debug 也能實現類似的效果:

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

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

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

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

除了 %o 占位符,不同的數據類型應使用不同的占位符。

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

  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 方法還有第二個參數,用來進行格式化時的一些個性化配置。

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

當然上面只是一部分配置,更詳細的配置可查閱 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. }) 

 

 

責任編輯:姜華 來源: 自然醒的筆記本
相關推薦

2018-12-12 15:05:13

2021-12-29 11:38:59

JS前端沙箱

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2024-02-05 11:55:41

Next.js開發URL

2020-07-03 14:30:34

Node內存前端

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享機制操作系統

2021-02-01 23:23:39

FiddlerCharlesWeb

2011-09-15 17:10:41

2010-08-23 09:56:09

Java性能監控

2011-12-09 11:16:48

Node.js

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類型

2021-10-17 13:10:56

函數TypeScript泛型

2015-06-19 13:54:49

2020-08-11 11:20:49

Linux命令使用技巧

2021-12-22 09:08:39

JSON.stringJavaScript字符串
點贊
收藏

51CTO技術棧公眾號

亚洲一品av免费观看| 午夜精品久久久久久久| 国产欧美日韩专区发布| 国产老头老太做爰视频| 精品999日本久久久影院| 亚洲无人区一区| 日韩激情视频| 亚洲av无码片一区二区三区| 另类av一区二区| 久久九九免费视频| 天天插天天射天天干| 巨胸喷奶水www久久久| 亚洲一区二区三区小说| 日本一区二区三区精品视频| 国产麻豆免费视频| 午夜一级在线看亚洲| 久久综合久久美利坚合众国| 国产三级国产精品| 国产高清日韩| 欧美视频一区二区| 缅甸午夜性猛交xxxx| 国产日产一区二区| 久久综合丝袜日本网| 成人性生交大片免费看小说| 无码人妻精品一区二区蜜桃色欲| 午夜精品视频一区二区三区在线看| 亚洲国产另类 国产精品国产免费| 中文字幕免费高清在线| 在线女人免费视频| 亚洲高清一区二区三区| 宅男一区二区三区| 福利成人在线观看| 91影院在线观看| 7777精品伊久久久大香线蕉语言 | 成a人片在线观看www视频| 成人午夜精品在线| 91中文字幕在线观看| 波多野结衣视频观看| 在线综合视频| 国外视频精品毛片| 九九视频免费看| 先锋资源久久| 久久久999精品| 中国1级黄色片| 欧洲乱码伦视频免费| 亚洲免费伊人电影在线观看av| 亚洲熟女一区二区三区| 韩国三级成人在线| 在线播放一区二区三区| 中文字幕av不卡在线| 巨胸喷奶水www久久久免费动漫| 日韩欧美在线观看视频| 精品欧美一区免费观看α√| 欧美寡妇性猛交xxx免费| 亚洲黄色免费电影| 白白操在线视频| 在线中文字幕第一页| 亚洲三级久久久| www.-级毛片线天内射视视| 久草资源在线观看| 亚洲免费在线视频一区 二区| 一本久久a久久精品vr综合| av在线第一页| 国产精品久久久久一区二区三区 | 欧美国产日韩在线观看成人 | 中文av一区二区| 亚洲乱码一区二区三区| 女女色综合影院| 亚洲欧洲国产日本综合| www.黄色网址.com| 手机av在线播放| 精品久久久精品| 国产免费毛卡片| 欧美日韩在线精品一区二区三区激情综合 | 亚洲人高潮女人毛茸茸| 国产sm调教视频| 欧美日韩一二| 久久亚洲精品成人| 国产精品9191| 久久青草久久| 成人春色激情网| 亚洲精品中文字幕成人片| 99久久国产综合精品女不卡| 美国av一区二区三区| 在线免费观看黄色网址| 亚洲靠逼com| 国自产拍偷拍精品啪啪一区二区| 成人va天堂| 欧美高清视频不卡网| 在线播放第一页| 免费黄色成人| 欧美成人免费全部| av资源免费观看| 激情亚洲综合在线| 国产在线精品日韩| av一本在线| 亚洲一二三四在线| 一区二区三区 欧美| 亚洲乱码一区| 亚洲日韩中文字幕| 极品颜值美女露脸啪啪| 久久尤物视频| dy888夜精品国产专区| 国产高清免费av在线| 亚洲精品国产第一综合99久久| 每日在线观看av| 欧洲亚洲精品| 亚洲国产精品久久精品怡红院| 国产成人一区二区在线观看| 国产精品vip| 国产美女精彩久久| 亚洲日本中文字幕在线| 亚洲人成网站精品片在线观看| 草草久久久无码国产专区| 亚洲欧美专区| 亚洲天堂成人在线| 日韩av综合在线| 亚洲欧洲综合网| 国自产拍在线网站网址视频| 中文字幕av资源一区| 欧美二区在线视频| 欧美黄视频在线观看| 伊人亚洲福利一区二区三区| 日韩av在线电影| 国产精一区二区三区| 污视频在线免费观看一区二区三区 | 欧美乱做爰xxxⅹ久久久| 欧美亚洲大片| 亚洲国产精品电影| 国产一级一片免费播放放a| 美国欧美日韩国产在线播放| 欧美大香线蕉线伊人久久国产精品 | 亚洲男人天堂av| 亚洲一区二区在线视频观看| blacked蜜桃精品一区| 欧美在线视频导航| 少妇av一区二区| 亚洲一区二区三区美女| 亚洲免费在线播放视频| 国产精品99一区二区三| 国产精品自拍小视频| 国产黄色在线播放| 在线视频亚洲一区| 人妻丰满熟妇aⅴ无码| 国产日韩1区| 国外成人免费视频| 国产在线精彩视频| 亚洲二区在线播放视频| 国产在线视频二区| 高清国产午夜精品久久久久久| 青青草原网站在线观看| 激情久久免费视频| 欧美激情第一页xxx| 成人久久精品人妻一区二区三区| 亚洲中国最大av网站| 亚洲丝袜在线观看| 欧美激情亚洲| 国产一区二区精品在线| 美女扒开腿让男人桶爽久久软| 亚洲成人久久网| 在线能看的av| 国产日产欧美一区| 久久国产这里只有精品| 9999国产精品| 99在线观看视频网站| 白白色在线观看| 亚洲美女视频网站| 中文字幕一级片| 亚洲免费在线看| 大乳护士喂奶hd| 久久亚洲综合| 最新不卡av| 凹凸av导航大全精品| 韩国精品美女www爽爽爽视频| 亚洲欧美日韩动漫| 在线视频国产一区| 91狠狠综合久久久| 成人亚洲一区二区一| 国产97在线 | 亚洲| 国产探花在线精品一区二区| 国产欧美一区二区三区在线| 青草视频在线免费直播 | 亚洲国产无码精品| 裸体在线国模精品偷拍| av久久久久久| 性欧美lx╳lx╳| 国产在线观看91精品一区| 日本无删减在线| 亚洲片av在线| 精品人妻少妇嫩草av无码专区| 精品久久久久久久久久ntr影视| 亚洲av无码国产精品麻豆天美| 韩国av一区二区| 日日摸日日碰夜夜爽av | 女人被男人躁得好爽免费视频 | 亚洲精品美女久久久| 日韩欧美一级大片| 亚洲高清久久久| 中文字幕黄色网址| 成人91在线观看| 在线观看免费不卡av| 亚洲最黄网站| 亚洲免费视频播放| 免费成人av| 国产乱码精品一区二区三区中文| 国产极品嫩模在线观看91精品| 欧美精品videos| 在线激情网站| 亚洲美腿欧美激情另类| www.国产免费| 欧美日韩大陆在线| √资源天堂中文在线| 亚洲综合激情另类小说区| 人妻无码一区二区三区免费| 久久综合狠狠综合久久激情 | 中文字幕一区二区三区四区久久 | 国产成人aa在线观看网站站| 国产精品自产拍在线观| 欧美一区国产| 992tv在线成人免费观看| 亚洲资源一区| 日韩一区二区三区xxxx| 极品美乳网红视频免费在线观看| 亚洲第一福利在线观看| av男人天堂网| 91麻豆精品国产自产在线观看一区| 日韩手机在线视频| 天天色综合天天| 永久免费看片在线播放| 亚洲精品免费播放| 91精品少妇一区二区三区蜜桃臀| 久久精品在这里| 三上悠亚ssⅰn939无码播放| av电影在线观看完整版一区二区| 久久久久久国产精品日本| 久久99国产精品尤物| 美女少妇一区二区| 蜜桃视频免费观看一区| 欧美午夜性生活| 久久综合伊人| 国产黄色特级片| 久久视频一区| 无遮挡又爽又刺激的视频| 一本色道精品久久一区二区三区| 国产免费黄色一级片| 在线 亚洲欧美在线综合一区| 老司机激情视频| 影音先锋亚洲电影| 人妻无码久久一区二区三区免费| 亚洲视频高清| 欧美一级视频免费看| 亚洲日本成人| 色欲av无码一区二区人妻| 亚洲欧美成人综合| 国产第一页视频| 蜜桃视频在线观看一区| 欧美大片久久久| 国产激情精品久久久第一区二区| ass极品水嫩小美女ass| 粉嫩aⅴ一区二区三区四区五区| 在线观看一区二区三区四区| 不卡的电视剧免费网站有什么| av免费观看不卡| 26uuu久久天堂性欧美| 国产精品久久久久无码av色戒| 久久久九九九九| 欧美视频一区二区在线| 亚洲人成7777| 日韩三级视频在线| 欧美在线一区二区三区| 91尤物国产福利在线观看| 欧美一区二区三区视频| 国产91免费看| 亚洲人成电影在线| 免费黄网站在线| 久久免费在线观看| 性欧美gay| 91色p视频在线| 国产乱论精品| 午夜精品一区二区在线观看的| 亚洲精品a级片| 玩弄中年熟妇正在播放| 蜜臂av日日欢夜夜爽一区| 亚洲精品乱码久久久久久9色| 99在线精品视频| 国产在视频线精品视频| 亚洲午夜三级在线| 老熟妇一区二区三区啪啪| 日韩手机在线导航| 国产在线视频网| 欧美肥老妇视频| 成人在线视频播放| 国产高清在线一区| 日本一本不卡| 九一国产精品视频| 精品一区二区久久久| 欧美xxxx×黑人性爽| 国产精品国产自产拍高清av王其| 久热这里只有精品在线| 欧美视频在线一区二区三区| 人妻妺妺窝人体色www聚色窝| 中文字幕最新精品| 国产免费拔擦拔擦8x高清在线人| 国产精品自拍小视频| 亚洲电影男人天堂| 女人色极品影院| 精品影院一区二区久久久| 国产激情在线免费观看| 亚洲精品久久7777| 亚洲视频在线观看一区二区| 日韩精品视频免费| 丝袜在线视频| 成人a免费视频| 精品一区av| 亚洲色欲综合一区二区三区| 国产精品一卡二| 女教师淫辱の教室蜜臀av软件| 福利一区福利二区微拍刺激| www.av导航| 久久久999成人| 亚洲高清国产拍精品26u| 日韩欧美亚洲日产国| 在线综合欧美| 制服丝袜第一页在线观看| 一区二区三区在线播放| 91激情在线观看| 最新的欧美黄色| 欧美日韩五码| 欧美日韩三区四区| 国产亚洲精品v| 老熟妇精品一区二区三区| 一区二区免费视频| va婷婷在线免费观看| 日韩一级裸体免费视频| 久久日本片精品aaaaa国产| 日韩免费三级| 日本成人超碰在线观看| 90岁老太婆乱淫| 色香蕉久久蜜桃| 福利视频在线播放| 国产精品视频资源| 日韩精品中文字幕第1页| 亚洲欧美激情网| 国产欧美日韩中文久久| 免费在线不卡av| 国产一区av在线| 国产一区二区三区四区五区3d| 亚洲免费视频一区| 久久国产三级精品| 黑鬼狂亚洲人videos| 91精品国产综合久久精品麻豆| 国产剧情在线| 丁香婷婷久久久综合精品国产| 欧美日韩亚洲国产精品| 国产51自产区| 婷婷一区二区三区| 黄色av免费在线观看| 国产精品高潮粉嫩av| 日韩欧美电影| 伊人免费视频二| 午夜日韩在线观看| 欧美一区二区少妇| 国产精品国产自产拍高清av水多| 日韩精品中文字幕第1页| 黄色a级三级三级三级| 亚洲一区二区三区爽爽爽爽爽| 天堂中文资源在线| 国产精品久久久久久久久久免费| 日韩欧美网站| 国产xxx在线观看| 欧美日韩国产在线| 成人精品一区二区三区免费| 91精品视频在线免费观看| 黄色亚洲大片免费在线观看| 成人免费看aa片| 欧美精品在线观看一区二区| 在线午夜影院| 女女同性女同一区二区三区91| 久久精品二区亚洲w码| 久久国产精品波多野结衣av| 日韩精品亚洲视频| 福利视频亚洲| 国产情侣第一页| 日本一区二区免费在线观看视频| 99国产精品一区二区三区| 国内精品小视频在线观看| 欧美日韩有码| 国产人妻精品午夜福利免费| 色综合天天综合色综合av| 国产视频一区二区| 欧美一区二区三区成人久久片| 国精品**一区二区三区在线蜜桃| 国产手机在线视频| 中文字幕在线亚洲| 欧美美女啪啪| 超碰在线免费av| 色天使色偷偷av一区二区| 成人av福利| 日本a级片久久久| 不卡一区二区在线|