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

如何判断变量是否可安全执行数组/对象展开(...)操作?

如何检查变量是否可安全执行展开操作(...param)

在JavaScript/TypeScript中,数组展开和对象展开的规则不同,下面分别说明如何判断一个未知变量能否安全执行对应的展开操作:

一、判断能否安全进行数组展开([...param])

数组展开要求目标是可迭代对象(Iterable),也就是拥有Symbol.iterator方法的对象。如果给非可迭代的变量执行数组展开,会直接抛出错误(比如[...{}]会报错)。

检查方法

可以通过以下条件判断:

function canSpreadAsArray(param) {
  // 排除null/undefined,然后检查是否有可迭代接口
  return param != null && typeof param[Symbol.iterator] === 'function';
}

适用场景

  • 返回true的情况:数组、字符串、Map、Set、Generator函数等可迭代对象,展开后能得到预期的数组结构;
  • 返回false的情况:null、undefined、普通对象({key: 1})、数字、布尔值,这些执行数组展开会报错,需要提前拦截。

二、判断能否安全进行对象展开({...param})

对象展开的容错性更高:null、undefined展开后会得到空对象,不会报错;基本类型(数字、字符串、布尔)会被包装成对应的包装对象,但展开后通常不会得到有实际意义的属性;只有对象类型(包括数组、函数等)才能展开出自身的可枚举属性。

检查方法

根据需求不同,有两种判断逻辑:

  1. 允许空展开(null/undefined也视为安全)
    这种情况不需要额外判断,直接执行{...param}即可,因为不会报错,最多得到空对象。

  2. 要求展开后能得到有效属性
    可以检查变量是否为非null的对象:

    function canSpreadAsObject(param) {
      return typeof param === 'object' && param !== null;
    }
    

适用场景

  • 返回true的情况:普通对象、数组、函数、Set、Map等,展开后能获取它们的可枚举属性;
  • 返回false的情况:null、undefined、数字、字符串、布尔值,这些要么展开为空对象,要么展开出的属性无实际意义。

三、在myFunc(param: any)中的实际用法示例

数组展开的安全处理

function myFunc(param: any) {
  if (param != null && typeof param[Symbol.iterator] === 'function') {
    const arr = [...param];
    // 处理展开后的数组逻辑
  } else {
    // 处理不可展开的情况,比如设置默认值或抛出提示
    const arr = [];
  }
}

对象展开的安全处理

function myFunc(param: any) {
  // 若允许null/undefined展开为空对象,直接执行
  const obj = {...param};

  // 若仅处理能展开出有效属性的情况
  let obj;
  if (typeof param === 'object' && param !== null) {
    obj = {...param};
  } else {
    obj = { default: 'value' };
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:30:20