【问题标题】:Changing the behaviour of the typeof operator in Javascript更改 JavaScript 中 typeof 运算符的行为
【发布时间】:2013-06-27 02:49:06
【问题描述】:

我想知道是否有任何方法可以覆盖 typeof 运算符的行为。具体来说,当typeof 运算符在foo = "hi"bar = new String("hi") 上都被调用时,我想返回“字符串”。

typeof bar 返回“object”,但我希望它返回“string”。

我知道这可以通过声明我自己的函数或访问构造函数名称来完成,但我想修改 typeof 运算符的行为。

编辑 - 我正在寻找一些可以在程序开头添加的代码,它可以修改程序其余部分中所有 typeof 运算符的行为。

【问题讨论】:

  • 我 99% 确定您不能覆盖 typeof...只需创建自己的函数
  • 想了很多..只是想确定一下..谢谢!
  • 没问题!不确定是否有人可以为我提供文档支持,但是...
  • 你为什么不做typeof obj.valueOf()?它将为两者返回一个字符串原语。
  • @ian 看起来 typeof 是一个运算符,所以不要认为您可以更改它:ecma-international.org/ecma-262/5.1/#sec-11.4.3

标签: javascript typeof


【解决方案1】:

那是不可能的。本机运算符的行为无法更改。

相关链接:

【讨论】:

    【解决方案2】:

    您无法更改 Javascript 运算符,但您可以使用 instanceof 检查它是字符串还是字符串对象。

    var strObj = new String('im a string')
    var str = 'im a string'
    
    alert(strObj instanceof String); //true
    alert(typeof strObj == 'string'); //false
    alert(str instanceof String); //false
    alert(typeof str == 'string'); //true
    alert(strObj instanceof String || typeof strObj == 'string'); //true
    alert(str instanceof String || typeof str == 'string'); //true
    

    当然,创建自己的函数要简单得多,但如果你想使用原生JS,那就是这样:alert(str instanceof String || typeof str == 'string');

    【讨论】:

    • 同样的事情也发生在我身上。我认为这里有一个触发快乐的孩子。真的不应该允许人们在没有发表评论解释他们为什么对答案投反对票的情况下对没有其他投反对票的答案投反对票。
    • @AaditMShah 完全同意你的看法。国际海事组织,只有 3 种类型的答案:好的,被赞成;像我一样的工作,如果用户好心,就会被点赞;和错误的人应该被否决。如我所见,我们的两个答案都有效...
    • 我认为你的两个答案都没有回答问题。正如我所说的“我正在寻找一些可以在程序开头添加的代码,这些代码可以修改程序其余部分中所有 typeof 运算符的行为。”同样,我也没有对你的投票投反对票。
    • @everconfusedGuy,我了解,但他们实际上清楚地回答了您的问题(至于否)并给出了一点解释(无法更改 javascript 运算符)。此外,我们添加了一个替代方案。我们都知道这个问题得到了正确的回答,我们只是添加了一些真实的信息,我们想知道为什么我们会被否决(因为这是真的,你知道吗?)。无论如何,downvoter 可能永远不会回到这里,所以这是一个失败的原因!
    • 您可以更改 instanceof 运算符的行为(现在,因为这是 2013 年,答案可能是正确的)。
    【解决方案3】:

    typeof 是 JavaScript 中的 operator,所以我很确定你不能。要检测某些内容是否为字符串,您可以使用以下内容:

    var s = "hello";
    console.log(s.substr&&s.charAt&&s.toUpperCase==="".toUpperCase)//true
    s = new String("hello");
    console.log(s.substr&&s.charAt&&s.toUpperCase==="".toUpperCase)//true
    

    【讨论】:

      【解决方案4】:

      不,您不能修改typeof 或任何其他运算符的行为。然而,下一个最佳解决方案是使用Object.prototype.toString,如下所示:

      function typeOf(value) {
          return Object.prototype.toString.call(value).slice(8, -1);
      }
      

      现在您可以按如下方式使用它(参见演示 - http://jsfiddle.net/CMwdL/):

      var foo = "hi";
      var bar = new String("hi");
      
      alert(typeOf(foo)); // String
      alert(typeOf(bar)); // String
      

      这个工作的原因在以下链接中给出:http://bonsaiden.github.io/JavaScript-Garden/#types.typeof

      【讨论】:

      • 如果我可以声明自己的函数(如我的问题中所述),我知道如何解决这个问题。我只是想知道是否可以修改 typeof 运算符本身的行为
      • @naini 不,您不能修改typeof 的行为。但是我的答案是最好的解决方案。我知道这是事实。期间。
      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      相关资源
      最近更新 更多