A Material Slot is simply a selection of geometry elements. Nothing more. They define which material goes on which part of an object.
For a mesh object, a material slot contains a selection of mutually exclusive groups of faces (one face can only belong to exactly one material slot at a time) to which you may apply a material.
A material slot is a property of the geometry of an object data and is tied to its shape. At the most basic level for a mesh object, you can specify which discrete faces belong to which material slot. Under other object types, it is more limited but the principle still applies, you select a bunch of elements (like a continuous spline in a bezier curve, or a few characters in a text object) and assign it to one slot.
In other words, if you want to apply several materials to different parts of the same object, you create several slots to determine which material goes where.
Material Slots are not materials and hold no color or surface information whatsoever on their own. They are completely independent of material definitions.
Material slots do hold materials in them, and may commonly then have materials assigned or just remain empty. The same material can be applied to several different slots in the same object or shared across different objects, but one slot can only have one material assigned to it at any given time.
A material, on the other hand, is a collection of information (surface properties, textures, colors, images, volumetric data among others) that define the appearance of a geometry either through its surface, volume or emission properties. It may or may not make use of image-based textures.
Materials can also be assigned to a slot in a "Per Object" or "Per Object-Data" basis. The difference is that if you apply a material "Per Object" every instance of that object can override that material independently per individual occurrence and have a different one in its place.
If you apply it "Per Object-data" to all objects sharing that object data (geometry) will have that same material applied to that one slot regardless, if you change the material assigned to that slot in one object, it will sync change it for all instances sharing that data.
Say for example the same car mesh that can have a yellow chassis in one place but a red on another while remaining a linked instance (per-object material), but the tires will always be black rubber regardless (per-object data forced material), if you change the tire material in one car it changes for all of the copies.