When you load a scene, Unity destroys everything that is not marked DontDestroyOnLoad and loads your new scene fully, including potential duplicates.
DontDestroyOnLoad ( this.gameObject )
affects the object and all it's children. Similarly, Destroy ( gameObject ) will destroy the object and all it's children. Destroy ( this ) will simply destroy the component ( the script ), not the GameObject.
So, for a persistent UI, parent all your UI to one object that is set to DontDestroyOnLoad. When you work on your levels, it can be handy to have the UI in every scene ( play level 5 directly, for example ), but that can lead to duplicates, hence my second script above : check if the UI exists in the scene, if it does, self destruct.
Hope it helps!