JavaScript:为什么JavaScript对象中没有键?

6

阅读 redux todomvc 的代码时,为什么在以下代码中没有使用任何键值({})呢?例如以下代码中的 textid 之前没有键值,让我有些困惑。

import * as types from '../constants/ActionTypes'

export const addTodo = text => ({ type: types.ADD_TODO, text })
export const deleteTodo = id => ({ type: types.DELETE_TODO, id })
export const editTodo = (id, text) => ({ type: types.EDIT_TODO, id, text })
export const completeTodo = id => ({ type: types.COMPLETE_TODO, id })
export const completeAll = () => ({ type: types.COMPLETE_ALL })
export const clearCompleted = () => ({ type: types.CLEAR_COMPLETED })

欢迎提出任何评论。谢谢。

更新

感谢您的答案和评论。我发现我的问题有点愚蠢。目前,我正在为了娱乐而学习react和redux。我不熟悉es2015。有时,我无法区分2015年新语法和redux语法。谢谢。


我不确定你在问什么。 - Naftali
现在是哪些键之间? - Naftali
3
他丢了钥匙。 - Dan Wilson
2
这是ES6简写语法。idid: id相同。 - Ram
1
“我发现我的问题有点傻”,一点也不,一开始看起来确实很奇怪。 - T.J. Crowder
2个回答

17
在 ES2015(和 JSX)对象初始化器中,您可以仅在变量名称后面不带值的情况下创建一个对象属性;该属性的名称将与变量的名称相同,而属性的值将是变量的值:

let one = 1;
let obj = {one};
console.log(obj.one); // 1

在这一行上:
export const addTodo = text => ({ type: types.ADD_TODO, text })

不是说(属性名称)不存在,而是text属性的没有(明确地)存在。这就像是写成了这样:

export const addTodo = text => ({ type: types.ADD_TODO, text: text })
// ---------------------------------------------------------^^^^^^

这只是一种速记法。但它非常有用。


2
这是一个完全合法的功能,但我仍然感到困惑,因为我习惯于在JSON中看到键值对。需要进行太多的思维运动了。 :) - Dan Wilson
@user3608792 我认为箭头函数和对象方法简写语法是ES2015最好的特性。 - Ram
你会如何将 "export const addTodo = text => ({ type: types.ADD_TODO, text: text })" 中的箭头函数翻译成“标准函数”?因为 IE 不支持箭头函数。 - Soul Eater
1
@SoulEeater - IE 不支持 JSX 或模块。通常需要使用像 Babel 这样的转译器来处理它(以及一个打包工具来处理模块方面)。但由于该箭头函数不使用 this,所以传统函数版本是 function addToDo(text) { return {type: types.ADD_TODO, text: text }; } - T.J. Crowder
1
谢谢@T.J.Crowder,只是我有完全不同的代码,但其中一个部分具有完全相同的函数结构,我无法在IE上使其工作 :) - Soul Eater

10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接