// Truthiness assert(true); assert(!false); assert(1); assert(-1); assert(0.5); assert(!0); assert("text"); assert(!""); assert(!null); assert(!undefined); assert([1]); assert(!isnull(1)); assert({}); assert(!!1); assert(!!"a"); assert(!!{}); assert(![]); assert(!(!true)); // And, or and not give bools assert((1 && 2) == true); assert((0 && 2) == false); assert(("a" || "b") == true); assert((0 || "b") == true); assert((0 || 0) == false); assert((null || undefined) == false); assert((true && true) == true); assert((true && false) == false); assert((false || true) == true); assert((false || false) == false); // Precedence: && binds tighter than || assert((true || false && false) == true); assert(((true || false) && false) == false); assert((false && true || true) == true); // Short circuit: the right side never runs when the left decides var calls = 0; function bump() { calls++; return true; } var r = false && bump(); assert(calls == 0); r = true || bump(); assert(calls == 0); r = true && bump(); assert(calls == 1); r = false || bump(); assert(calls == 2); r = (1 > 2) && bump(); assert(calls == 2); // Guarding an operation that would fail var none = []; assert(!(len(none) > 0 && none[0] == 1)); var holder = {value: null}; assert(!(!isnull(holder.value) && holder.value > 1)); // Equality of different types is false, never an error assert(1 != "1"); assert(true != 1); assert(null != 0); assert(null != false); assert(null != ""); assert(null != undefined); assert(null == null); assert(undefined == undefined); assert([] != ""); assert({} != []); // Arrays, structs and functions compare by identity var a = [1]; var b = [1]; var c = a; assert(a != b); assert(a == c); var sa = {k: 1}; var sb = {k: 1}; var sc = sa; assert(sa != sb); assert(sa == sc); assert(bump == bump); assert(bump != isnull);