字符串和字符串的区别是什么?

有人知道TypeScript中Stringstring的区别吗?我假设它们应该是一样的,对吗?

var a: String = "test";
var b: string = "another test";
a = b;
b = a; // this gives a compiler error!

当前版本的编译器说:

Type 'String' is not assignable to type 'string'.
'string' is a primitive, but 'String' is a wrapper object.
Prefer using 'string' when possible.

那是虫子吗?

184282 次浏览

下面是一个例子,它显示了两者的区别,这将有助于解释。

var s1 = new String("Avoid newing things where possible");
var s2 = "A string, in TypeScript of type 'string'";
var s3: string;

String是JavaScript字符串类型,你可以使用它来创建新的字符串。没有人这样做,因为在JavaScript中文字被认为更好,所以上面例子中的s2创建了一个新字符串,没有使用new关键字,也没有显式使用String对象。

string是TypeScript的字符串类型,你可以用它来输入变量、参数和返回值。

额外的笔记……

目前(2013年2月)s1s2都是有效的JavaScript。s3是有效的TypeScript。

String的使用。你可能永远不需要使用它,字符串字面量被普遍接受为初始化字符串的正确方式。在JavaScript中,使用对象字面值和数组字面值也被认为更好:

var arr = []; // not var arr = new Array();
var obj = {}; // not var obj = new Object();

如果你真的很喜欢字符串,你可以在TypeScript中以以下两种方式之一使用它……

var str: String = new String("Hello world"); // Uses the JavaScript String object
var str: string = String("Hello World"); // Uses the TypeScript string type

这两种类型在JavaScript和TypeScript中是截然不同的——TypeScript只是提供了注释和检查类型的语法。

String指的是原型链中有String.prototype的对象实例。你可以通过多种方式获得这样的实例,例如new String('foo')Object('foo')。你可以用instanceof操作符测试String类型的实例,例如myString instanceof String

string是JavaScript的基本类型之一,而string值主要是由字面量创建的,例如'foo'"bar",并作为各种函数和操作符的结果类型。你可以使用typeof myString === 'string'测试string类型。

绝大多数情况下,string是你应该使用的类型——几乎所有接受或返回字符串的API接口都会使用它。当将所有JS基元类型作为对象使用时,例如访问属性或调用方法时,将用它们对应的对象类型包装(盒装)。由于String目前在TypeScript的核心库中声明为接口而不是类,结构类型意味着string被认为是String的子类型,这就是为什么你的第一行通过编译类型检查。

在JavaScript中,字符串既可以是字符串基本类型,也可以是字符串对象。下面的代码显示了两者的区别:

var a: string = 'test'; // string literal
var b: String = new String('another test'); // string wrapper object


console.log(typeof a); // string
console.log(typeof b); // object

你的错误:

类型“字符串”不能赋值给类型“字符串”。'string'是a 但'String'是一个包装器对象。

被TS编译器抛出,因为您试图将类型string赋值给字符串对象类型(通过new关键字创建)。编译器告诉你只能对字符串基元类型使用string类型,不能使用此类型描述字符串对象类型。

TypeScript: String vs string

String类型的实参不能赋值给String类型的形参。

'string'是一个原语,但'string'是一个包装器对象。

尽可能使用'string'。

演示

字符串对象

// error
class SVGStorageUtils {
store: object;
constructor(store: object) {
this.store = store;
}
setData(key: String = ``, data: object) {
sessionStorage.setItem(key, JSON.stringify(data));
}
getData(key: String = ``) {
const obj = JSON.parse(sessionStorage.getItem(key));
}
}


字符串的原始

// ok
class SVGStorageUtils {
store: object;
constructor(store: object) {
this.store = store;
}
setData(key: string = ``, data: object) {
sessionStorage.setItem(key, JSON.stringify(data));
}
getData(key: string = ``) {
const obj = JSON.parse(sessionStorage.getItem(key));
}
}


enter image description here

对于快速阅读者:

从未使用类型NumberStringBooleanSymbol,或Object这些类型指的是非原始的盒装对象,在JavaScript代码中几乎从未适当使用。(强调我的)

< p >来源: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html < / p >

简单回答:

  • string =比;是一个类型。例如console.log(typeof 'foo') //字符串
  • String =比;是一个具有一些创建和操作字符串的方法的对象。

根据我个人的推荐

优先使用string而不是String

  1. 字符串= =比;基本数据类型。
  2. 字符串= =比;销售。它是一个对象,可以访问String类的方法和属性

JavaScript有7个基本类型strings, numbers, booleans, null, undefined, symbol, and bigint,前5个从一开始就存在,符号原语是在ES2015中添加的,bigint正在最终确定的过程中。

原语与对象的区别在于它是不可变的并且没有方法。你可能会反对字符串有方法

 console.log('primitive'.charAt(3)) // output is "m"

虽然字符串原语没有方法,但JavaScript也定义了string对象类型。JavaScript 自由转换在这些类型之间。当您在字符串原语上访问charAt等方法时,JavaScript将其包装在string对象中,调用该方法,然后丢弃该对象。

TypeScript通过为原语及其对象包装器提供不同的类型来模拟这种区别:

  • 字符串和字符串
  • 数目和数目
  • 布尔和布尔
  • 符号与符号
  • bigint和bigint

如果你使用String而不是string,通常事情会正常工作,除了在某些情况下,编译器会引发一个错误 enter image description here < / p >

如你所见,string可赋值给String String 不能分配给 string

按照错误消息中的建议使用字符串。TypeScript附带的所有类型声明都使用它,几乎所有其他库的类型也是如此。