ECMA规范中Array.sort的‘不存在属性值’指什么?
JavaScript数组排序中
undefined属性与不存在属性的区分疑问 在StackOverflow的一篇关于JavaScript数组排序含
undefined值的回答中,引用了ECMA规范15.4.4.11的内容:不存在的属性值始终比undefined属性值大,undefined比其他值大,因此undefined属性值排在排序结果末尾,之后是不存在的属性值。查看最新ECMA 13.0规范的Array.sort备注,内容与2011年版本基本一致。
核心疑问在于:读取对象不存在的属性会得到undefined,那排序时如何区分数组中存在的undefined属性和不存在的数组索引属性?
- 调用
sort时,无论无参数还是传入自定义比较函数,比较函数读取不存在的属性只能拿到undefined,看起来sort并没有办法直接检测属性是否存在。 - 在规范定义
sort的SortIndexedProperties伪代码中,存在HasProperty相关逻辑,猜测这是不是为了处理排序过程中数组被比较函数修改,导致属性被移除的场景? - 另外,ECMA规范中定义“不存在的属性”是不可扩展目标上不存在的自有属性,调用
[[GetOwnProperty]]会返回undefined,这进一步加深了对二者区分逻辑的疑问。
内容的提问来源于stack exchange,提问作者quetzalcoatl
相关产品推荐
相关产品推荐

