筛选能被5整除的数,并用分号拼接成字符串
var returnStr;
returnStr="";
for(var i=0;i<intArray.length;i++)
{
if(parseInt(intArray[i])%5==0) //能否被5整除
{
if(returnStr!="")
returnStr+=";";
returnStr+=intArray[i]; //将能被5整除的数字拼接成字符串
}
}这几行代码是 worker.js 中的核心逻辑:筛选能被5整除的数,并用分号拼接成字符串。让我详细解释每一部分:
代码逐行解析
var returnStr; // 声明一个变量,用于存储结果字符串 returnStr = ""; // 初始化为空字符串
准备一个空字符串,用来收集所有符合条件的数字
初始为空,便于后续判断是否是第一个数字
for(var i = 0; i < intArray.length; i++) // 遍历整个数组
循环遍历从父线程传来的整数数组
intArray.length是100(因为生成了100个随机数)
{
if(parseInt(intArray[i]) % 5 == 0) // 检查能否被5整除parseInt(intArray[i])确保当前元素是整数(虽然已经是整数,但做类型安全)% 5是取模运算,求除以5的余数% 5 == 0表示能被5整除(余数为0)例如:5、10、15、20...都能被5整除
{
if(returnStr != "") // 如果不是第一个数字
returnStr += ";"; // 先添加分号分隔符
returnStr += intArray[i]; // 将数字追加到字符串末尾
}
}执行过程示例
假设 intArray = [45, 23, 67, 50, 89, 35, 12, 75, 90, 11, ...]
循环处理过程:
初始状态: returnStr = "" i=0: intArray[0]=45, 45%5=0 ✓ returnStr为空 → 不加分号 returnStr = "45" i=1: intArray[1]=23, 23%5=3 ✗ 跳过 i=2: intArray[2]=67, 67%5=2 ✗ 跳过 i=3: intArray[3]=50, 50%5=0 ✓ returnStr不为空 → 加分号";" returnStr = "45;50" i=4: intArray[4]=89, 89%5=4 ✗ 跳过 i=5: intArray[5]=35, 35%5=0 ✓ returnStr不为空 → 加分号";" returnStr = "45;50;35" ... 继续循环 最终结果: "45;50;35;75;90;..."
字符串拼接的细节
为什么要用分号分隔?
// 用分号分隔的结果 "45;50;35;75;90" // 如果没有分隔符 "4550357590" // 无法区分是45,50,35还是455,0,35... // 用其他分隔符 "45,50,35,75,90" // 也可以用逗号,但原代码选择分号
为什么要有 if(returnStr!="") 判断?
// 如果没有这个判断,第一个数字前也会加分号 returnStr = ""; // 初始空 returnStr += ";"; + "45" // 结果: ";45" ← 开头多一个分号 // 有判断的逻辑 returnStr = ""; // 初始空 if(returnStr != "") // false,不加分号 returnStr += "45" // 结果: "45" ← 正确
完整的工作流程
// worker.js
onmessage = function(event) {
// 1. 接收并解析数据
var intArray = JSON.parse(event.data); // [45,23,67,50,89,35,...]
// 2. 准备结果字符串
var returnStr = "";
// 3. 遍历筛选能被5整除的数
for(var i = 0; i < intArray.length; i++) {
if(parseInt(intArray[i]) % 5 == 0) {
if(returnStr != "")
returnStr += ";";
returnStr += intArray[i];
}
}
// 4. 返回结果
postMessage(returnStr); // 发送如 "45;50;35;75;90" 的字符串
// 5. 关闭线程
close();
}最终结果示例
假设随机生成的数组包含以下能被5整除的数:
第3个元素:45
第7个元素:50
第12个元素:35
第18个元素:75
第25个元素:90
第31个元素:60
第42个元素:85
第56个元素:95
第63个元素:40
第78个元素:55
最终 returnStr 会是:
"45;50;35;75;90;60;85;95;40;55"
这种做法的优缺点
优点:
简单直观:字符串拼接逻辑清晰
内存高效:不需要创建中间数组
传输方便:一个字符串比数组更容易传输
缺点:
需要解析:接收端需要用
split(";")拆分成数组不易修改:如果需要添加/删除元素,需要重新构建字符串
在HTML中的使用
// 主线程接收后
worker.onmessage = function(event) {
// event.data = "45;50;35;75;90"
var intArray = event.data.split(";"); // 拆分成数组
// intArray = ["45","50","35","75","90"]
}这种字符串拼接的方式在Web Worker通信中很常见,特别是在需要传递简单数据列表时,比传递数组对象更轻量。