JavaScript中直接比较两个数组的实际运算逻辑是什么?
JavaScript数组关系比较的底层逻辑
核心规则:在JavaScript中使用>、<这类关系运算符比较数组等非原始类型时,不会直接判断数组长度,而是先触发隐式类型转换,再对转换后的结果进行比较。
具体转换步骤
当对两个值做>/<比较时,JS会按以下规则处理:
- 首先尝试将两个操作数转换为原始类型:
- 调用操作数的
valueOf()方法,如果返回原始类型值就用这个值,否则走下一步 - 调用操作数的
toString()方法,返回对应的字符串结果
- 调用操作数的
- 如果转换后两边都是字符串,就按字典序逐位比较Unicode编码大小
- 如果转换后存在非字符串的原始类型,就尝试将两边都转为数字后比较
- 任何值和
NaN做大小比较,结果都为false
对应测试用例验证
首先列出测试变量转换后的结果:
a = [1,2,3]→ 转字符串结果为"1,2,3"b = []→ 转字符串结果为""(空字符串)c = [4,5]→ 转字符串结果为"4,5"d = null→ 转数字结果为0
逐个对应测试结果解释:
a > b:实际是"1,2,3" > "",空字符串的字典序小于所有非空字符串,返回trueb > a:实际是"" > "1,2,3",返回falsea > c:实际是"1,2,3"和"4,5"逐位比字典序,第一位字符"1"的Unicode编码小于"4",返回false,整个比较过程完全不会涉及数组长度判断,所以才会出现短数组比长数组大的结果c > a:反过来"4"的编码大于"1",返回truec > b:"4,5"比空字符串大,返回true,反过来b > c返回falsed > a:null转数字为0,数组a转数字时会先转成"1,2,3",再转数字得到NaN,0和NaN比较返回falsea > d:NaN和0比较返回false
内容的提问来源于stack exchange,提问作者Rohit Rane
相关产品推荐
相关产品推荐

