【问题标题】:How to get data type from string javascript如何从字符串javascript获取数据类型
【发布时间】:2015-01-24 03:51:02
【问题描述】:

我有几个字符串

strings = [
    "String",
    "Object",
    "Boolean"
]

我想用它们来声明新对象

for(var i = 0; i < strings.length; i++){
    var x = new strings[i];
}

但是我得到了这个错误:

TypeError: string is not a function
  at Object.<anonymous> (/Users/path/code.js)
  at Object.<anonymous> (/Users/path/code.js)
  at Module._compile (module.js:456:26)

如何将字符串视为其基础类型?


旁白:

我知道我可以做类似的事情

type_map = {
    String: String,
    Object: Object,
    Boolean: Boolean
}

然后去

for(var i = 0; i < strings.length; i++){
    var x = new type_map[strings[i]];
}

这行得通,但如果它存在的话,我正在寻找更优雅的东西。

【问题讨论】:

  • "String" 是文字,不能实例化文字。
  • 对,也许我的措辞不正确,但我想知道是否有某种方法可以从字符串字符串中获取文字
  • Create object from string的可能重复
  • "new" 只能用于函数,不能用于字符串。所有全局变量都是"window"的元素,所以window["String"]对应全局函数String。

标签: javascript string types


【解决方案1】:

显而易见的有什么问题?

var i, x, constructors = [
    String,
    Object,
    Boolean
];

for(i = 0; i < constructors.length; i++){
    x = new constructors[i];
}

请记住,JS 中的任何内容都是对象(包括“类名”),并且几乎可以根据需要使用。

【讨论】:

    【解决方案2】:

    这些类的构造函数是全局对象的属性。

    例如,在浏览器中,您可以这样做

    console.log(window['String'] === String); // true
    var str = new window[strings[0]]();
    console.log(str); // ""
    

    【讨论】:

      【解决方案3】:

      找到了使用eval function 的好方法

      strings = [
          "String",
          "Object",
          "Boolean"
      ]
      
      for(var i = 0; i < strings.length; i++){
          var x = new (eval(strings[i]));
      }
      

      总结一下eval("String") === [Function: String]

      【讨论】:

      • 实际上,我认为您找到了一种错误的方法。在去eval之前请考虑其他选项,因为你会被坏习惯宠坏。
      • @BatScream 是的,技术上没有问题。 eval 将只计算字符串并返回对象中包含的函数,该函数具有字符串指定的名称。然后将该函数作为构造函数应用于new 创建的上下文。
      • @AlinPurcaru -感谢您的解释。得到了清晰的画面。虽然我认为那里存在语法错误。 new (eval(strings[i]))
      • 使用 Alin 的解决方案比使用 eval() 好得多,因为 eval() 很慢,并且通常会回避,除非没有其他解决方案,但通常会有其他解决方案。
      • @BatScream 似乎是这样。新运算符的实现与我想象的有点不同,但可以通过一些自定义运算符优先级来规避错误:new (eval(strings[i]))。免责声明:此评论仅用于运动,请勿在软件开发中使用此代码。
      猜你喜欢
      • 1970-01-01
      • 2021-07-02
      • 2014-01-01
      • 1970-01-01
      • 2011-01-25
      • 2020-12-24
      • 2021-05-24
      • 2022-01-10
      相关资源
      最近更新 更多