有什么方法可以定义String[int]
避免使用String.CharAt(int)
?
4 回答
不,没有办法做到这一点。
这是从另一种语言转向 JavaScript 的开发人员的常见问题,其中可以为某种类型定义或覆盖运算符。
operator*
在 C++ 中,重载on并不是完全不可能的MyType
,最终会为涉及类型对象的操作提供一个唯一的星号运算符MyType
。这种做法的可读性可能仍会受到质疑,但语言仍然可以做到这一点。
在 JavaScript 中,这根本是不可能的。您将无法定义允许您从String
使用括号中索引字符的方法。
@Lee Kowalkowski提出了一个很好的观点,即在某种程度上,可以使用方括号访问字符,因为方括号可用于访问 JavaScript 的成员Array
。这将涉及创建一个新的Array
,使用字符串的每个字符作为其成员,然后访问Array
.
这可能是一种令人困惑的方法。JavaScript 的一些实现将通过方括号提供对字符串的访问,而另一些则不会,因此这不是标准做法。该对象可能会与字符串混淆,并且由于 JavaScript 是一种松散类型的语言,因此已经存在错误表示类型的风险。仅仅为了使用与该语言已经提供的语法不同的语法而定义一个数组只会助长这种类型的混乱。这引起了@Andrew Hedges的问题:“为什么要对抗语言?”..
JavaScript中有一些有用的模式可用于合法的函数重载和多态继承。这不是任何一个例子。
除了所有的语义,操作符还没有被覆盖。
旁注:习惯于强类型检查和经典继承约定的开发人员有时会对 JavaScript 的 C 系列语法感到困惑。在引擎盖下,它以一种不熟悉的方式工作。最好以简洁明了的方式编写 JavaScript,以防止混淆。
请注意:在其他人想否决我的答案之前,我回答的问题是:
IE javascript 字符串索引器
有什么方法可以定义 string[int] 以避免使用 string.CharAt(int)?”
没有关于具体覆盖括号、语法或最佳实践的问题,这个问题只是要求“某种方式”。(唯一的另一个答案是“不,没有。”)
嗯,实际上有一种:
var newArray = oldString.split('');
...现在您可以使用括号表示法访问 newArray,因为您刚刚将其转换为数组。
它是标准的,适用于所有浏览器。
在非 IE 浏览器中,您可以使用括号表示法来访问如下字符:
"TEST"[1]; // = E
您可以执行以下操作将字符串转换为字符数组:
var myString = "TEST";
var charArray = myString.split(''); // charArray[1] == E
这些将被劝阻。没有任何理由不使用 charAt() 方法,而且做其他任何事情都没有任何好处。
这不是答案,只是一个技巧(强烈反对!)。它特别表明,在 Javascript 中你可以做任何你想做的事情。这只是你的幻想问题。
您可以使用一个事实,即您可以像所有其他人一样为 String Object 设置任何其他属性,因此您可以创建 String.0、String.1、... 属性:
String.prototype.toChars = function() {
for (var i=0; i<this.length; i++) {
this[i+""] = this.charAt(i);
}
};
现在您可以使用以下方法访问单个字符:
var str = "Hello World";
str.toChars();
var i = 1+"";
var c = str[i]; // "e"
请注意,它仅对访问有用。它应该是为以这种方式分配字符串字符而定义的另一种方法。
另请注意,每次修改字符串时都必须调用 .toChars() 方法。