如何判断变量是否可安全执行数组/对象展开(...)操作?
如何检查变量是否可安全执行展开操作(...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展开后会得到空对象,不会报错;基本类型(数字、字符串、布尔)会被包装成对应的包装对象,但展开后通常不会得到有实际意义的属性;只有对象类型(包括数组、函数等)才能展开出自身的可枚举属性。
检查方法
根据需求不同,有两种判断逻辑:
允许空展开(null/undefined也视为安全)
这种情况不需要额外判断,直接执行{...param}即可,因为不会报错,最多得到空对象。要求展开后能得到有效属性
可以检查变量是否为非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
相关产品推荐
相关产品推荐

