I've tried all three. Quick and dirty differences: ZeroNet is for sharing websites by public key -- meaning the data the public key points to is mutable by the whoever possesses the private key. Dat is for storing generic content (which may or not be a website) by public key. IPFS is for storing generic content by hash -- meaning that the data the address points to is immutable. You should also be aware of IPNS, a public key system from the makers of IPFS, thought I'm more of a fan of Dat than anything else.