- ベストアンサー
JavaScript配列の先入れ先出しIEのバグ?
参考資料はO'REILLY初めてのJavaScript(第2版)です。 function pushPop() { //Fifo待ち行列を作成し、pushを使ってアイテムの追加 var fifoArray = new Array(); fifoArray.push("林檎"); fifoArray.push("バナナ"); var ln = fifoArray.push("桜桃"); //長さと配列を表示 document.writeln("長さは" + ln + "で、行列の順番は" + fifoArray + "です。<br />"); document.writeln("<p>"); //shiftを使って配列からアイテムを外す for (var i = 0; i < ln; i++) { document.writeln(fifoArray.shift() + "を取り出します。今の順番は[" + fifoArray + "]です。<br />"); } //長さを表示 document.writeln("長さは" + fifoArray.length + "となりました<br /><br />"); //次に、popとunshiftも同様に行う var fifoNewArray = new Array(); fifoNewArray.unshift("初めての"); fifoNewArray.unshift("Java"); ln = fifoNewArray.unshift("Script"); document.writeln("長さは" + ln + "で配列は[" + fifoNewArray + "]となりました。<br />"); //pop for (i = 0; i < ln; i++) { document.writeln("「" + fifoNewArray.pop() + "」を取り出します。配列は[ " + fifoNewArray + "]となりました。<br />"); } document.writeln("長さは" + fifoNewArray.length + "となりました。"); document.writeln("</p>"); } Google Chromeでは以下のように書籍通りになりました。 /*---------Google Chrome実行結果---------*/ 長さは3で、行列の順番は林檎,バナナ,桜桃です。 林檎を取り出します。今の順番は[バナナ,桜桃]です。 バナナを取り出します。今の順番は[桜桃]です。 桜桃を取り出します。今の順番は[]です。 長さは0となりました 長さは3で配列は[Script,Java,初めての]となりました。 「初めての」を取り出します。配列は[ Script,Java]となりました。 「Java」を取り出します。配列は[ Script]となりました。 「Script」を取り出します。配列は[ ]となりました。 長さは0となりました。 /*---------Google Chrome実行結果(END)---------*/ IEに関しては、以下のように配列の長さは未定義になり pop(メソッド)を使って配列の最後の要素を削除したいのですができません 長くなりましたが回答の方、宜しくお願いします!!! /*---------IE実行結果---------*/ 長さは3で、行列の順番は林檎,バナナ,桜桃です。 林檎を取り出します。今の順番は[バナナ,桜桃]です。 バナナを取り出します。今の順番は[桜桃]です。 桜桃を取り出します。今の順番は[]です。 長さは0となりました 長さはundefinedで配列は[Script,Java,初めての]となりました。 長さは3となりました。 /*---------IE実行結果(END)---------*/
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ざっと検索したところ、unshiftの戻り値について「追加後の要素数」「バージョンによって異る」「不明」などと記述がばらばらでした。ようするに「バージョンによって異る」なのでしょう。 lengthを使うのがよいのでは? fifoNewArray.unshift("Script"); ln = fifoNewArray.length;
その他の回答 (1)
- notnot
- ベストアンサー率47% (4900/10359)
現在JavaScriptの文法の元になっているECMAScriptでは、unshiftの戻り値は追加後の要素数です。 なので、書籍は間違っていません。 一方、Microsoft の IEで使われているのは JavaScriptではなく、MS独自の JScript で、文法などはほとんど同じですが、細かい所で差がありますね。昔のバージョンだとunshiftの戻り値は追加後の配列全体となっています。最近のバージョンだと戻り値の記述無し。 ただ、IE8でやってみると、標準モードだと標準規格との互換性を重視してJavaScriptと同じ結果になるようです。互換モード(IE5以前との互換性を持ったモード)だと、undefinedですね。 標準モードと互換モードは、HTMLの先頭(<html>の前)にDOCTYPE宣言がどのようにあるかで決まります。詳しくは、「IE 標準モード 互換モード」などで検索してください。 簡単には、HTMLの先頭に <!DOCTYPE html> と書いてみてください。HTML5の標準モードになります。 これからHTMLを書くなら、HTML4.01でもHTML5でもいいですが、とにかく標準モードでないと話にならないと思います。
お礼
回答ありがとうございます!! 解決しました。 細かいアドバイスで、初心者である僕には DOCTYPE宣言、「IE 標準モード 互換モード」 忘れがちでまた初心にかえることができました。
お礼
回答ありがとうございます!! 解決しました。 fifoNewArray.unshift("Script"); ln = fifoNewArray.length; 上記のようにコーディングすれば見栄えもすっきりして 気持ちが良いですね!!