Javascript 扩展运算符可以包含对象的未定义字段吗?

Posted

技术标签:

【中文标题】Javascript 扩展运算符可以包含对象的未定义字段吗?【英文标题】:Can Javascript spread operator include undefined fields of an object? 【发布时间】:2019-06-10 18:39:57 【问题描述】:

有没有更易读的方式将一个对象的未定义字段传播到另一个对象上,而不遍历它的每个元素?

以下示例将对象A 传播到对象B

let A =  f1:'Foo', f2:'Bar', f3:'Baz' 
let B =  ...A 
// Now B has the value of  f1:'Foo', f2:'Bar', f3:'Baz' 

但是,在以下示例中,展开运算符将不包含未定义的值:

let A =  f1:'Foo', f2:undefined, f3:'Baz' 
let B =  ...A 
// Now B has the value of  f1:'Foo', f3:'Baz' 
// I would like it to be spread like  f1:'Foo', f2:undefined, f3:'Baz'  
// or  f1:'Foo', f2:null, f3:'Baz' 

有没有一种方法可以使用扩展运算符投影具有undefined 值的字段? (显然没有遍历对象A 的每个字段并传播到B,如果该字段的值不是undefined

【问题讨论】:

我无法重现问题。 let A = f1:'Foo', f2:undefined, f3:'Baz' let B = ...A 这只是给了我预期的结果。 您的断言不正确。如果A 有一个字段f2 具有any 值,包括undefined,它将被点差复制到B(这不是真正的运算符,因为这是值得的) . 哦,对了。。我猜是Express.js,不包括使用Response::json()时未定义的字段 @iGoodie 这是因为 undefined 在 JSON 中不是合法值,尽管它是 JS 文字中键的合法值。 请注意,虽然 undefined 是非法的,但 null 是 JSON 中的有效值 【参考方案1】:

如果您询问展开运算符是否会维护未定义的属性值“展开后”,它们会。

const original =  one: 1, two: 2, three: undefined, four: null ;
console.log(original);
const withSpread = five: 5, ...original ;
console.log(withSpread);
console.log(typeof withSpread.three === 'undefined')

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Operators/Spread_syntax

【讨论】:

【参考方案2】:

结果证明我的断言无效。传播运算符确实传播具有undefined 值的字段。是 JSON.stringify() 删除了我的一个来源中的这些字段,这导致我的断言无效。

对于Express.js 用户;您可以使用app.set('json replacer', (k, v) => v===undefined ? null : v);undefined 值替换为null 来让表达字符串化您的json 响应

或者同样,您可以使用JSON.stringify(..., (k, v) => v===undefined ? null : v)undefined 值替换为null 来使其字符串化

【讨论】:

以上是关于Javascript 扩展运算符可以包含对象的未定义字段吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用对象扩展运算符(ES6、JavaScript)添加多个对象

为啥不能在对象键之后使用 Javascript 扩展运算符?

javascript 使用对象扩展运算符的可选属性

具有未定义和空值的排序对象数组

JavaScript ES6 - 对象扩展

JavaScript ES6 - 对象扩展