I'd prefer this kind of semantics for an Object.isEmpty - it's simple and everyone interprets it as that low-level primitive. It also fits in with the rest:
Object.keys(new Map([["a", 1], ["b", 2]]))returns[], not["a", "b"].Object.values(new Map([["a", 1], ["b", 2]]))returns[], not[1, 2].Object.entries(new Map([["a", 1], ["b", 2]]))returns[], not[["a", 1], ["b", 2]].
Better might be just Object.size(o), which returns effectively Object.keys(o).length. I've personally have had a couple cases where the length was useful independent of it, and it's easy enough to check Object.size(o) === 0 or !Object.size(o) for Object.isEmpty(o). And in nearly all runtimes, this is a very cheap O(1) access for non-proxies, cheaper than even property access.