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

    全篇完结。

  • 相关阅读:
    动态规划:POJ2576-Tug of War(二维费用的背包问题)
    动态规划:HDU3496-Watch The Movie(二维费用的背包问题)
    动态规划:HDU1712-ACboy needs your help(分组背包问题)
    水题:HDU1303-Doubles
    动态规划:HDU2844-Coins(多重背包的二进制优化)
    动态规划:HDU1059-Dividing(多重背包问题的二进制优化)
    动态规划:HDU1224-Free DIY Tour
    动态规划:HDU1864-最大报销额(处理带小数的dp问题)
    红黑树
    二叉树
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5322778.html
Copyright © 2011-2022 走看看