2

我想删除数组元素,但在使用拼接时出错,

我使用 myAra 作为全局变量的以下函数,但在控制台中,它给了我一个错误,TypeError: myAra.splice is not a function

var myAra = Array();
function charCounts(e,textAreaId)
{
    myAra = $("#"+textAreaId).val();
    var countNewLines = stringOccurrences(myAra, "\n");


    if(myAra.length>75)
    {
        for (var i = 75; i >myAra.length; i++) 
        {
            myAra.splice(i, 1);

        }

        $("#"+textAreaId).val(myAra);
    }
}
4

5 回答 5

3

myAra是 a String,而不是a Array,当你打电话时splice。它具有元素的值。

于 2012-09-27T13:03:03.720 回答
1

这是一个很好的例子,说明了为什么全局变量是EVIL,确定你将变量声明为数组(很糟糕):(var myAra = Array()我将在最后解释这有什么不好),但稍后:

myAra = $("#"+textAreaId).val();//returns a string, variable is now a string, not an array

您已将字符串重新分配给数组,因此该变量现在引用字符串常量,并且不能用作数组(不安全,至少在 X 浏览器中)。

Array()不好,为什么?好吧,对于初学者来说,您正在调用构造函数,但您没有使用new关键字。数组不是什么大问题(它同样会返回一个新实例),但是当您开始定义自己的对象和构造函数时,您会发现自己在全局变量中处于劣势。
另外,假设您想要一个数组并将第一个元素初始化为 int: var anArray = new Array(2);,您将不会得到如下所示的数组:anArray[0] === 2,您将得到anArray === [undefined,undefined]. 将其与var anArray('2')--> ['2'] 进行比较。鉴于 JS 是松散类型的,并且您在初始化数组时经常会使用变量,因此很难判断您是否将数字字符串或数字传递给构造函数。
初始化数组的最佳方法是使用文字符号:[2,3,4],作为额外的好处,它也需要更少的打字

于 2012-09-27T13:06:12.573 回答
1

替换以下内容:

if(myAra.length>75)
{
    for (var i = 75; i >myAra.length; i++) 
    {
        myAra.splice(i, 1);

    }

    $("#"+textAreaId).val(myAra);
}

使用以下代码:

if(myAra.length>75)
{
    var moreNum = myAra.length - 75;
    myAra.splice(75, moreNum ); // remove all items after the 75th item

    $("#"+textAreaId).val(myAra);
}

注意-splice更改实际数组,这就是循环失败的原因。希望能帮助到你。

于 2012-09-27T13:25:07.657 回答
0

您正在将字符串值直接分配给 myAra,以便它将其转换为字符串 ..typeOf myAra。使用 myAra[0]=$("#"+textAreaId).val();...因为 javascript 是一种松散耦合的语言

于 2012-09-27T13:06:04.293 回答
0

在您使用的第一行中var myAra = Array(),但 jQueryval()函数返回一个字符串。

编辑:另外我认为在 JS 中创建数组的首选方法是var myArray = [], 而不是使用var myArray = new Array()表达式。

于 2012-09-27T13:08:06.933 回答