初识 Node

一. 什么是 Node.js

Node.js是一个基于 V8 JavaScript 引擎的 JavaScript 运行时环境,并非是编程语言,只是一个 JS 的运行环境

二. Node 的执行、输入和输出

1. 执行

只需在当前需要执行的 js 文件目录下,打开控制台,执行下面语句即可

node xxx.js

2. 输入

有时我们在执行某个 js 文件时,想手动从外部输入参数,那么只需在执行文件命令跟上参数即可,参数与参数之间用空格隔开

node xxx.js agr1 arg2

然后,传递的参数我们怎么获取呢?

我们可以通过 process 全局对象获取,该对象含有 argv 属性,是一个数组,该数组默认有两个元素,第一个是 node 安装环境的绝对路径,第二个是当前执行的 js 文件所在绝对路径。
我们传递的参数就会被传入 argv 数组尾部,而 argv 数组的元素均为字符串,所传递的参数也是字符串。
看下面例子:

// index.js
console.log(process.argv);

执行:

node index.js ldh age=18

输出结果:

[
  'D:\\Node\\node.exe',
  'E:\\2021\\node学习笔记\\学习案例\\一\\index.js',
  'ldh'
]

process 全局对象是包含很多很多内容的,比如电脑的操作系统、node 的版本等等。至于 argv 命名的由来是在 c/c++ 语言中是一种数据结构,argument vector 的缩写,表示传入的具体参数。

3. 输出

js 文件如果有打印语句,那么结果是打印在控制台上的。

  • console.log

    最常用的输入内容的方式:console.log(xxx)

  • console.clear

    清空控制台:console.clear(),可以清除该语句前面所打印的所有内容。

  • console.trace

    打印函数的调用栈:console.trace

三. 全局对象

1. 特殊全局对象

在上面的全局对象中,有几个特殊的全局对象需要我们注意一下,之所以特殊,是因为这些全局对象实际上是模块中的变量,只是每个模块中都有,互相独立,所以看起来像是全局对象,并且虽然可以在模块中任意使用,但是在命令行交互(REPL)中是不可以使用的。

包括:__dirname、__filename、exports、module、require()

  • __dirname:获取当前文件所在的绝对路径:

    注意:不包括后面的文件名(如:C:\2021\node)

  • __filename:获取当前文件所在的路径 + 文件名称:

    注意:包括后面的文件名称(如:C:\2021\node\index.js)

  • exports: js 文件的模块导出

  • module:exports 的作用一样,但是 js 文件真正导出的是这个

  • require: js 文件的模块导入

2. 常用的全局对象

  • process对象:process提供了Node进程中相关的信息:比如Node的运行环境、参数信息等。

  • console对象:提供了简单的调试控制台

  • 定时器函数:在Node中使用定时器有好几种方式

    • setTimeout(callback, delay[, ...args]):callback 在 delay 毫秒后执行一次;

    • setInterval(callback, delay[, ...args]):callback 每 delay 毫秒重复执行一次;

    • setImmediate(callback[, ...args]):callback I/O 事件后的回调的“立即”执行;

      这里先不展开讨论它和 setTimeout(callback, 0) 之间的区别,因为它涉及到事件循环的阶段问题。

    • process.nextTick(callback[, ...args]):添加到下一次tick队列中,也是事件循环中的阶段问题。

  • 其它的常用对象后面会学到

3. global 全局对象

{
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  },
  queueMicrotask: [Function: queueMicrotask],       
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  }
}

这个仅仅是在模块中打印输出的 global 内容,如果在 REPL 上输入一下命令,就可以获取到 global 的所有内容了。

global. + tab健 + tab健

结果如下:

这些多出来的内容是被放入 global 全局对象的,目的是为了能获取另外一个新的全局对象,避免被当前模块干扰。

4. global和window的区别

在浏览器中,全局变量都是在window上的,比如有document、setInterval、setTimeout、alert、console等等。

在Node中,我们也有一个global属性,并且看起来它里面有很多其他对象,但是是被额外放入进去的,与 window 不同。

但是在浏览器中执行的JavaScript代码,如果我们在顶级范围内通过 var 定义的一个变量,默认会被添加到window对象上,但在 node 中,我们通过 var 定义一个变量,它只是在当前模块中有一个变量,不会放到 global 中。

原因是因为 node 中的每个 js 文件都是一个模块(一个对象),在该文件下用 var 定义的变量是被放入当前模块的,而浏览器没有默认模块的概念,所以就会把 var 定义的变量放入 window 顶级对象上了。

 posted on 2021-06-25 23:34  kly99  阅读(58)  评论(0)    收藏  举报