我是否可以通过某种方式定义String[int]
以避免使用String.CharAt(int)
?
答案 0 :(得分:12)
不,没有办法做到这一点。
这是来自其他语言的JavaScript开发人员的常见问题,其中运算符可以为某种类型定义或覆盖。
在C ++中,在operator*
上重载MyType
并不是完全不可能的,最后是一个唯一的星号运算符,用于涉及类型为MyType
的对象的操作。这种做法的可读性可能仍会受到质疑,但是语言仍然提供了这种做法。
在JavaScript中,这根本不可能。您将无法定义允许您使用括号从String
索引字符的方法。
@Lee Kowalkowski 提出了一个好点,即在某种程度上,可能使用括号访问字符,因为括号可用于访问JavaScript Array
的成员。这将涉及创建新的Array
,使用字符串的每个字符作为其成员,然后访问Array
。
这可能是一种令人困惑的方法。 JavaScript的某些实现将通过括号提供对字符串的访问,而有些则不会,因此它不是标准做法。该对象可能会混淆一个字符串,并且由于JavaScript是一种松散类型的语言,因此存在歪曲类型的风险。定义一个数组仅仅是为了使用与语言已经提供的语法不同的语法,只是为了促进这种类型的混淆。这引起了 @Andrew Hedges 的问题:“为什么要对抗这种语言?”..
合法函数重载和多态继承在JavaScript中有有用的模式。这不是一个例子。
除了所有语义之外,运算符仍然没有被覆盖。
旁注:习惯于强类型检查和经典继承惯例的开发人员有时会被JavaScript的C系列语法所困惑。在引擎盖下,它以一种不熟悉的方式工作。最好以干净和明确的方式编写JavaScript,以防止混淆。
答案 1 :(得分:10)
请注意:在任何人其他想要将我的答案投票之前,我回答的问题是:
IE javascript字符串索引器
有什么方法可以定义string [int]以避免使用string.CharAt(int)?“
没有关于特别重写括号,语法或最佳实践的问题,只是问了“某种方式”。 (唯一的另一个答案是“不,没有。”)
嗯,其实有点:
var newArray = oldString.split('');
...现在您可以使用括号表示法访问newArray,因为您刚刚将其转换为数组。
答案 2 :(得分:3)
标准,适用于所有浏览器。
在非IE浏览器中,您可以使用括号表示法来访问如下字符:
"TEST"[1]; // = E
您可以将字符串转换为执行此操作的字符数组:
var myString = "TEST";
var charArray = myString.split(''); // charArray[1] == E
这些都是不鼓励的。没有任何理由不使用charAt()方法,做其他事情也没有任何好处。
答案 3 :(得分:0)
这不是一个答案,只是一个技巧(强烈弃用!)。它特别表明,在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"
请注意,它仅对访问有用。它应该是另一种定义用于以这种方式分配字符串字符的方法。
另请注意,每次修改sting时都必须调用.toChars()方法。