如果使用typeof会产生意外结果

时间:2014-07-17 12:18:31

标签: javascript typeof

以下代码:

var isBlacklisted = (typeof item.is_blacklisted == "undefined" ? false : true);
console.log(typeof item.is_blacklisted == "undefined");
console.log(isBlacklisted);

输出:

false true

无论is_blacklisted是否实际为undefined,在这两种情况下都会产生相同的结果。

现在我也尝试过:

  • var isBlacklisted = typeof item.is_blacklisted == "undefined" ? false : true;
  • var isBlacklisted = (typeof item.is_blacklisted == "undefined" ? false : true);
  • var isBlacklisted = (typeof item.is_blacklisted === "undefined" ? false : true);

并得到完全相同的结果。我似乎无法弄清楚那里有什么问题,任何见解? 请检查出题

Fiddle

3 个答案:

答案 0 :(得分:5)

?之后的结果就是条件为真时的结果。由于您的条件确实如此,因此三元运算符会导致错误。为了使其正常运行,只需在您的三元组上交换truefalse

var isBlacklisted = (typeof item.is_blacklisted == "undefined" ? true : false)

或者甚至不使用三元组,因为你正在使用布尔值:

var isBlacklisted = typeof item.is_blacklisted == "undefined"

修改

我刚检查过您的小提琴,我发现您将属性设置为null与undefined 不同。 typeof null返回object,而不是undefined。 。这可能是您混淆的原因。如果您将其设置为undefined而不是null,则会获得所需的结果。

答案 1 :(得分:1)

我无法理解你的问题。 在你的小提琴中,你将item.is_blacklisted定义为null。由于null与undefined不同,因此表达式的计算结果为false。这是它的工作原理:

var a = (condition ? result if condition is true : result if condition is false);

你的小提琴输出错误和真实,这是正确的。如果我将null更改为undefined,则控制台输出true和false。

答案 2 :(得分:0)

您是否想使用字符串“undefined”或未定义的JavaScript属性来测试比较?

测试变量是否未定义:

var x;

if (x === undefined) {
    txt = "x is undefined";
} else {
    txt = "x is defined";
}

txt的结果将是:

x is undefined

undefined属性表示尚未为变量赋值。

来源:http://www.w3schools.com/jsref/jsref_undefined.asp