WHY IE AGAIN? - string.charAt(x) or string[x]?
近期今天在写一个“删除字符串中反复字符串”的函数,代码例如以下:
开门见山,重点
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
charAtmethod: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]?的更多相关文章
- java基础进阶一:String源码和String常量池
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/8046564.html 邮箱:moyi@moyib ...
- String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";作用!!!!!
<%String path = request.getContextPath();String basePath = request.getScheme()+"://"+re ...
- String使用机制及string.equals()和==的区别(转)
http://904582819.blog.163.com/blog/static/11159282020127794456840/ equals方法和==的区别 首先大家知道,String既可以 ...
- String的高级用法(String.Format)
string.Format C#的String.Format的一般地我们可以直接使用string.format()或int.ToString()和float.ToString() 下面是一些Strin ...
- .NET中string[]数组和List<string>泛型的相互转换以及Array类的Sort()方法(转)
从string[]转List<string>: " }; List<string> list = new List<string>(str); 从List ...
- convert NameValueCollection/Dictionary<string, object> to JSON string
public static class WebExtension { public static T Decode<T>(this RequestBase res) { Type type ...
- 深入解析字符串的比较方法:“==”操作符;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。
1:要判断2个字符串变量是否相等,最高效的方法是看它们是否指向相同的内存地址.前面使用RefernceEquals方法来比较.如果2个变量指向的是不同的内存地址,那么就需要逐字符的比较2个字符串的变量 ...
- Library string type(2)——关于String的操作
关于string的定义,请参阅博文http://blog.csdn.net/larry233/article/details/51483827 string的操作 s.empty() //Return ...
- String类比较,String类运算比较,String运算
String类比较,String类运算比较 >>>>>>>>>>>>>>>>>>>&g ...
随机推荐
- [ES6] for..in && for..of
var ary = [ { id: 1, name: "Zhentian" }, { id: 2, name: "Alice" } ]; for..in Pri ...
- Win2 Socket(套接字)相关 API
Socket(套接字) 作者信息 肖进 单位:南京中萃食品有限公司 资讯部 邮箱:xiaoj@njb.swirebev.com 电话:025-58642091 与socket有关的一些函数介绍 1.读 ...
- 一键注册控件的批处理(包含x86 和 x64)
@echo off if "%PROCESSOR_ARCHITECTURE%"=="x86" goto x86 if "%PROCESSOR_ARCH ...
- Qt 域名转成IP
#include <stdio.h>#include <stdlib.h>#include <netdb.h>#include <arpa/inet.h> ...
- ftp nfs samba比较
首先从字面意思上区分一下:1. FTP(文件传输协议)2. NFS(网络文件系统)3. samba 即smb(服务信息块)协议其中FTP 是TCP/IP协议栈所提供的一种子协议,该子协议具体可以实现在 ...
- Tooltip(提示框)组件
一.加载方式 //class加载方式 <a href="http://www.ycku.com" title="这是一个提示信息!" class=&quo ...
- 理解prototype、proto和constructor的三角关系
javascript里的关系又多又乱.作用域链是一种单向的链式关系,还算简单清晰:this机制的调用关系,稍微有些复杂:而关于原型,则是prototype.proto和constructor的三角关系 ...
- swt
http://blog.sina.com.cn/s/blog_557ebb4c0101mgtc.html http://blog.csdn.net/kagoy/article/details/1746 ...
- C# SetupCopyOEMInf安装驱动并返回DestinationInfFileNameComponent
最近用C#写安装usb驱动,必须得调用API SetupCopyOEMInf: BOOL WINAPI SetupCopyOEMInf( _In_ PCTSTR SourceInfFileName, ...
- Python核心编程(第八章)--条件和循环
如果一个复合语句(if子句,while或for循环)的代码仅仅包含一行代码,可以和前面的语句写在同一行上: elif语句(else-if) 条件表达式(三元操作符) X if C else Y 计 ...