These three methods determine the type of descriptor according to the specification. In these examples D should be a Property Descriptor.
IsAccessorDescriptor(D) only returns false when D is undefined or when both D.[[Get]] and D.[[Set]] are absent.
IsDataDescriptor(D) only returns false when D is undefined or when both D.[[Value]] and D.[[Writable]] are absent.
IsGenericDescriptor(D) only returns true when both IsAccessorDescriptor(D) and IsDataDescriptor(D) return false.