2017-01-25 3 views
3

Я изучаю Redux, React и ES6. Я уже разработал JS, но этот новый мир ES6 удивляет меня множеством новых вещей, таких как «=>», чтобы объявлять функции стрелок и другие. Однако в этих новых исследованиях Redux я столкнулся с ... в середине моего кода.Что означает «...» в Javascript (ES6)?

пыльник У меня есть пример:

import { combineReducers, createStore } from 'redux' 

const userReducer = (state={}, action) => { 
    switch(action.type) { 
     case 'CHANGE_NAME': 
      state = {...state, name: action.payload}; 
      break; 
     case 'CHANGE_AGE': 
      state = {...state, age: action.payload}; 
      break; 
    } 
    return state; 
}; 

const tweetsReducer = (state=[], action) => { 
    return state; 
}; 

const reducers = combineReducers ({ 
    user: userReducer, 
    tweetsReducer: tweetsReducer, 
}); 


const store = createStore(reducers); 

store.subscribe(() => 
    console.log('The chage was: ', store.getState()) 
); 

store.dispatch({type: 'CHANGE_NAME', payload: 'Will'}) 
store.dispatch({type: 'CHANGE_AGE', payload: 21}); 

Если я заменяю
state = {...state, name: action.payload}; и
state = {...state, age: action.payload};
с
state.name = action.payload; и
state.age = action.payload;
он работает, но возраст был включен в имя объекта вместе и в первом случае имя было вставлено и после установки возраста.

Почему это происходит? Как я могу использовать ... в моих будущих кодах? Это просто связано с государствами?

+4

'...' является оператором распространения: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator – hackerrdave

+0

Спасибо! Когда я спросил, я не нашел. Таким образом, это действительно дубликат. Однако, спасибо за ваши ответы. – Aipi

+0

@hackerrdave: ['...' не является оператором] (https://stackoverflow.com/questions/37151966/what-is-spreadelement-in-ecmascript-documentation-is-it-the-same-as- распространение-опер/37152508 # 37152508). –

ответ

2

Это так называемый оператор .

Он распаковывает значения из объекта или массива в другой объект или массив. Например, при использовании массивов:

a1 = [1, 2, 3] 
a2 = [4, 5, 6] 
a12 = [...a1, ...a2] // [1, 2, 3, 4, 5, 6] 

Те же семантики применяются к объектам:

o1 = { foo: 'bar' } 
o2 = { bar: 'baz' } 
o12 = { ...o1, ...o2 } // { foo: 'bar', bar: 'baz' } 

Вы можете использовать его для объектов мелкой копирования и массивов:

a = [1, 2, 3] 
aCopy = [...a] // [1, 2, 3], on a new array 

o = { foo: 'bar' } 
oCopy = { ...o } // { foo: 'bar' }, on a new object 

Отъезд Mozilla docs , отличный источник для всех javascript.

+0

Спасибо! Когда я спросил, я не нашел. Таким образом, это действительно дубликат. Однако, спасибо за ваш ответ. – Aipi

+0

На самом деле это две разные вещи: IMO, потому что оператор спреда является частью официальной спецификации, тогда как синтаксис с расширением объекта все еще находится на ранней стадии процесса tc39. Это означает, что это два очень разных поведения, оператор спреда делает намного больше, чем «распаковка». – adz5A

+1

['...' не является оператором] (https://stackoverflow.com/questions/37151966/what-is-spreadelement-in-ecmascript-documentation-is-it-the-same-as-spread-oper/37152508 # 37152508). –