const styleObject = StyleSheet.create({ merged: { color: 'black', fontSize: 11, }, black: { color: 'black', }, smallFont: { fontSize: 11, }, }); const plainObject = { black: { color: 'black', }, smallFont: { fontSize: 11, }, }; console.log('#1', styleObject.black, styleObject.smallFont); // => 463 464 console.log('#2-1', StyleSheet.flatten(styleObject.black/* number */)); // => Object {color: "black"} console.log('#2-2', StyleSheet.flatten(plainObject.black/* object */)); // => Object {color: "black"} console.log('#3-1', StyleSheet.flatten([styleObject.black, styleObject.smallFont])); // => Object {color: "black", fontSize: 11} console.log('#3-2', StyleSheet.flatten([plainObject.black, plainObject.smallFont])); // => Object {color: "black", fontSize: 11} console.log('#4', StyleSheet.flatten({ ...plainObject.black, ...plainObject.smallFont })); // => Object {color: "black", fontSize: 11} /* Here is my conclusion: 1) Whenever you use `StyleSheet.flatten()`, there will be only a performance loss, no gain. 2) The reason why we should use it is to look up the original style object from style id. 3) I don't find any difference between `StyleSheet.flatten()` and the spread operator when generating plain style object. 4) `StyleSheet.flatten()` both accept style id and style object, which means that it's more error-safe. But, I think we should strictly restrict its use whenever possible. 5) Regarding the question of performance difference between an merged object and non-merged objects given as a array, But, I don't think there is a big performance difference because it's known fact that RN and native code communicate in JSON. I think it's better to prioritize readability against performance if you are hesistant between those two. */