You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Set().union()报错:.size属性为NaN的问题排查

问题分析与解决

你遇到的核心问题是:原生JavaScript的Set对象并没有内置的union方法,你代码里调用的.union()不是标准API,这才是报错的根源。

关于报错信息里的"The .size property is NaN",大概率是你之前可能尝试自己实现了Set.prototype.union,但实现逻辑有问题——比如错误地直接修改了原Set的size属性(size是只读属性,强行赋值会导致异常,或者错误的计算逻辑让size变成了NaN),或者返回的不是一个合法的Set实例。

正确的解决方案

方案1:直接用扩展运算符合并(最简单)

不需要额外方法,直接把两个数组合并后传入Set构造函数即可自动去重:

const a_list = [1, 2, 3];
const b_list = [3, 4, 5];
const combined = new Set([...a_list, ...b_list]);
console.log(combined); // 输出 Set(5) {1, 2, 3, 4, 5}

方案2:手动实现可靠的union方法

如果你确实需要链式调用的union方法,可以给Set原型添加正确的实现(注意:扩展原生原型需谨慎,避免污染全局):

Set.prototype.union = function(iterable) {
  // 基于当前Set创建新集合,避免修改原集合
  const newSet = new Set(this);
  // 遍历传入的可迭代对象,添加所有元素到新集合
  for (const item of iterable) {
    newSet.add(item);
  }
  // 返回新集合,支持链式调用
  return newSet;
};

// 使用方式
const a_list = [1, 2, 3];
const b_list = [3, 4, 5];
const combined = new Set(a_list).union(b_list);
console.log(combined); // 输出 Set(5) {1, 2, 3, 4, 5}

为什么你的原代码会报错?

原生Set的size是只读属性,正常情况下new Set().size确实是0,但如果你的union方法错误地尝试修改它(比如写了this.size += ...),或者返回的不是一个合法的Set实例,就会触发异常。比如下面这种错误实现就会导致你遇到的问题:

// 错误示例:不要这么写
Set.prototype.union = function(arr) {
  this.size += arr.length; // 这里强行修改只读的size属性会导致异常,或计算错误让size变成NaN
};

内容的提问来源于stack exchange,提问作者ohmu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:27:09