JavaScript中没有
char
。您可以使用1个字符的字符串。如果您想要使用整数来节省内存,每当需要时都必须调用
String.fromCharCode
,这将创建一个
String
,因此我很难相信您会从存储整数中获得任何好处。
下面是一个测试,我使用一个int代表
'a'
,并使用字符串和int创建了一个更长的字符串
http://jsperf.com/using-ints-as-chars
设置代码
var x = "a";
var y = 97;
从整数创建(383次/秒)
var str = '';
for (var i = 0; i < 100000; i++) {
str += String.fromCharCode(y);
}
创建 1 个字符字符串(592 次/秒)更快
var str = '';
for (var i = 0; i < 100000; i++) {
str += x;
}
如果您正在尝试在JS中模拟枚举,则可以使用字符串的一种简单方式,这样更容易调试。使用指针比较字符串,因此没有性能惩罚。
function Enum(key1, key2, ...) {
for (var i = 0; i < arguments.length;; i++) {
this[arguments[i]] = arguments[i];
}
}
var Planets = new Enum('Earth', 'Mars', 'Venus');
if (someValue == Planets.Earth) {
}
理想情况下,您无法将枚举与字符串进行测试。如果您有一个字符串并且想要与枚举进行比较,则需要先将其转换为枚举(以确保它是有效的字符串之一)。以下是更安全的枚举。
function EnumInstance(value) {
this.getValue = function() {
return value;
}
}
function Enum(enumValues) {
for (var i = 0; i < arguments.length; i++) {
this[arguments[i]] = new EnumInstance(arguments[i]);
}
}
Enum.prototype.fromString = function(enumValue) {
if ( !this[enumValue] ) {
throw new Error('Invalid enum value: ' + enumValue);
}
return this[enumValue];
};
var Planets = new Enum('Earth', 'Venus', 'Mars');
console.log("Are Planets.Earth and 'Earth' equal?", Planets.Earth == 'Earth');
console.log("Are Planets.Earth and Planets.fromString('Earth') equal?",
Planets.Earth == Planets.fromString('Earth'));
try {
var enumValue = Planets.fromString('Pluto')
} catch(e) {
console.log(e);
}
console.log("Are Planets.Earth and 'Earth' equal?", Planets.Earth == 'Earth');
console.log("Are Planets.Earth an 'Earth' equal?",
Planets.Earth == Planets.fromString('Earth'));
更新
如https://stackoverflow.com/users/1945651/jlrishe所述,字符串比较不使用地址比较,像常规的Object
一样,因此等式测试将扫描字符串。因此,微小的优化是如果您要经常测试字符串的相等性,则使用数字而不是字符串。请注意,如果您使用我上面展示的“几乎类型安全”的枚举,则相等性检查仅针对指针。请参见http://jsperf.com/string-comparison-versus-number-comparison和Is JavaScript string comparison just as fast as number comparison?
char
太多,以至于将它们全部视为字符串可能会对内存使用/性能产生负面影响,或者如果您的代码基于它们的数字值进行大量处理,则可能有正当理由将它们存储为数字。 - JLRishe