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)添加多个对象