zoukankan      html  css  js  c++  java
  • WHY IE AGAIN?

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

    开门见山,重点

    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、兼容性

    全篇完结。

  • 相关阅读:
    分析java程序的命令总结jps,jstack
    Tomcat配置详解及tomcat的连接数与线程池
    Go入门练习题
    WebSocket的原理,及如何测试websocket是否连接成功
    day3-每天进步一点基础知识-正则练习题
    day2-每天进步一点基础知识
    day1-每天进步一点
    数组有没有length()这个方法? String有没有length()这个方法?
    List, Set, Map是否继承自Collection接口?
    启动一个线程是用run()还是start()?
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5322778.html
Copyright © 2011-2022 走看看