Functional and Object Oriented programming have their differences. So do Procedural, Aspect Oriented, Imperative, and a few other programming paradigms which I could go on to list (but won't.) Understanding the differences between Functional and Object Oriented programming is just as important as knowing the difference between oil paint and watercolors. They are useful tools that can be used to make beautiful things, but they behave very differently. One of the keys to knowing the reach and scale of these tools is the understanding of the concept of immutability.
"Immutability" means that a thing's state cannot be changed after it is created. For example, the value a variable in a functional language will never change, as opposed to a mutable object in Ruby that can be changed many times over. It's this capacity for modification that makes Object Oriented languages so powerful, and in some cases so challenging. The mutable state of objects in OOP can be misused, leading to code that is labyrinthine and difficult to understand.
Functional programming is more concerned with functions than objects, it separates information from process. In certain cases it takes advantage of caching, so there is no need for a database full of data objects. Functional programming avoids mutable "states" by focusing on input and expressions. If you can change a variable, the program changes "states", functional programming avoids this altogether by isolating behavior into functions that the data is passed through without any mutation. You pass a number into a function, and get a new number out, but the original number has not been changed.
At the 2010 Future of Web Apps (FOWA) conference, Alex Payne summarized the difference between the two paradigms;
Working with object oriented programming is like a movie. You have a cast of characters with a set script. You have directors and producers. It's a time-consuming task and very error prone...Functional programming is more like getting up to a chalkboard and writing an equation. You know how it's gonna work every time. Writing what should be done, instead of how. FP is more like finding and using mathematical abstractions to represent programs. Thinking in an analytical way. FP is value-oriented programming. State is transformed, not mutated.
Despite its complexity, OOP's ability to model real-world objects by encapsulating data and associating behaviors with that data can be a more intuitive approach. We classify things in the real world. We ascribe behaviors and traits to those things, and base our understanding of the world around us based on observation and classification.