在javascript中,我可以覆盖括号来访问字符串中的字符吗?

时间:2008-10-31 21:39:51

标签: javascript syntax operators

我是否可以通过某种方式定义String[int]以避免使用String.CharAt(int)

4 个答案:

答案 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)

使用String.charAt()

标准适用于所有浏览器

在非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()方法。