由 ["1", "2", "3"].map(parseInt) 引发的思考

本文详细介绍了 JavaScript 中的 parseInt 函数及其使用方法,包括不同基数的数字字符串转换为整数的过程。同时,还讲解了 Array.prototype.map 方法的应用,演示如何通过回调函数处理数组中的每个元素。
parseInt(string, radix);
string:要被解析的值。若不是字符串,则将其转换为字符串
radix:介于2-36的整数,是string的基数。0为十进制,默认为十进制。
返回值:返回解析后的整数值。若被解析参数的第一个字符无法被转化为对应的数值类型,则返回NaN。
parseInt("10");         // 返回 10 (默认十进制)
parseInt("19",10);      // 返回 19 (十进制: 10+9)
parseInt("11",2);       // 返回 3 (二进制: 2+1)
parseInt("13",2);       // 返回 1 (仅解析合法的位数)
parseInt("17",8);       // 返回 15 (八进制: 8+7)
parseInt("1f",16);      // 返回 31 (十六进制: 16+15)
parseInt("010");        // 未定:返回 10 或 8
map() 方法创建一个新数组,结果是该数组重的每个元素都调用一个提供的函数后返回的结果。
let new_array = arr.map(function cb(currentValue[, index[, array]]){ ... });
callback函数有三个参数:
    currentValue
    index【可选】
    array【可选】

故,答案为:
 [1, NaN, NaN]

const express = require('express'); const cors = require('cors'); const sqlite3 = require('sqlite3').verbose(); const path = require('path'); // 创建服务器 const app = express(); app.use(express.json()); // 修复CORS配置 - 添加详细配置 app.use(cors({ origin: '*', methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'], credentials: true })); // 处理预检请求 app.options('*', cors()); // 连接SQLite数据库 const db = new sqlite3.Database('./archive.db', (err) => { if (err) { console.error('数据库连接错误:', err.message); } else { console.log('成功连接SQLite数据库'); // 初始化档案表 db.run(`CREATE TABLE IF NOT EXISTS archives ( id INTEGER PRIMARY KEY AUTOINCREMENT, fileNumber TEXT NOT NULL, documentNumber TEXT, responsiblePerson TEXT, title TEXT NOT NULL, date TEXT, projectDate TEXT, securityLevel TEXT, pages INTEGER, retentionPeriod TEXT, carrierForm TEXT, notes TEXT, type TEXT NOT NULL, createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(fileNumber, type) )`); } }); // 获取档案数据 (添加错误处理) app.get('/api/archives', (req, res) => { const type = req.query.type || 'document'; db.all('SELECT * FROM archives WHERE type = ? ORDER BY createdAt DESC', [type], (err, rows) => { if (err) { console.error('数据库查询错误:', err); res.status(500).json({ error: '数据库查询失败' }); } else { res.json(rows); } }); }); // 添加新档案 app.post('/api/archives', (req, res) => { const { fileNumber, documentNumber, responsiblePerson, title, date, projectDate, securityLevel, pages, retentionPeriod, carrierForm, notes, type } = req.body; // 验证必填字段 if (!fileNumber || !title || !type) { return res.status(400).json({ error: '档号、题名和类型为必填项' }); } const sql = ` INSERT INTO archives ( fileNumber, documentNumber, responsiblePerson, title, date, projectDate, securityLevel, pages, retentionPeriod, carrierForm, notes, type ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `; const values = [ fileNumber, documentNumber || null, responsiblePerson || null, title, date || null, projectDate || null, securityLevel || null, pages ? parseInt(pages) : null, retentionPeriod || null, carrierForm || null, notes || null, type ]; db.run(sql, values, function(err) { if (err) { // 处理唯一键冲突(档号重复) if (err.code === 'SQLITE_CONSTRAINT') { return res.status(409).json({ error: '该档号已存在,请使用其他档号' }); } return res.status(500).json({ error: err.message }); } res.status(201).json({ id: this.lastID, ...req.body }); }); }); // 更新档案 app.put('/api/archives/:id', (req, res) => { const id = req.params.id; const { fileNumber, documentNumber, responsiblePerson, title, date, projectDate, securityLevel, pages, retentionPeriod, carrierForm, notes, type } = req.body; // 验证必填字段 if (!fileNumber || !title || !type) { return res.status(400).json({ error: '档号、题名和类型为必填项' }); } const sql = ` UPDATE archives SET fileNumber = ?, documentNumber = ?, responsiblePerson = ?, title = ?, date = ?, projectDate = ?, securityLevel = ?, pages = ?, retentionPeriod = ?, carrierForm = ?, notes = ?, type = ? WHERE id = ? `; const values = [ fileNumber, documentNumber || null, responsiblePerson || null, title, date || null, projectDate || null, securityLevel || null, pages ? parseInt(pages) : null, retentionPeriod || null, carrierForm || null, notes || null, type, id ]; db.run(sql, values, function(err) { if (err) { // 处理唯一键冲突(档号重复) if (err.code === 'SQLITE_CONSTRAINT') { return res.status(409).json({ error: '该档号已存在,请使用其他档号' }); } return res.status(500).json({ error: err.message }); } if (this.changes === 0) { return res.status(404).json({ error: '档案未找到' }); } res.json({ id: id, ...req.body }); }); }); // 删除档案 app.delete('/api/archives/:id', (req, res) => { const id = req.params.id; db.run('DELETE FROM archives WHERE id = ?', [id], function(err) { if (err) { return res.status(500).json({ error: err.message }); } if (this.changes === 0) { return res.status(404).json({ error: '档案未找到' }); } res.json({ success: true }); }); }); // 批量导入档案 app.post('/api/archives/batch-import', (req, res) => { const data = req.body.data || []; if (data.length === 0) { return res.status(400).json({ error: '没有提供导入数据' }); } let insertedCount = 0; let skippedCount = 0; let processed = 0; // 开始事务 db.serialize(() => { db.run('BEGIN TRANSACTION'); data.forEach(item => { const { fileNumber, documentNumber, responsiblePerson, title, date, projectDate, securityLevel, pages, retentionPeriod, carrierForm, notes, type } = item; // 检查是否已存在相同档号和类型的档案 db.get('SELECT id FROM archives WHERE fileNumber = ? AND type = ?', [fileNumber, type], (err, row) => { if (err) { // 错误处理 return; } if (row) { // 跳过已存在的档案 skippedCount++; checkComplete(); return; } // 插入新档案 const sql = ` INSERT INTO archives ( fileNumber, documentNumber, responsiblePerson, title, date, projectDate, securityLevel, pages, retentionPeriod, carrierForm, notes, type ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `; const values = [ fileNumber, documentNumber || null, responsiblePerson || null, title, date || null, projectDate || null, securityLevel || null, pages ? parseInt(pages) : null, retentionPeriod || null, carrierForm || null, notes || null, type ]; db.run(sql, values, function(err) { if (!err) { insertedCount++; } checkComplete(); }); }); }); function checkComplete() { processed++; if (processed === data.length) { db.run('COMMIT', (err) => { if (err) { return res.status(500).json({ error: '导入失败' }); } res.json({ insertedCount, skippedCount }); }); } } }); }); // 启动服务器 const port = 3000; app.listen(port, () => { console.log(`服务器运行在 http://localhost:${port}`); }); 运行这个js文件报错,throw new TypeError(`Missing parameter name at ${i}: ${DEBUG_URL}`);
最新发布
07-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值