Just checking the nodeType property can trip you up if no object actually exists, for then the script stops executing with an error.
Checking that the object exists first does tend to be mandatory.
Checking that it's an object is not strictly necessary, but it does help others coming across the code to know that you expect it to be an object from that point onwards.
Checking the nodeType also tends to be mandatory, if you want to avoid matching other nodes such as text nodes, or comment nodes.
From what I understand though, that's not quite enough in some browsers when working with elements that belong to other windows or frames, which is why nodeName is also used.
It would be useful though if we had some tests to confirm that this is actually the case.
And while it is possible to pass in something that is not an element and will in some older browsers be mistaken for one, such as:
We are not attempting to remove all doubt here. Instead, we are looking to see if it's close enough to what an element should be, If it's close enough then we'll accept that it as it is. That's duck typing for you