05nodejs 全局對象 常用工具

01、JavaScript 中有一個特殊的對象,稱為全局對象(Global Object),它及其所有屬性都可以在程序的任何地方訪問,即全局變量。
在瀏覽器 JavaScript 中,通常 window 是全局對象, 而 Node.js 中的全局對象是 global,所有全局變量(除了 global 本身以外)都是 global 對象的屬性。
在 Node.js 我們可以直接訪問到 global 的屬性,而不需要在應用中包含它。
02、全局對象與全局變量
global 最根本的作用是作為全局變量的宿主。按照 ECMAScript 的定義,滿足以下條 件的變量是全局變量:
在最外層定義的變量;
全局對象的屬性;
隱式定義的變量(未定義直接賦值的變量)。
當你定義一個全局變量時,這個變量同時也會成為全局對象的屬性,反之亦然。需要注 意的是,在 Node.js 中你不可能在最外層定義變量,因為所有用戶代碼都是屬于當前模塊的, 而模塊本身不是最外層上下文。
注意: 永遠使用 var 定義變量以避免引入全局變量,因為全局變量會污染 命名空間,提高代碼的耦合風險
03、__filename
__filename 表示當前正在執行的腳本的文件名。它將輸出文件所在位置的絕對路徑,且和命令行參數所指定的文件名不一定相同。 如果在模塊中,返回的值是模塊文件的路徑。
實例
創建文件 main.js ,代碼如下所示:

// 輸出全局變量 __filename 的值
console.log( __filename );

執行 main.js 文件,代碼如下所示:

$ node main.js
/web/com/runoob/nodejs/main.js

04、__dirname
__dirname 表示當前執行腳本所在的目錄。
實例
創建文件 main.js ,代碼如下所示:

// 輸出全局變量 __dirname 的值
console.log( __dirname );

執行 main.js 文件,代碼如下所示:

$ node main.js
/web/com/runoob/nodejs

05、setTimeout(cb, ms)
setTimeout(cb, ms) 全局函數在指定的毫秒(ms)數后執行指定函數(cb)。:setTimeout() 只執行一次指定函數。
返回一個代表定時器的句柄值。
實例
創建文件 main.js ,代碼如下所示:

function printHello(){
   console.log( "Hello, World!");
}
// 兩秒后執行以上函數
setTimeout(printHello, 2000);

執行 main.js 文件,代碼如下所示:

$ node main.js
Hello, World!

06、clearTimeout(t)
clearTimeout( t ) 全局函數用于停止一個之前通過 setTimeout() 創建的定時器。 參數 t 是通過 setTimeout() 函數創建的定時器。
實例
創建文件 main.js ,代碼如下所示:

function printHello(){
   console.log( "Hello, World!");
}
// 兩秒后執行以上函數
var t = setTimeout(printHello, 2000);

// 清除定時器
clearTimeout(t);

執行 main.js 文件,代碼如下所示:

$ node main.js

07、setInterval(cb, ms)
setInterval(cb, ms) 全局函數在指定的毫秒(ms)數后執行指定函數(cb)。
返回一個代表定時器的句柄值。可以使用 clearInterval(t) 函數來清除定時器。
setInterval() 方法會不停地調用函數,直到 clearInterval() 被調用或窗口被關閉。

function printHello(){
   console.log( "Hello, World!");
}
// 兩秒后執行以上函數
setInterval(printHello, 2000);

08、console
console 用于提供控制臺標準輸出,它是由 Internet Explorer 的 JScript 引擎提供的調試工具,后來逐漸成為瀏覽器的事實標準。
Node.js 沿用了這個標準,提供與習慣行為一致的 console 對象,用于向標準輸出流(stdout)或標準錯誤流(stderr)輸出字符。
console 方法
以下為 console 對象的方法:

序號  方法 & 描述
1   console.log([data][, ...])
向標準輸出流打印字符并以換行符結束。該方法接收若干 個參數,如果只有一個參數,則輸出這個參數的字符串形式。如果有多個參數,則 以類似于C 語言 printf() 命令的格式輸出。
2   console.info([data][, ...])
該命令的作用是返回信息性消息,這個命令與console.log差別并不大,除了在chrome中只會輸出文字外,其余的會顯示一個藍色的驚嘆號。
3   console.error([data][, ...])
輸出錯誤消息的。控制臺在出現錯誤時會顯示是紅色的叉子。
4   console.warn([data][, ...])
輸出警告消息。控制臺出現有黃色的驚嘆號。
5   console.dir(obj[, options])
用來對一個對象進行檢查(inspect),并以易于閱讀和打印的格式顯示。
6   console.time(label)
輸出時間,表示計時開始。
7   console.timeEnd(label)
結束時間,表示計時結束。
8   console.trace(message[, ...])
當前執行的代碼在堆棧中的調用路徑,這個測試函數運行很有幫助,只要給想測試的函數里面加入 console.trace 就行了。
9   console.assert(value[, message][, ...])
用于判斷某個表達式或變量是否為真,接收兩個參數,第一個參數是表達式,第二個參數是字符串。只有當第一個參數為false,才會輸出第二個參數,否則不會有任何結果。

console.log():向標準輸出流打印字符并以換行符結束。
console.log 接收若干 個參數,如果只有一個參數,則輸出這個參數的字符串形式。如果有多個參數,則 以類似于C 語言 printf() 命令的格式輸出。
例子

console.info("程序開始執行:");

var counter = 10;
console.log("計數: %d", counter);

console.time("獲取數據");
//
// 執行一些代碼
// 
console.timeEnd('獲取數據');

console.info("程序執行完畢。")

執行 main.js 文件,代碼如下所示:

$ node main.js
程序開始執行:
計數: 10
獲取數據: 0ms
程序執行完畢

09、process
process 是一個全局變量,即 global 對象的屬性。
它用于描述當前Node.js 進程狀態的對象,提供了一個與操作系統的簡單接口。通常在你寫本地命令行程序的時候,少不了要 和它打交道。下面將會介紹 process 對象的一些最常用的成員方法。

序號  事件 & 描述
1   exit
當進程準備退出時觸發。
2   beforeExit
當 node 清空事件循環,并且沒有其他安排時觸發這個事件。通常來說,當沒有進程安排時 node 退出,但是 'beforeExit' 的監聽器可以異步調用,這樣 node 就會繼續執行。
3   uncaughtException
當一個異常冒泡回到事件循環,觸發這個事件。如果給異常添加了監視器,默認的操作(打印堆棧跟蹤信息并退出)就不會發生。
4   Signal 事件
當進程接收到信號時就觸發。信號列表詳見標準的 POSIX 信號名,如 SIGINT、SIGUSR1 等。

實例
創建文件 main.js ,代碼如下所示:

process.on('exit', function(code) {

  // 以下代碼永遠不會執行
  setTimeout(function() {
    console.log("該代碼不會執行");
  }, 0);
  
  console.log('退出碼為:', code);
});
console.log("程序執行結束");

執行main,js

$ node main.js
程序執行結束
退出碼為: 0

10、退出狀態碼


狀態碼 名稱 & 描述
1   Uncaught Fatal Exception
有未捕獲異常,并且沒有被域或 uncaughtException 處理函數處理。
2   Unused
保留
3   Internal JavaScript Parse Error
JavaScript的源碼啟動 Node 進程時引起解析錯誤。非常罕見,僅會在開發 Node 時才會有。
4   Internal JavaScript Evaluation Failure
JavaScript 的源碼啟動 Node 進程,評估時返回函數失敗。非常罕見,僅會在開發 Node 時才會有。
5   Fatal Error
V8 里致命的不可恢復的錯誤。通常會打印到 stderr ,內容為: FATAL ERROR
6   Non-function Internal Exception Handler
未捕獲異常,內部異常處理函數不知為何設置為on-function,并且不能被調用。
7   Internal Exception Handler Run-Time Failure
未捕獲的異常, 并且異常處理函數處理時自己拋出了異常。例如,如果 process.on('uncaughtException') 或 domain.on('error') 拋出了異常。
8   Unused
保留
9   Invalid Argument
可能是給了未知的參數,或者給的參數沒有值。
10  Internal JavaScript Run-Time Failure
JavaScript的源碼啟動 Node 進程時拋出錯誤,非常罕見,僅會在開發 Node 時才會有。
12  Invalid Debug Argument 
設置了參數--debug 和/或 --debug-brk,但是選擇了錯誤端口。
128 Signal Exits
如果 Node 接收到致命信號,比如SIGKILL 或 SIGHUP,那么退出代碼就是128 加信號代碼。這是標準的 Unix 做法,退出信號代碼放在高位

11、Process 屬性

序號. 屬性 & 描述
1   stdout
標準輸出流。
2   stderr
標準錯誤流。
3   stdin
標準輸入流。
4   argv
argv 屬性返回一個數組,由命令行執行腳本時的各個參數組成。它的第一個成員總是node,第二個成員是腳本文件名,其余成員是腳本文件的參數。
5   execPath
返回執行當前腳本的 Node 二進制文件的絕對路徑。
6   execArgv
返回一個數組,成員是命令行下執行腳本時,在Node可執行文件與腳本文件之間的命令行參數。
7   env
返回一個對象,成員為當前 shell 的環境變量
8   exitCode
進程退出時的代碼,如果進程優通過 process.exit() 退出,不需要指定退出碼。
9   version
Node 的版本,比如v0.10.18。
10  versions
一個屬性,包含了 node 的版本和依賴.
11  config
一個包含用來編譯當前 node 執行文件的 javascript 配置選項的對象。它與運行 ./configure 腳本生成的 "config.gypi" 文件相同。
12  pid
當前進程的進程號。
13  title
進程名,默認值為"node",可以自定義該值。
14  arch
當前 CPU 的架構:'arm'、'ia32' 或者 'x64'。
15  platform
運行程序所在的平臺系統 'darwin', 'freebsd', 'linux', 'sunos' 或 'win32'
16  mainModule
require.main 的備選方法。不同點,如果主模塊在運行時改變,require.main可能會繼續返回老的模塊。可以認為,這兩者引用了同一個模塊。

12、方法參考手冊
Process 提供了很多有用的方法,便于我們更好的控制系統的交互:

序號  方法 & 描述
1   abort()
這將導致 node 觸發 abort 事件。會讓 node 退出并生成一個核心文件。
2   chdir(directory)
改變當前工作進程的目錄,如果操作失敗拋出異常。
3   cwd()
返回當前進程的工作目錄
4   exit([code])
使用指定的 code 結束進程。如果忽略,將會使用 code 0。
5   getgid()
獲取進程的群組標識(參見 getgid(2))。獲取到得時群組的數字 id,而不是名字。
注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。
6   setgid(id)
設置進程的群組標識(參見 setgid(2))。可以接收數字 ID 或者群組名。如果指定了群組名,會阻塞等待解析為數字 ID 。
注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。
7   getuid()
獲取進程的用戶標識(參見 getuid(2))。這是數字的用戶 id,不是用戶名。
注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。
8   setuid(id)
設置進程的用戶標識(參見setuid(2))。接收數字 ID或字符串名字。果指定了群組名,會阻塞等待解析為數字 ID 。
注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。
9   getgroups()
返回進程的群組 iD 數組。POSIX 系統沒有保證一定有,但是 node.js 保證有。
注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。
10  setgroups(groups)
設置進程的群組 ID。這是授權操作,所有你需要有 root 權限,或者有 CAP_SETGID 能力。
注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。
11  initgroups(user, extra_group)
讀取 /etc/group ,并初始化群組訪問列表,使用成員所在的所有群組。這是授權操作,所有你需要有 root 權限,或者有 CAP_SETGID 能力。
注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。
12  kill(pid[, signal])
發送信號給進程. pid 是進程id,并且 signal 是發送的信號的字符串描述。信號名是字符串,比如 'SIGINT' 或 'SIGHUP'。如果忽略,信號會是 'SIGTERM'。
13  memoryUsage()
返回一個對象,描述了 Node 進程所用的內存狀況,單位為字節。
14  nextTick(callback)
一旦當前事件循環結束,調用回到函數。
15  umask([mask])
設置或讀取進程文件的掩碼。子進程從父進程繼承掩碼。如果mask 參數有效,返回舊的掩碼。否則,返回當前掩碼。
16  uptime()
返回 Node 已經運行的秒數。
17  hrtime()
返回當前進程的高分辨時間,形式為 [seconds, nanoseconds]數組。它是相對于過去的任意事件。該值與日期無關,因此不受時鐘漂移的影響。主要用途是可以通過精確的時間間隔,來衡量程序的性能。
你可以將之前的結果傳遞給當前的 process.hrtime() ,會返回兩者間的時間差,用來基準和測量時間間隔。

實例
創建文件 main.js ,代碼如下所示:

// 輸出當前目錄
console.log('當前目錄: ' + process.cwd());

// 輸出當前版本
console.log('當前版本: ' + process.version);

// 輸出內存使用情況
console.log(process.memoryUsage());

結果:

$ node main.js
當前目錄: /web/com/runoob/nodejs
當前版本: v0.10.36
{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 }

---------------------------------------------------------常用工具---------------------------------------------------------
util 是一個Node.js 核心模塊,提供常用函數的集合,用于彌補核心JavaScript 的功能 過于精簡的不足。
01、util.inherits
util.inherits(constructor, superConstructor)是一個實現對象間原型繼承 的函數。
JavaScript 的面向對象特性是基于原型的,與常見的基于類的不同。JavaScript 沒有 提供對象繼承的語言級別特性,而是通過原型復制來實現的。
在這里我們只介紹util.inherits 的用法,示例如下:

var util = require('util'); 
function Base() { 
    this.name = 'base'; 
    this.base = 1991; 
    this.sayHello = function() { 
    console.log('Hello ' + this.name); 
    }; 
} 
Base.prototype.showName = function() { 
    console.log(this.name);
}; 
function Sub() { 
    this.name = 'sub'; 
} 
util.inherits(Sub, Base); 
var objBase = new Base(); 
objBase.showName(); 
objBase.sayHello(); 
console.log(objBase); 
var objSub = new Sub(); 
objSub.showName(); 
//objSub.sayHello(); 
console.log(objSub); 

我們定義了一個基礎對象Base 和一個繼承自Base 的Sub,Base 有三個在構造函數 內定義的屬性和一個原型中定義的函數,通過util.inherits 實現繼承。運行結果如下:

base 
Hello base 
{ name: 'base', base: 1991, sayHello: [Function] } 
sub 
{ name: 'sub' }

注意:Sub 僅僅繼承了Base 在原型中定義的函數,而構造函數內部創造的 base 屬 性和 sayHello 函數都沒有被 Sub 繼承。
同時,在原型中定義的屬性不會被console.log 作 為對象的屬性輸出。如果我們去掉 objSub.sayHello(); 這行的注釋,將會看到:

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
TypeError: Object #<Sub> has no method 'sayHello' 
at Object.<anonymous> (/home/byvoid/utilinherits.js:29:8) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40) 

02、util.inspect
util.inspect(object,[showHidden],[depth],[colors])是一個將任意對象轉換 為字符串的方法,通常用于調試和錯誤輸出。它至少接受一個參數 object,即要轉換的對象。
showHidden 是一個可選參數,如果值為 true,將會輸出更多隱藏信息。
depth 表示最大遞歸的層數,如果對象很復雜,你可以指定層數以控制輸出信息的多 少。如果不指定depth,默認會遞歸2層,指定為 null 表示將不限遞歸層數完整遍歷對象。 如果color 值為 true,輸出格式將會以ANSI 顏色編碼,通常用于在終端顯示更漂亮 的效果。
特別要指出的是,util.inspect 并不會簡單地直接把對象轉換為字符串,即使該對 象定義了toString 方法也不會調用。

var util = require('util'); 
function Person() { 
    this.name = 'byvoid'; 
    this.toString = function() { 
    return this.name; 
    }; 
} 
var obj = new Person(); 
console.log(util.inspect(obj)); 
console.log(util.inspect(obj, true)); 

結果:

Person { name: 'byvoid', toString: [Function] }
Person {
  name: 'byvoid',
  toString: 
   { [Function]
     [length]: 0,
     [name]: '',
     [arguments]: null,
     [caller]: null,
     [prototype]: { [constructor]: [Circular] } } }

03、util.isArray(object)
如果給定的參數 "object" 是一個數組返回true,否則返回false。

var util = require('util');

util.isArray([])
  // true
util.isArray(new Array)
  // true
util.isArray({})
  // false

04、util.isRegExp(object)
如果給定的參數 "object" 是一個正則表達式返回true,否則返回false。

var util = require('util');

util.isRegExp(/some regexp/)
  // true
util.isRegExp(new RegExp('another regexp'))
  // true
util.isRegExp({})
  // false

05、util.isDate(object)
如果給定的參數 "object" 是一個日期返回true,否則返回false。

var util = require('util');

util.isDate(new Date())
  // true
util.isDate(Date())
  // false (without 'new' returns a String)
util.isDate({})
  // false

06、util.isError(object)
如果給定的參數 "object" 是一個錯誤對象返回true,否則返回false。

var util = require('util');

util.isError(new Error())
  // true
util.isError(new TypeError())
  // true
util.isError({ name: 'Error', message: 'an error occurred' })
  // false
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 一:java概述:1,JDK:Java Development Kit,java的開發和運行環境,java的開發工...
    ZaneInTheSun閱讀 2,690評論 0 11
  • 要怎么努力才可以過上你想要的生活? 文|獨妹子 你說你想嫁給愛情,你知道你想要的愛情是什么模樣嗎? 說你想要詩和遠...
    凝霜記憶閱讀 304評論 0 2
  • 不錯
    柜子1234閱讀 137評論 0 0