繁体   English   中英

为什么if / else语句在Object.assign()和.map中不起作用?

[英]Why doesn't an if/else statement work in Object.assign() and .map?

我正在学习有关javascript对象的知识,并试图将自己的头缠在prototype.map周围。 目标是创建一个充满对象的新数组(使用下面的充满对象的数组)而不修改原始对象。 如果角色的名称在badGuys数组中,则其状态将为“邪恶”,否则其状态将为“良好”。

这些是我想出的两个解决方案:

 const badGuys = ['Joker', 'Two Face', 'Riddler', 'Bane']; const characters = [ { name: 'Flash', status: null }, { name: 'Joker', status: null }, { name: 'Batman', status: null }, { name: 'Superman', status: null }, { name: 'Two Face', status: null }, { name: 'Bane', status: null }, { name: 'Riddler', status: null }, ]; //Works: const sortedCharacters = characters.map(function (character) { return Object.assign({}, character, { status: badGuys.includes(character.name) ? "evil" : "good" }); }); //Doesn't work: const sortedCharacters = characters.map(function (character) { return Object.assign({}, character, { status: if (badGuys.includes(character.name)) { "evil" } else { "good" } }); }); 

使用三元运算符有效,但if / else语句无效。 为什么?

if-else和三元运算符之间的重要区别在于,在Javascript中,if-else语句是语句 ,而三元运算符是表达式

这意味着if-else构造没有值,而三元构造则没有。 这意味着您不能将if-else语句放置在需要值的位置。

发生这种情况是因为它不是有效的语法。 正确的代码如下。

为什么三元运算符起作用?

因为对三元运算符之前的epxression进行了评估,并且如果为true,则status的值是邪恶的。 否则是好的。

status: badGuys.includes(character.name) ? "evil" : "good"

在以下代码段中,我们声明了一个返回所需函数的函数。

 const badGuys = ['Joker', 'Two Face', 'Riddler', 'Bane']; const characters = [ { name: 'Flash', status: null }, { name: 'Joker', status: null }, { name: 'Batman', status: null }, { name: 'Superman', status: null }, { name: 'Two Face', status: null }, { name: 'Bane', status: null }, { name: 'Riddler', status: null }, ]; const sortedCharacters = characters.map(function (character) { return Object.assign({}, character, { status: function(){ if (badGuys.includes(character.name)) { return "evil" } else { return "good" } } }); }); 

但这是完全不同的事情。 在这种情况下,您正在使用一个函数。 我真的很想知道为什么正常的条件不能按预期工作

如您从语言文档中所

从逻辑上讲,对象是属性的集合。 每个属性都是数据属性或访问器属性:

  • 数据属性将键值与ECMAScript语言值和一组布尔属性相关联。
  • 访问器属性将键值与一个或两个访问器函数以及一组布尔属性相关联。 访问器函数用于存储或检索与属性关联的ECMAScript语言值。

数据属性将键值与属性相关联

  • [[值]]
  • [[可写]]
  • [[可枚举]]
  • [[可配置]]

有什么价值?

通过属性的get访问获取的值。

哪个是域?

任何ECMAScript语言类型

哪种ECMAScript语言类型?

  • 未定义类型
  • 空类型
  • 布尔型
  • 字符串类型
  • 符号类型
  • 号码类型
  • 对象类型

话虽这么说,if / else语句不能作为与对象的键相关的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM