【问题标题】:Behavior of the typeof keywordtypeof 关键字的行为
【发布时间】:2016-04-14 22:48:53
【问题描述】:

了解typeof 关键字并需要一些说明:

在进行故障排除时,我将此代码输出到控制台:

console.log(typeof object.prop[someNum - 1]);

(在这种情况下为sumNum === 0

控制台打印出undefined,这是我的预期,因为prop[] 数组中的索引位置[someNum - 1] 不存在(所以我想)。 但是,当我做这样的事情时:

if(typeof object.prop[someNum - 1])
    //some code
 else
    //other code

它评估为 true 并运行 //some code 但是当我这样做时:

if(object.prop[someNum - 1])
    //some code
 else
    //other code

它评估为假并运行//other code

我的印象是 undefined 被认为是 falsy value 并且会在 if statement 中评估为 false。为什么if(typeof object.prop[someNum - 1]) 语句评估为真?也有人能指出我在哪里可以了解更多关于js 中的负索引数组的正确方向吗?它们在多种语言(如c#, c++, java, & php)中的处理方式是否相同。我认为在评估负的array 索引号时,它会是underfined 或抛出错误。

【问题讨论】:

  • undefined"undefined" 不同。
  • 既然你正在学习 typeof 关键字,这里是 MDN docs (以防万一)。
  • 如果您正在检查该属性是否存在,您实际上并不需要typeof。你可以做(someNum-1) in object.prop,或者如果你担心继承的属性,object.prop.hasOwnProperty(someNum-1)。使用typeof 不会区分具有undefined 值的现有属性和不存在的属性。
  • @squint 我明白了。你能提供一个jsfiddle或短代码sn-p吗?不知道你写的方式(someNum - 1)是不是数组的索引

标签: javascript typeof


【解决方案1】:

typeof 总是返回一个字符串。

因此,你写的是if ("undefined")

由于非空字符串是真实的,所以 if 会运行。

【讨论】:

    【解决方案2】:

    正如 SLaks 所说,您正在评估字符串“未定义”是否为真,它是。

    如果您想查看一个对象是否有一个名为“someNum - 1”的属性,那么您可以使用 in 运算符:

    if ((someNum - 1) in object.prop)
    

    如果 object.prop 在其自身或其[[Prototype]] 链的任何位置具有这样的属性,则返回 true,或者:

    if (object.prop.hasOwnProperty(someNum - 1))
    

    直接在对象上测试属性。

    【讨论】:

    • 有一个对象数组所以(someNum - 1) was the array index. with that said what is .prop`在object.prop指的是?
    • 它使用in 运算符来测试属性是否存在。 (sumNum - 1) 周围的括号表示“首先评估此表达式,然后在外部表达式中使用结果”。 ;-)
    • 明白了。非常感谢。你帮了大忙
    • 值得注意的是,任何设置为undefined 的属性都将包含在in 运算符中。
    【解决方案3】:

    正如其他答案所指出的,typeof 返回一个字符串,并且它永远是真实的,因为它永远不会返回一个空字符串。如果要测试类型是否为undefined,则需要比较字符串。

    if (typeof object.prop[someNum - 1] == "undefined") {
        // some code
    } else {
        // some code
    }
    

    您也可以只测试该值是否为undefined

    if (object.prop[someNum - 1] === undefined) {
        // some code
    } else { 
        // some code
    }
    

    确保您使用=== 而不是==,因此如果object[someNum - 1]null,它将不会报告匹配项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 2019-06-17
      • 2010-11-27
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多