JavaScript对象是否有总订单?

时间:2015-02-08 03:58:35

标签: javascript comparison

标题几乎说明了一切。在使用<><=>=运算符时,JavaScript是否保证对象的总订单?

我写了一些代码来检查某些对象的总排序。结果与总排序一致,但这并不能证明:

function thereIsTotalOrder(items){

    var one, other, theThird;

    // warning: n^3 complexity follows

    // If a <= b and b <= a then a = b (antisymmetry);
    for(var i=0; i<items.length; i++){
        for(var j=0; j<items.length; j++){
            one = items[i];
            other = items[j];
            if((one <= other) && (other <= one) && (one != other)){
                return false;
            }
        }
    }

    // If a <= b and b <= c then a <= c (transitivity)
    for(var i=0; i<items.length; i++){
        for(var j=0; j<items.length; j++){
            for(var k=0; k<items.length; k++){
                one = items[i];
                other = items[j];
                theThird = items[k];
                if((one <= other) && (other <= theThird) && !(one <= theThird)) {
                    return false;
                }
            }
        }
    }

    // a <= b or b <= a (totality). 
    for(var i=0; i<items.length; i++){
        for(var j=0; j<items.length; j++){
            one = items[i];
            other = items[j];
            if(!((one <= other) || (other <= one))) {
                return false;
            }
        }
    }

    return true;
}

function a(){};
function b(){};
var c = "foo";
var d = "bar";
var e = "bar";
var f = function(){};
var g = {name : "bananas"};

console.log(thereIsTotalOrder([a, b, c, d, e, f, g])); // prints "true"

1 个答案:

答案 0 :(得分:2)

取决于我们正在考虑的对象。如果我们将注意力集中在numbers的类上,那么是的,订单将是完全的。正如您的示例所示,(至少某些)strings也是如此。但总体看起来并不普遍。

例如,如果您在声明中添加var h = 5;,然后将h添加到thereIsTotalOrder来电,则会获得false。这是因为在h = 5c = 'foo',(hcch)的状态为假(这意味着totality不满意。

正如您正确指出的那样,虽然thereIsTotalOrder返回的错误值没有证明所有对象都是完全有序的,但是{{1}的存在} 确实证明所有对象之间的顺序(如果已定义)不是全部。