近期今天在写一个“删除字符串中反复字符串”的函数,代码例如以下:

开门见山,重点

string.charAt(index) 取代 string[index]

function removeReapeatStrings1(str) {
var str = trim(str);
var len = str.length;
var once = str; if (len !== 0) {
var fromindex = 1;
var index = -1;
var i = 0; for (index = str.indexOf(str[0], fromindex); (index !== -1) && (2 * index <= len); ) {
// check the characters between 1 and index
for (i = 1; i < index; ++i) {
if (str[i] !== str[index + i]) {
break;
}
}
// if we found a unique string, stop for exit function
if (i === index) {
once = str.slice(0, index);
break;
}
// not found look for a same character as the first character of str
fromindex = index + 1;
index = str.indexOf(str[0], fromindex);
}
} return once;
}
alert(removeReapeatStrings1('北京'));
alert(removeReapeatStrings1('北京北京'));
alert(removeReapeatStrings1('大兴大地大兴大地'));

上面代码在非IE浏览器,执行正常。分别alert 北京,北京,大兴大地,但在IE下,奇迹发生了alert 北京, 北京北京。 大兴大地大兴大地。

왜?どうして?

于是各种调试(我用的是简单直观地alert调试法。不要见笑)

最后发现 str[0] 在万恶的IE下,居然是undefined!?所学知识在脑中不断闪现。似乎记起来在《High
Performance Javascript》最后几章有这种提示:不要用简短表达式取代原生函数(假设有对应的)。天哪?果断所有的string[index],所实用string.charAt(index)取代。

正确兼容IE和非IE代码例如以下:

function removeReapeatStrings1(str) {
var str = trim(str);
var len = str.length;
var once = str; if (len !== 0) {
var fromindex = 1;
var index = -1;
var i = 0; for (index = str.indexOf(str.charAt(0), fromindex); (index !== -1) && (2 * index <= len); ) {
// check the characters between 1 and index
for (i = 1; i < index; ++i) {
if (str.charAt(i) !== str.charAt(index + i)) {
break;
}
}
// if we found a unique string, stop for exit function
if (i === index) {
once = str.slice(0, index);
break;
}
// not found look for a same character as the first character of str
fromindex = index + 1;
index = str.indexOf(str.charAt(0), fromindex);
}
} return once;
}

贴一段文字。from http://stackoverflow.com/questions/5943726/string-charatx-or-stringx

There are two ways to access an individual character in a string. The first is the charAt method:

return 'cat'.charAt(1); // returns "a"

The other way is to treat the string as an array, where each index corresponds to an individual character:

return 'cat'[1]; // returns "a"

The second way (treating the string as an array) is not part of ECMAScript 3; it's a JavaScript and ECMAScript 5 feature (and not supported in all browsers).

In both cases, attempting to set an individual character won't work. Trying to set a character through charAt results in an error, while trying to set a character via indexing does not throw an error, but the string itself is unchanged.

So, as you might have figured out by now, charAt() is
better from a compatibility perspective.

String.charAt() is the standard and it works in all the browsers. In non-IE browsers you may use bracket notation to access characters but IE doesn't support it. (Not sure whether they have implemented that with the latest versions).

If somebody really wants to use bracket notication. It's wise to convert the string to char array in order to make it compatible with any browser.

面对字符串,请谦卑地使用charAt吧。理由

1、正确性

2、兼容性

全篇完结。

WHY IE AGAIN? - string.charAt(x) or string[x]?的更多相关文章

  1. java基础进阶一:String源码和String常量池

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/8046564.html 邮箱:moyi@moyib ...

  2. String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";作用!!!!!

    <%String path = request.getContextPath();String basePath = request.getScheme()+"://"+re ...

  3. String使用机制及string.equals()和==的区别(转)

    http://904582819.blog.163.com/blog/static/11159282020127794456840/ equals方法和==的区别   首先大家知道,String既可以 ...

  4. String的高级用法(String.Format)

    string.Format C#的String.Format的一般地我们可以直接使用string.format()或int.ToString()和float.ToString() 下面是一些Strin ...

  5. .NET中string[]数组和List<string>泛型的相互转换以及Array类的Sort()方法(转)

    从string[]转List<string>: " }; List<string> list = new List<string>(str); 从List ...

  6. convert NameValueCollection/Dictionary<string, object> to JSON string

    public static class WebExtension { public static T Decode<T>(this RequestBase res) { Type type ...

  7. 深入解析字符串的比较方法:“==”操作符;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。

    1:要判断2个字符串变量是否相等,最高效的方法是看它们是否指向相同的内存地址.前面使用RefernceEquals方法来比较.如果2个变量指向的是不同的内存地址,那么就需要逐字符的比较2个字符串的变量 ...

  8. Library string type(2)——关于String的操作

    关于string的定义,请参阅博文http://blog.csdn.net/larry233/article/details/51483827 string的操作 s.empty() //Return ...

  9. String类比较,String类运算比较,String运算

    String类比较,String类运算比较 >>>>>>>>>>>>>>>>>>>&g ...

随机推荐

  1. [Angular 2] @Input Custom public property naming

    TodoList.ts: @Component({ selector: 'todo-list', directives: [TodoItemRenderer], template: ` <ul& ...

  2. 解决蛋疼的阿里云单CPU使用率的问题。

    工作中涉及到阿里云的应用.在性能测试阶段,压测过程中只要一个CPU未使用满,第二个CPU以至于第三个和第四个CPU完全用不到. 后来和阿里云的同事沟通他们现在用的是单队列的网卡,只能靠RPS/RFS这 ...

  3. LDAP 后缀操作

    创建目录服务器实例之后,必须为服务器的目录信息树(Directory Information Tree,DIT)创建一个或多个后缀.DIT由服务器中的所有条目组成,这些条目使用各自的标识名(Disti ...

  4. Facebook登录 AndroidStudio

    简介 主页:https://www.facebook.com/ Android开发者支持:https://developers.facebook.com/docs/android/  应用管理:htt ...

  5. C#中的一些技巧

    VS编辑器的虚线如何设置和取消:使用快捷键Ctrl+E+C VS自带的反编译工具是什么:il dasm

  6. include子页面传递过来的参数传递到后台

    在页面上可以使用 ${param.moduleId}来获取 在判断中也可以使用${param.moduleId == "test" ? "1":"2& ...

  7. Create new Android Virtual Device时不能创建

    在Create new Android Virtual Device时不能创建... 因为之前有重装过系统,ADT和java都没有更换,不知道是不是有哪里的环境(C盘中的配置)出错了... LOG在下 ...

  8. 动态更新UI的方式

    1. TimerTask 和 timer连用: 这里主要是实现倒计时, TimerTask 里面有方法runOnUiThread,在这个方法里面调用timer cancel()停止倒计时,同样更新UI ...

  9. 3种创建、调用JavaScript对象的方法

    hey you guys,两个月没有写技术博客了.作为一名有理想.有抱负的程序员,两个月不写技术博客,真该打.业精于勤,荒于嬉.行成于思,毁于随.勤奋是必不可少的,今后养成一周至少一篇博客的习惯.好了 ...

  10. js 日期控件 可以显示为和历

    日期控件的js <!-- /** * Calendar * @param beginYear 1990 * @param endYear 2010 * @param language 0(zh_ ...