String.prototype导致循环提前退出

时间:2014-02-21 02:23:11

标签: javascript prototype

我已经定义了一个名为clean

的String.prototype方法
String.prototype.clean = function() {       
        clean = new Array();
        tokens = [
            ['&', '&'],
            ['"', '"'],
            ["'", '''],
            ['<', '&lt;'],
            ['>', '&gt;']
        ];
        for(i = 0; i < this.length; i++) {      
            s = this[i];

            for(a = 0; a < tokens.length; a++) {
                if(tokens[a][0] == s) {
                    s = tokens[a][1];
                    break;
                }
            }

            clean.push(s);          

        }

        str =  clean.join("");
        return str;
    }

在循环中调用时似乎有效,如下所示:

str = ["<script>", "<", ">"];
    for(i = 0; i < 3; i++) {
        console.log(str[i].clean());
    }

第一次调用clean()后,for循环中断,控制台如下所示:

[2/20/2014 8:19:26 PM] &lt;script&gt; 

为什么会发生这种情况,我在这里做错了什么?

输出除外:

&lt;script&gt;
&lt;
&gt;

2 个答案:

答案 0 :(得分:3)

这是一种非常快速的方法:

var __entityMap = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    '"': '&quot;',
    "'": '&#39;',
    "/": '&#x2F;'
};

String.prototype.toHtml = function() {
    return String(this).replace(/[&<>"'\/]/g, function (s) {  
        return __entityMap[s];
    });
}

我还没有找到更快的方法......

答案 1 :(得分:3)

你有:

str = ["<script>", "<", ">"];
for(i = 0; i < 3; i++) {
    console.log(str[i].clean());
}

在执行时创建全局变量 i 。然后你有:

String.prototype.clean = function() {     
    ...
    for(i = 0; i < this.length; i++) {      
    ...
}

修改全局 i 的值。始终通过使用 var 声明将变量保存在适当的上下文中,例如:

for (var i = 0; ...; ...) {