1. While OOP describes the world using Objects, which claim to be highly bound to people's minds of understanding, FP uses pure data (sequences, numbers, etc) to describe the world state, and functions over data to describe how the world might change.
2. While OOP implies a strong separation between Data and Behavior, representing those by Fields and Methods respectively, FP considers Behavior as a part of Data, representing Behavior as Functions, which could be manipulated (generated and passed as arguments) like Data.
3. Historically, OOP considers the world to be mutable, so the OOP Data might be mutated by Object methods. This seems fair, as the world is mutable in practice.
On the other hand, FP encourages developers to think about a program as a whole possible reasonable set of changes and states, which allows considering a state as a result of a particular change to another state. This understanding is more mathematical, as in a certain moment of time it's possible to make a State snapshot and make correct assumptions of what exactly led to that.
4. While both OOP and FP work with sequential data (lists, arrays, etc), OOP introduces loops to iterate over these, and in most cases modify each element of a sequence in place. FP uses recursion algorithms to iterate sequences as it needs to have an immutable snapshot of the state after each iteration.
5. Both FP and OOP support parallel programming, but as FP works with immutable states, it does not introduce complex transaction memory models to secure parallel modification while working with immutable structures.