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を呼び出す時点では、はStringではなく、です。要素の値があります。Arraysplice

于 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()関数は文字列を返します。

var myArray = []EDIT:また、JSで配列を作成する好ましい方法は、式を使用しないことだと思いますvar myArray = new Array()

于 2012-09-27T13:08:06.933 に答える