使用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
相关产品推荐
相关产品推荐

