【问题标题】:String is not string字符串不是字符串
【发布时间】:2013-02-28 21:45:19
【问题描述】:

将字符串视为字符串有效。然而,将字符串视为字符串的想法被打破了:

var str1:String = "asdf"; 
var str2:String = new String("asdf");
var str3:string = "asdf";
var str4:string = new String("asdf"); // Error 

Try It

还有:

var interfaceBased:String = "123";
var keywordBased:string ="123";
interfaceBased=keywordBased;
keywordBased=interfaceBased; // Error  

Try It

这是一个已知的编译器错误吗?

【问题讨论】:

标签: typescript


【解决方案1】:

String 是 Javascript 类型,而 string 是 Typescript 类型。我不认为这是一个错误,而是一个怪癖。主要是因为绝对没有理由在字符串文字上使用 String() 构造函数。

请看这里:Typescript: difference between String and string

【讨论】:

    【解决方案2】:

    这源于 JavaScript 的一个怪癖:有原始字符串和对象字符串。原始字符串是您日常使用的字符串:

    typeof "Hi! I'm a string!"  // => "string"
    

    然而,任何时候你使用new,你都创建了一个对象而不是一个原语:

    typeof new String("Hi! I'm a string!")  // => "object"
    

    每当您访问属性时,JavaScript 也会隐式地从原始字符串中创建一个对象字符串,因为只有对象才能拥有属性:

    var s = "Hi! I'm a string!";
    s.property = 6;  // s implicitly coerced to object string, property added
    console.log(s.property);  // => undefined
    // property was added to the object string, but then the object string was
    // discarded as s still contained the primitive string. then s was coerced again
    // and the property was missing as it was only added to an object whose reference
    // was immediately dropped.
    

    你几乎从不想要一个对象字符串,因为它的怪癖(例如,一个空的对象字符串是真实的),所以你几乎总是想要String,而不是使用new StringString 没有 new 甚至可以将对象字符串转换回原始字符串:

    typeof String(new String("Hi! I'm a string!"))  // => "string"
    

    我不知道这个问题是否出现在 TypeScript 中,但是原始/对象的区别,尤其是真实性问题在 Boolean 中变得非常奇怪。例如:

    var condition = new Boolean(false);
    if(condition) {  // always true; objects are always truthy
        alert("The world is ending!");
    }
    

    简而言之,这是因为对象/原始的区别。您几乎总是需要可以选择的基元。

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 2018-09-15
      • 2012-03-26
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多