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

    全篇完结。

  • 相关阅读:
    设计模式
    设计模式
    设计模式
    设计模式
    【Sublime】许可证 及 相关设置
    【Linux】跳过ubuntu grub2引导,使用Windows引导ubuntu
    【Linux】Windows 7下硬盘安装Ubuntu 14.10图文教程
    【ACM】连连看 hdu1175
    【算法】约瑟夫环 C++源代码
    【Java】配置JAVA的环境变量
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5322778.html
Copyright © 2020-2023  润新知