【问题标题】:EDIT: Why does typeof(0) return boolean instead of number [closed]编辑:为什么 typeof(0) 返回布尔值而不是数字 [关闭]
【发布时间】:2013-02-24 07:19:44
【问题描述】:

原始问题:JavaScript 转换有问题。这是一个例子:

var obj = {
    x: 0,
    y: 1,
    z: 2
}

var b1 = typeof (obj.x),
    b2 = typeof (obj.y),
    b3 = typeof (obj.z);

b1 是"boolean",b2 是"boolean",b3 是"number"。 我需要将变量设置为 0,并且需要 JavaScript 将其解释为数字。我尝试过诸如 b1 = Number("0") 之类的转换,但它没有帮助:(

已编辑:对上面的 q 感到抱歉。这是真的。 b1、b2 和 b3 都返回数字。这是我的实际问题。

var SomeClass = function () {}
SomeClass.prototype = {
    element: {},
    startAt: 0,
    length: 2,
    get: function (prop) {
        if (typeof (prop) === "undefined" || !(typeof (prop) === "string")) {
            return false;
        }
        if (!this[prop]) {
            return false;
        }
        return this[prop];
    }
}

var sc = new SomeClass();
alert(typeof (sc.get("startAt")) + "\n" + typeof (sc.get("length")) + "\n" + typeof (sc.get("element")));

我想将 startAt 设置为一个数字。真的很抱歉!!

【问题讨论】:

  • 我刚刚试了一下......它根本没有说“布尔”。
  • Chrome 不同意您的报告。您使用的是什么浏览器/环境?
  • “b1 是“布尔”,b2 是“布尔”,b3 是“数字”” I beg to differ。根据规范,这三个都应该是"number",并且都在我运行的测试中。我尝试过 Chrome、IE(旧的和新的)、Firefox、Opera...
  • @ZiyaoWei 我怀疑是否存在具有这种行为的javascript引擎。问题一定出在 OP 的代码中。
  • @sweetamylase:是的,这是真的。但这不是 OP 所说的他所看到的。

标签: javascript typeof


【解决方案1】:

我想将 startAt 设置为数字。

SomeClass.prototype.startAt 一个数字 (0)。

如果属性为“falsey”,您的 get 函数会显式返回 false

if(!this[prop]){return false;}

在 JavaScript 中,0""falseundefinednull 都为“假”,因此上述条件为真并导致 get 返回 false .

如果你的目标是在属性不存在的情况下返回false,你可以这样做:

if (!(prop in this)) { return false; }

这将检查该属性是否存在于对象本身它的原型上,我怀疑这是你想要的。但如果你只想检查对象本身而忽略原型上的属性,那就是:

if (!this.hasOwnProperty(prop)) { return false; }

综合起来,如果您的目标是让 get 为对象没有的属性(无论是它自己的,还是通过它的原型)返回 false,那么:

get : function(prop){
          if (typeof prop !== "string" || !(prop in this)) {
            return false;
          }
          return this[prop];
      }

我在那里做了一些事情:

  1. typeof 是一个运算符,而不是一个函数,因此您不要在其操作数周围使用括号(通常)

  2. 由于"undefined"!== "string",因此在检查prop 是否为字符串时无需专门检查。

  3. 我使用!(prop in this) 来查看对象(或其原型)是否具有该属性。

  4. 我使用|| 将返回false 的两个条件组合成一个if 语句。

【讨论】:

  • 你是对的。我现在感觉很愚蠢(我应该会喜欢它:))。谢谢。它有效!
  • @AleksanderFras:不客气,很高兴有帮助!
猜你喜欢
  • 2015-02-19
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2021-09-20
  • 2015-11-23
  • 2013-09-02
相关资源
最近更新 更多