JS在线运行

版本:

所属目录
点击了解高性能代码运行API
运行结果
教程手册
代码仓库
极速运行
终端运行
图形+终端

                        
以下是用户最新保存的代码
最小矩阵宽度(从第一列开始一列列加,直到判断子矩阵内包含数组的所有元素) 发布于:2025-04-16 19:10 最小交付时间(二分+回溯:先将数组排序,最小值start=Math.max(arr),最大值end = arr.reduce,回溯中创建一个新的工人数组,每次遍历数组时将数组中的每一个元素都尝试分配给worker[i]) 发布于:2025-04-16 18:53 阿里巴巴找黄金宝箱Ⅳ(单调栈:栈中存储单调递减的元素的集合,当找到比栈顶元素大的元素时,循环出栈直到栈顶元素不小于当前元素) 发布于:2025-04-15 17:47 找出经过特定点的路径长度(dfs+回溯) 发布于:2025-04-14 16:32 计算最接近的数(1.输入处理;2.对数组进行深拷贝,然后对新数组进行排序,之后在进行后续操作) 发布于:2025-04-14 15:11 MELON的难题(01背包问题:先判断数组和是否为偶数,如果为偶数直接输出-1,target=sum/2 状态转移方程dp[i]=Math.min(dp[i],dp[i-1]+1) 发布于:2025-04-11 17:29 简易内存池(模拟,双指针) 发布于:2025-04-11 17:12 通过软盘拷贝文件 这是一个典型的 0-1 背包问题的变体: 问题描述: 有一个容量为 1.44MB(1474560字节)的软盘 每个块大小为 512 字节 需要在有限容量内存储最大的文件字节总和 关键点: 文件大小以字节为单位 存储空间以块为单位 即使文件不足一个块,也要占用整个块的空间 动态规划解析: 状态定义:dp[i] 表示使用 i 个块时能存储的最大字节数 状态转移:对每个文件,可以选择放入或不放入 约束条件:总块数不能超过软盘容量 时间复杂度:O(n maxSize),其中: n 是文件数量 maxSize 是软盘最大块数(约2880块) 发布于:2025-04-11 16:39 正整数到excel编号之间的转换(对num先进行取余操作,取余之后的值就是字母a往后的偏移量,letter=String.fromCharCode('a'.charCodeAt(0)+remain),将这个字母放到结果队首,然后对num进行整除,循环直到num为0) 发布于:2025-04-10 17:46 最少交换次数(滑动窗口:先算出整个数组内<k的个数,作为窗口大小,然后再算出0-window内>=k的个数,作为res的初始值,然后滑动窗口,当arr[left]>=k时,res--,当arr[right]>=k时,res++) 发布于:2025-04-10 17:40 TLV解析 Ⅱ(字符串操作) 发布于:2025-04-10 16:24 最少有多少个小朋友了(相同的数字的个数/(相同个数+1)*(相同个数+1)) 发布于:2025-04-10 15:11 硬件产品销售方案(回溯 backtrack(path,val,sum)=>) 发布于:2025-04-09 18:40 猴子爬山(动态规划:状态转义方程dp[i]=dp[i-1]+dp[i-3]) 发布于:2025-04-09 18:14 检测工具代码 发布于:2025-04-09 18:03 检查是否存在满足条件的数字组合)(双指针,然后多重判断) 发布于:2025-04-09 17:45 阿里巴巴找黄金宝箱III(遍历数组,用map储存arr[i]上一次出现的下标,如果当前下标位置i-map.get(i)<=k,直接输出left) 发布于:2025-04-09 17:07 阿里巴巴找黄金宝箱II(数组排序,每次都找最大的减) 发布于:2025-04-09 16:48 全量和已占用字符集(字符串操作) 发布于:2025-04-09 16:34 微服务的集成测试(dfs:当扫描到第i行的第i个元素为1时,就递归dfs,sum+=Math.max(max,dfs(j))) 发布于:2025-04-09 16:25 经典屏保问题(判断是否反向:右下角坐标值为(x+50,y+25),当右下角撞到下面或者右边的墙时,就将x轴/y轴的移动方向反向,左上角同理。) 发布于:2025-04-08 18:37 阿里巴巴找黄金宝箱(I)(左右数组的和,如果左右数组的和相等,就输出) 发布于:2025-04-08 16:57 告警抑制(Map) 发布于:2025-04-08 16:35 过滤组合字符串(全排列:回溯) 发布于:2025-04-03 18:56 分糖果(判断是否为偶数,如果为偶数,操作次数+1,n=n/2;如果为奇数,判断(n+1)/2是否为偶数,如果是偶数,n=n+1,res++,否则n=n-1,res++) 发布于:2025-04-03 18:24 查找接口成功率最优时间段(用前缀和求出[left,right]区间的和,然后求平均值,和输入值比较,如果<=平均值,就移动右指针,如果>平均值,说明当前位置有一个当前最大的区间,比较这个区间是否为最大,如果不是则继续,如果是最大,则更新res结果;如果和当前的i最大值一样,那就将两个都放入到res中。最后,如果left和right不相等,说明最后一个窗口没处理完成,需要单独处理) 发布于:2025-04-03 18:15 游戏分组(dfs // 深度优先搜索函数 // 参数说明: // idx: 当前考虑的数组索引 // level: 当前已选择的数字个数 // subSum: 当前已选择数字的和 // totalSum: 整个数组的总和) 发布于:2025-04-03 17:18 新学校选址(找到一个数组排序后的中位数,如果是基数就是这个数,如果是偶数就是这个数的前一个数) 发布于:2025-04-03 16:38 绘图机器(从(0,0)到第一个点时,是先走横坐标,再走纵坐标,所以第一个点的面积应该为0) 发布于:2025-04-02 19:14 素数之积(判断是否为素数的函数:function isPrime(n) { if (n < 2) return false; for (let i = 2; i <= Math.sqrt(n); i++) { if (n % i === 0) return false; } return true; } 发布于:2025-04-02 17:43 考勤信息(滑动窗口统计七天之内的考勤状况) 发布于:2025-04-02 17:27 打印机队列(简单的数组模拟) 发布于:2025-04-02 16:29 JS AES128加解密 发布于:2025-04-03 15:28 找出重复代码】(二维动态规划:定义二维数组dp,初始值设为0,循环两个字符串,如果str1[i]=str2[j],dp[i+1][j+1]==dp[i][j]+1;使用maxLength定义当前最大的公共子串长度,如果dp[i+1][j+1]>maxLength,记录maxLength和当前结束位置i+1。循环后,根据maxLength和结束位置p,确定silce的范围 发布于:2025-04-01 19:24 【二叉树中序遍历】(用栈将二叉树的结构处理出来。然后中序遍历) 发布于:2025-04-01 19:08 【最小调整顺序次数】(模拟队列操作:当插入操作为头操作时,如果数组不为空,就不是排序状态。尾插入不影响;当移除元素时,如果当前队列是有序的 ,就不需要操作,否则就需要操作,ans++) 发布于:2025-04-01 18:29 二元组个数】(用map存储第一个数组中出现的元素及个数,然后遍历第二个数组,如果遇到map中的元素,ans+=map.get()) 发布于:2025-04-01 18:02 【文件目录大小】(递归:先读取每个文件的信息,解析每行输入的三个部分:id,size,child并将处理过后的放入files中,files:{id,size,child}。然后递归计算目标目录的大小:自定义一个递归函数 getSize,将目标目录设为root节点,向下递归子文件夹,如果有子文件夹就递归计算所有子节点的大小并累加,最后返回结果) 发布于:2025-04-01 17:49 华为OD机试真题 Python 实现【水库蓄水问题】(变体接雨水问题,用双指针遍历数组,然后将子数组内的每一个数字能接到的雨水相加(如果当前位置数字 小于左右边界的最小值,能够接水),如果有多个位置接的雨水相同,保留right-left最小的) 发布于:2025-04-01 17:23 找出两个整数数组中同时出现的整数】(用map存储第一个数组中的元素,然后再循环第二个数组,当遇到map中有的数字时,记录下这个数字。再创建新的Map,按出现次数分组存储数字// 获取当前数字及其在第一个数组中的出现次数// 将数字添加到对应次数的组中,并保持组内数字有序;// 获取所有出现次数并按升序排序// 按格式输出结果) 发布于:2025-04-01 16:47 模拟消息队列(两个数组,一个用来存消息,一个用来存接受者,接受者的中包括订阅时间取消时间和能接收到的消息,正序循环message数组,在逆序循环接受者数组,每当有发送消息的时间在订阅和取关之间时,把这个消息放到消息队列中) 发布于:2025-04-01 16:22 【投篮大赛】(简单字符串操作) 发布于:2025-04-01 16:05 【数值同化】(广度优先搜索,搜索能够到达的所有格子,然后遍历矩阵找出无法到达的地区) 发布于:2025-04-01 15:29 数字加减游戏(数学问题:先判断目标-初始是否能被b整除,如果能直接输出0.如果不能就每次判断初始值+a*x或初始值-a*x是否能整除b,如果能,就时最优解) 发布于:2025-04-01 15:10 数组二叉树(// 遍历树中的所有节点,寻找最小的叶子节点 // 判断当前节点是否为叶子节点,需满足以下条件: // 1. 节点值不为 -1(不是空节点) // 2. 节点值小于当前找到的最小叶子值 // 3. 左子节点不存在(超出数组范围或为-1) // 4. 右子节点不存在(超出数组范围或为-1) // 更新最小叶子节点的索引和值,找到叶子节点后,根据叶子节点不断向上推导出父节点,直到找到根节点。对于索引i,其父节点索引为 floor((i-1)/2)) 发布于:2025-04-01 14:56 【招聘】计算至少需要的面试官数量( // 核心算法思路: // 1. 首先对所有面试时间区间按开始时间排序 // 2. 检查相邻区间是否存在时间重叠 // 3. 对于重叠的区间,需要额外的面试官 // 4. 最后根据重叠情况和每个面试官的面试次数限制(m)计算所需面试官总数) 发布于:2025-03-31 18:44 查找一个有向网络的头节点和尾节点(读取输入数据并解析 统计每个节点的入度和出度 使用Map存储节点的入度和出度 每处理一条边,同时更新起点和终点的度数 入度为0的节点是起点 出度为0的节点是终点 终点需要降序排序 检查是否存在起点和终点 收集所有起点和终点 对终点进行排序 输出结果) 发布于:2025-03-31 17:51 数字序列比大小(田忌赛马:首先对两个数组进行升序排序 对arrA中的每个元素: 在arrB中查找第一个大于等于它的元素 如果找到,使用该位置的前一个元素进行匹配(得1分) 如果找不到,使用arrB的最后一个元素(得-1分)) 发布于:2025-03-31 17:20 寻找最大价值的矿堆(BFS函数实现: 参数:起始位置(i,j) 功能: 计算从起始位置开始的连通区域的和 使用BFS遍历所有相邻的位置 将已访问的位置标记为0 返回连通区域的和 主要流程: 读取矩阵数据 遍历矩阵的每个位置 对未访问的位置进行BFS 更新最大连通区域的和 关键点: 使用0标记已访问的位置 只处理值大于0的位置 考虑四个方向的相邻位置 使用Math.max更新最大和) 发布于:2025-03-31 16:53 仿LISP运算(遍历输入字符串的每个字符,遇到右括号或空格时,处理已收集的字符 遇到右括号时,进行运算,收集非括号和空格的字符;运算时从栈中弹出两个操作数和一个运算符,根据运算符执行相应的运算,将运算结果压入栈中,处理除数为0的特殊情况) 发布于:2025-03-31 16:35 [更多]
显示目录

模块



学习嵌入式的绝佳套件,esp8266开源小电视成品,比自己去买开发板+屏幕还要便宜,省去了焊接不当搞坏的风险。 蜂鸣版+触控升级仅36元,更强的硬件、价格全网最低。

点击购买 固件广场

模块

稳定性: 5 - 锁定

本节介绍Node.js的模块系统。

Node.js有简单的模块加载系统。在Node.js模块系统中,每个文件都可以被当作单独的模块。下面例子里,foo.js对同一个文件夹里的circle.js模块进行加载。这是foo.js内容:

var circle = require('./circle.js');
console.log( 'The area of a circle of radius 4 is '
           + circle.area(4));

这是circle.js内容:

var PI = Math.PI;

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

circle.js模块输出了area()circumference()函数。想要给根模块添加函数和对象,你可以将他们添加到特定的exports对象。

加载到模块的变量是私有的,仿佛模块是包含在一个函数里。在这个例子里,PIcircle.js的私有变量。

如果你想模块里的根像一个函数一样的输出(比如,构造函数),或者你想输出一个完整对象,那就分派给module.exports,而不是exports

bar.js使用square模块,它输出了构造函数:

var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());

square定义在square.js文件里:

// assigning to exports will not modify module, must use module.exports
module.exports = function(width) {
  return {
    area: function() {
      return width * width;
    }
  };
}

模块系统在require("module")模块里实现。

Cycles

环形调用require(),当返回时模块可能都没执行结束。

考虑以下场景:

a.js:

console.log('a starting');
exports.done = false;
var b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');

b.js:

console.log('b starting');
exports.done = false;
var a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done');

main.js:

console.log('main starting');
var a = require('./a.js');
var b = require('./b.js');
console.log('in main, a.done=%j, b.done=%j', a.done, b.done);

main.js加载a.jsa.js加载b.js。此时,b.js试着加载a.js。为了阻止循环调用,a.js输出对象的不完全拷贝返回给b.js模块。b.js会结束加载,并且它的exports对象提供给a.js模块。

main.js加载完两个模块时,它们都会结束。这个程序的输出如下:

$ node main.js
main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done=true, b.done=true

如果你的程序有环形模块依赖,需要保证是线性的。

核心模块

Node有很多模块编译成二进制。这些模块在本文档的其他地方有更详细的描述。

核心模块定义在Node的源代码lib/目录里。

require()总是会优先加载核心模块。例如,require('http')总是返回编译好的HTTP模块,而不管这个文件的名字。

文件模块

如果按照文件名没有找到模块,那么Node会试着加载添加了.js.json后缀的文件,如果还没好到,再试着加载添加了后缀.node的文件。

.js会解析为JavaScript的文本文件,.json会解析为JSON文本文件,.node会解析为编译过的插件模块,由dlopen负责加载。

模块的前缀'/'表示绝对路径。例如require('/home/marco/foo.js')将会加载 /home/marco/foo.js文件。

模块的前缀'./'表示相对于调用require()的路径。就是说,circle.js必须和foo.js在同一个目录里,require('./circle')才能找到。

文件前没有/./前缀,表示模块可能是core module,或者已经从node_modules文件夹里加载过了。

如果指定的路径不存在,require()将会抛出一个code属性为'MODULE_NOT_FOUND'的异常。

node_modules目录里加载

如传递给require()的模块不是一个本地模块,并且不以'/','../''./'开头,那么Node会从当前模块的父目录开始,尝试在它的node_modules文件夹里加载模块。

如果没有找到,那么会到父目录,直到到文件系统的根目录里找。

例如,如果'/home/ry/projects/foo.js'里的文件加载require('bar.js'),那么Node将会按照下面的顺序查找:

  • /home/ry/projects/node_modules/bar.js
  • /home/ry/node_modules/bar.js
  • /home/node_modules/bar.js
  • /node_modules/bar.js

这样允许程序独立,不会产生冲突。

可以请求指定的文件或分布子目录里的模块,在模块名后添加路径后缀。例如,require('example-module/path/to/file')会解决path/to/file相对于example-module的加载位置。路径后缀使用相同语法。

文件夹作为模块

可以把程序和库放到独立的文件夹里,并提供单一的入口指向他们。有三种方法可以将文件夹作为参数传给require()

第一个方法是,在文件夹的根创建一个package.json文件,它指定了main模块。package.json的例子如下:

{ "name" : "some-library",
  "main" : "./lib/some-library.js" }

如果这是在./some-library里的文件夹,require('./some-library')将会试着加载./some-library/lib/some-library.js

如果文件夹里没有package.json文件,Node会试着加载index.jsindex.node文件。例如,如果上面的例子里没有package.json文件。那么 require('./some-library')将会试着加载:

  • ./some-library/index.js
  • ./some-library/index.node

缓存

模块第一次加载后会被被缓存。这就是说,每次调用require('foo')都会返回同一个对象,当然,必须每次都要解析到同一个文件。

多次调用require('foo')也许不会导致模块代码多次执行。这是很重要的特性,这样就可以返回"partially done"对象,允许加载过渡性的依赖关系,即使可能会引起环形调用。

如果你希望多次调用一个模块,那么就输出一个函数,然后调用这个函数。

模块换成预警

模块的缓存依赖于解析后的文件名。因此随着调用位置的不同,模块可能解析到不同的文件(例如,从node_modules文件夹加载)。如果解析为不同的文件,require('foo')可能会返回不同的对象。

module 对象

  • {Object}

在每个模块中,变量module是一个代表当前模块的对象的引用。为了方便,module.exports可以通过exports全局模块访问。module不是事实上的全局对象,而是每个模块内部的。

module.exports

  • {Object}

模块系统创建module.exports对象。很多人希望自己的模块是某个类的实例。因此,把将要导出的对象赋值给module.exports。注意,将想要的对象赋值给 exports,只是简单的将它绑定到本地exports变量,这可能并不是你想要的。

例如,假设我们有一个模块叫a.js

var EventEmitter = require('events').EventEmitter;

module.exports = new EventEmitter();

// Do some work, and after some time emit
// the 'ready' event from the module itself.
setTimeout(function() {
  module.exports.emit('ready');
}, 1000);

另一个文件可以写成如下的形式:

var a = require('./a');
a.on('ready', function() {
  console.log('module a is ready');
});

注意:赋给module.exports必须马上执行,并且不能在回调中执行。

x.js:

setTimeout(function() {
  module.exports = { a: "hello" };
}, 0);

y.js:

var x = require('./x');
console.log(x.a);

exports alias

exports变量在引用到module.exports的模块里可用。和其他变量一样,如果你给他赋一个新的值,它不再指向老的值。

为了展示这个特性,假设实现:require():

function require(...) {
  // ...
  function (module, exports) {
    // Your module code here
    exports = some_func;        // re-assigns exports, exports is no longer
                                // a shortcut, and nothing is exported.
    module.exports = some_func; // makes your module export 0
  } (module, module.exports);
  return module;
}

如果你对exportsmodule.exports间的关系感到迷糊,那就只用module.exports就好。

module.require(id)

  • id {String}
  • 返回: {Object} 已经解析模块的module.exports

module.require方法提供了一种像require()一样从最初的模块加载一个模块的方法。

为了能这样做,你必须获得module对象的引用。require()返回module.exports,并且module是一个典型的只能在特定模块作用域内有效的变量,如果要使用它,就必须明确的导出。

module.id

  • {String}

模块的标识符。通常是完全解析的文件名。

module.filename

  • {String}

模块完全解析的文件名。

module.loaded

  • {Boolean}

模块是已经加载完毕,还是在加载中。

module.parent

  • {Module Object}

引入这个模块的模块。

module.children

  • {Array}

由这个模块引入的模块。

其他...

为了获取即将用require()加载的准确文件名,可以使用require.resolve()函数。

综上所述,下面用伪代码的高级算法形式演示了require.resolve的工作流程:

require(X) from module at path Y
1. If X is a core module,
   a. return the core module
   b. STOP
2. If X begins with './' or '/' or '../'
   a. LOAD_AS_FILE(Y + X)
   b. LOAD_AS_DIRECTORY(Y + X)
3. LOAD_NODE_MODULES(X, dirname(Y))
4. THROW "not found"

LOAD_AS_FILE(X)
1. If X is a file, load X as JavaScript text.  STOP
2. If X.js is a file, load X.js as JavaScript text.  STOP
3. If X.json is a file, parse X.json to a JavaScript Object.  STOP
4. If X.node is a file, load X.node as binary addon.  STOP

LOAD_AS_DIRECTORY(X)
1. If X/package.json is a file,
   a. Parse X/package.json, and look for "main" field.
   b. let M = X + (json main field)
   c. LOAD_AS_FILE(M)
2. If X/index.js is a file, load X/index.js as JavaScript text.  STOP
3. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP
4. If X/index.node is a file, load X/index.node as binary addon.  STOP

LOAD_NODE_MODULES(X, START)
1. let DIRS=NODE_MODULES_PATHS(START)
2. for each DIR in DIRS:
   a. LOAD_AS_FILE(DIR/X)
   b. LOAD_AS_DIRECTORY(DIR/X)

NODE_MODULES_PATHS(START)
1. let PARTS = path split(START)
2. let I = count of PARTS - 1
3. let DIRS = []
4. while I >= 0,
   a. if PARTS[I] = "node_modules" CONTINUE
   c. DIR = path join(PARTS[0 .. I] + "node_modules")
   b. DIRS = DIRS + DIR
   c. let I = I - 1
5. return DIRS

从全局文件夹加载

如果环境变量NODE_PATH设置为冒号分割的绝对路径列表,并且在模块在其他地方没有找到,Node将会搜索这些路径。(注意,在Windows系统中,NODE_PATH用分号分割 )。

另外,Node将会搜索这些路径。

  • 1:$HOME/.node_modules
  • 2:$HOME/.node_libraries
  • 3:$PREFIX/lib/node

$HOME是用户的home文件夹,$PREFIX是Node里配置的node_prefix

这大多是历史原因照成的。强烈建议将所以来的模块放到node_modules文件夹里。这样加载会更快。

访问主模块

当Node运行一个文件时,require.main就会设置为它的module。也就是说你可以通过测试判断文件是否被直接运行。

require.main === module

对于foo.js文件。 如果直接运行node foo.js,返回true,如果通过require('./foo')是间接运行。

因为module提供了filename属性(通常等于__filename),程序的入口点可以通过检查require.main.filename来获得。

附录: 包管理技巧

Node的require()函数语义定义的足够通用,它能支持各种常规目录结构。诸如dpkg,rpmnpm包管理程序,不用修改就可以从Node模块构建本地包。

下面我们介绍一个可行的目录结构:

假设我们有一个/usr/lib/node/<some-package>/<some-version>文件夹,它包含指定版本的包内容。

一个包可以依赖于其他包。为了安装包foo,可能需要安装特定版本的bar包。bar包可能有自己的包依赖,某些条件下,依赖关系可能会发生冲突或形成循环。

因为Node会查找他所加载的模块的realpath(也就是说会解析符号链接),然后按照上文描述的方式在node_modules目录中寻找依赖关系,这种情形跟以下体系结构非常相像:

  • /usr/lib/node/foo/1.2.3/ - foo包,version 1.2.3。
  • /usr/lib/node/bar/4.3.2/ - foo依赖的bar包内容。
  • /usr/lib/node/foo/1.2.3/node_modules/bar- 指向/usr/lib/node/bar/4.3.2/的符号链接。
  • /usr/lib/node/bar/4.3.2/node_modules/*- 指向bar包所依赖的包的符号链接。

因此,即使存在循环依赖或依赖冲突,每个模块还可以获得他所依赖的包得可用版本。

foo包里的代码调用foo ,将会获得符号链接/usr/lib/node/foo/1.2.3/node_modules/bar指向的版本。然后,当bar包中的代码调用 require('queue'),将会获得符号链接/usr/lib/node/bar/4.3.2/node_modules/quux指向的版本。

另外,为了让模块搜索更快些,不要将包直接放在/usr/lib/node目录中,而是将它们放在/usr/lib/node_modules/<name>/<version>目录中。这样在依赖的包找不到的情况下,就不会一直寻找/usr/node_modules目录或/node_modules目录了。基于调用require()的文件所在真实路径,因此包本身可以放在任何位置。

为了让Node模块对Node REPL可用,可能需要将/usr/lib/node_modules文件夹路径添加到环境变量$NODE_PATH。由于模块查找$NODE_PATH文件夹都是相对路径,因此包可以放到任何位置。

由JSRUN为你提供的JS在线运行、在线编译工具
        JSRUN提供的JS 在线运行,JS 在线运行工具,基于linux操作系统环境提供线上编译和线上运行,具有运行快速,运行结果与常用开发、生产环境保持一致的特点。
yout