You use the logical AND operator, which is &&. In this case it would be:
if(gameObject.tag == "Slot1" && myImageToUpdate.sprite == null) { }
That checks both sides of the && and only returns true if both sides are true.
This eventually leads to something sort of like those “factoring” problems you used to get in algebra class. When you’re doing complex comparisons, you break it down into pieces, like say the tag is “Slot1” and the sprite is null- in the following statement && means “both sides must be true” and || means “either side must be true”, so:
if(gameObject.tag == "Slot1" && (myImageToUpdate.sprite == null || myImageSpriteToUpdate == someSprite)) { }
will turn into
if(TRUE && (FALSE || TRUE)) { }
which will turn into
if(TRUE && TRUE) { }
which will turn into
if(TRUE) { }
You can come up with some fairly complicated logic in a pretty small span of space if you use it properly. The following is an example of “if the sprite is null AND the gameObject has a tag that’s equal to any of the first three slots”:
if(myImageToUpdate.sprite == null && (gameObject.tag == "Slot1" || gameObject.tag == "Slot2" || gameObject.tag == "Slot3")) { }
It’s worth noting that the if statement will short-circuit itself at the first FALSE value that it hits, meaning it won’t bother checking the rest (a real FALSE value, not FALSE is an ongoing comparison like the slots above). So for instance, in the above example, if myImageToUpdate.sprite isn’t null, it won’t bother checking the tags. This behaviour is how we can say:
if(someGameObject != null && someGameObject.GetComponent<someComponent>() != null) { }
which checks if the someGameObject is not null first and THEN checks if it has a component only in the case that it’s not null. Normally if we check for a component and the object is null, it’ll throw an error, but this way works because if it’s null it won’t even get to the component check.
Sorry, I know this is an info-dump and a lot to take in. Hope it helps though.