• ベストアンサー

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)---------*/

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

ざっと検索したところ、unshiftの戻り値について「追加後の要素数」「バージョンによって異る」「不明」などと記述がばらばらでした。ようするに「バージョンによって異る」なのでしょう。 lengthを使うのがよいのでは? fifoNewArray.unshift("Script"); ln = fifoNewArray.length;

hironoobu
質問者

お礼

回答ありがとうございます!! 解決しました。 fifoNewArray.unshift("Script"); ln = fifoNewArray.length; 上記のようにコーディングすれば見栄えもすっきりして 気持ちが良いですね!!

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

現在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でもいいですが、とにかく標準モードでないと話にならないと思います。

hironoobu
質問者

お礼

回答ありがとうございます!! 解決しました。 細かいアドバイスで、初心者である僕には DOCTYPE宣言、「IE 標準モード 互換モード」 忘れがちでまた初心にかえることができました。

関連するQ&A

  • javascript 二つの配列を比較し等しいもの

    すべてをdocument.writeする (x番目とi番目が等しいです。) タイトルが長くなってしまいました。 ひとまず、こんな形で実現できたのですが、もっとスマートな形でできないでしょうか・・? a=[2,9,8,4,3,5,7]//a配列 b=[9,2,4,5,7,3,8]//b配列 for(i=0;i<a.length;i++){ if(a[0]==b[i]){ document.write("a[0]と"+i+"が等しい<br/>"); } if(a[1]==b[i]){ document.write("a[1]と"+i+"が等しい<br/>"); } if(a[2]==b[i]){ document.write("a[2]と"+i+"が等しい<br/>"); } if(a[3]==b[i]){ document.write("a[3]と"+i+"が等しい<br/>"); } if(a[4]==b[i]){ document.write("a[4]と"+i+"が等しい<br/>"); } ~~~以下同じ略 } ※a配列b配列は同じ値をもっていますが毎回シャッフルされます。

  • JavaScript値呼び出しと参照呼出し

    参考書籍はO'REILLY初めてのJavaScript第2版です <script type="text/javascript"> //<![CDATA[ function alterArgs(strLiteral, aryObject) { //渡された文字列の値を変更 strLiteral = '変更しました'; aryObject.push("three"); } function testParams() { var str = "オリジナルの文字列"; var ary = new Array("one","two"); document.writeln("<h3>呼び出し前の値</h3>"); document.writeln("strの値:" + str + "<br />" ); document.writeln("配列の各要素の値:" + ary + "<br />"); alterArgs(str,ary); document.writeln("<h3>呼び出し後の値</h3>"); document.writeln("strの値:" + str + "<br />"); document.writeln("配列の各要素の値:" + ary + "<br />"); } //]]> </script> /*----------実行結果-----------*/ 呼び出し前の値 strの値:オリジナルの文字列 配列の各要素の値:one,two 呼び出し後の値 strの値:オリジナルの文字列 配列の各要素の値:one,two,three /*----------以下、疑問です。----------*/ alterArgs(str,ary);の第1引数であるstrは「基本データ型(値呼び出し)」であるため 呼び出された側では、呼び出した側で使われていた変数の内容を変更することができません。 以下、基本データ型の引数に変更を加えたい場合は、 その変更後の値を戻り値として戻して変数に代入すれば、 呼び出し側でも変更を反映できるのですよね。 自分なりに幾度、打ち込んでみたものの以下のように 実行結果をかえることができません。 長くなりましたが回答の方、宜しくお願いします!!! /*----------実行結果 ----------*/ 呼び出し前の値 strの値:オリジナルの文字列 配列の各要素の値:one,two 呼び出し後の値 strの値:変更した 配列の各要素の値:one,two,three

  • VBscriptの配列変数をJavascriptで使うには

    下記ソースでVBscriptの配列変数をJavascriptで使うにはどうしたらいいでしょうか。 vbscriptで配列stat2(i)に値セット後javascriptで使いたい <script type="text/javascript"> <!-- //===== function test(){ var i; for (i=0;i<9;i++){ document.form1.text1[i].value=<%=stat2(i)%>; <-これだとエラー } } //====== //--> </script>

  • 【JavaScript配列のソート】2つのキーで

    JavaScriptのsort()を使用して次の並べ替えをしたいと思っています。 key1, key2, data, data 5/5 , 5/4 , リンゴ, 110 5/3 , 5/6 , バナナ, 130 5/7 , 5/2 , ミカン, 110 5/3 , 5/2 , イチゴ, 150 この配列をkey1を昇順でかつkey2も昇順とし並び変えたいのです。 key1, key2, data, data 5/3 , 5/2 , イチゴ, 150 5/3 , 5/6 , バナナ, 130 5/5 , 5/4 , リンゴ, 110 5/7 , 5/2 , ミカン, 110 str.sort(); これだとkey1のみでソートされてしまいますので、条件を複数指定したいのですがいい方法はないでしょうか? 結果はweb(テーブル等)に表示するのではなく、配列変数のままで獲得したいと思っています。 google apps のスプレッドシート内でスクリプトとして使用したいと思っています。 かなり調べたのですがどれも1項目(key1)のみの検索しかヒットしませんでした。 よろしくお願いします。

  • javascriptの配列の検索について

    テキストエリアに入力された文章を、改行ごとで配列に格納 その後、特定の文字を検索し、特定の文字がある配列を見つけて 見つかったものに処理をかけたいです 現在、配列に格納するところまでできているのですが、その後の文字を検索するところで躓いてます。 配列をmatchで検索すると一番最初の配列にのみ処理をかけてしまっているのが現状です。 どなたかお知恵を貸していただけないでしょうか よろしくお願いします。 例 入力された文字列:                明日の時刻のお知らせ                開始時間:10時30分                受付開始は10時00分からとなっております。                遅れないようにお願いいたします。 検索する文字:  時間     ↓ 検索ワードを含む配列:開始時間:10:30     ↓これに処理かけて 出力:10:30 検索ワードが見つからない場合 出力:10:00 10:30 という形にしたいです。 プログラムは下記のように組みました。 //////////////////////////// <html> <head> <script language="JavaScript"> function tester(){ var str= document.getElementById('input_text').value; var time; var alltime; abc = str.split(/\r\n|\r|\n/); var g = ["開始時間"]; for (var i=0;i<abc.length;i++){ if(abc[i].match(g)){ time = abc[i].match(/\d{1,2}:\d{1,2}/g); if(time2 !=null){ alert(time); document.write(time); break; } }else{ alltime = str.match(/\d{1,2}:\d{1,2}/g); if(alltime !=null){ document.write(alltime); } }break; } } </script> </head> <body> <textarea id=input_text rows="10" cols="45"> </textarea><br> <input type=button onclick="tester()" value="start"> </body> </html>

  • JavaScript 変数をメソッドに代入する方法

    <SCRIPT LANGAGE="JavaScript"> var prop=new Array("title","lastModified","bgColor","fgColor","alinkColor","linkColor","vlinkColor"); for(i=0; i<7; i++){ document.write(document.prop[i],"<BR>"); } </SCRIPT> お世話になります。 上記ソースが動きません。 オブジェクトのメソッドに配列を代入することはできるのでしょうか?

  • PHP配列をJavaScriptに渡したい(再)

    済みません。まだ成功しておりませんので、引き続きご教授をお願いいたします。 4万行になるGermJ.txt というファイルを4000行に削ると、成功しましたが、それ以上の行数だと画面が真っ白になったり、ハング状態になりました。 もう後一歩なのですが、どうか、よろしくご指導ください。 function getArray() { <?php $file = fopen("GermJ.txt","r"); $phparray = file('GermJ.txt'); fclose($file); $max = count($phparray); for ($i=0; $i<$max; $i++) { echo 'jsArray[' . ($i) . ']="' . ereg_replace("\r\n","",addslashes($phparray[$i])) . '";' . "\n"; } ?> for(i=0;i<jsArray.length;i++) { document.writeln(jsArray[i]+"<br>\n"); } }

    • ベストアンサー
    • PHP
  • 配列変数について

    とても基本的なことなのですが <script l anguage = "JavaScript"> week = new Array("日", "月", "火", "水", "木", "金", "土"); hizuke = new Date( ); day = hizuke.getDay( ); document.write("今日の日付 = ", hizuke.getMonth( ) + 1, "月 ", hizuke.getDate( ), "日 ", week[ day ], "曜日" ); </script> このような配列変数ならば、new Date( )によって呼び出された日付に対応して week[ day ]のところが日付に変わることはわかります。 <head> <title> Java </title> <script language = "JavaScript"> function calc( ) { point = new Array( ); point[0] = ei.value * 1; point[1] = su.value * 1 ; point[2] = ko.value * 1; sum = 0; for( i = 0 ; i < 3 ; i ++) { sum += point[i ]; } goukei .val ue = sum; ave = sum / 3; heikin.value = ave; } </script> </head> <body> <hr> <br> 英語 <input type = "text" size = "8" name = "ei "> <br> <br> 数学 <input type = "text" size = "8" name = "su"> <br> <br> 国語 <input type = "text" size = "8" name = "ko"> <br> <br> <hr> <br> <input type = "button" value = "計算" onclick = "calc( )"> <br> <br>3教科合計 <input type = "text" size = "8" name = "goukei "> 点 : 平均点 <input type = "text" size = "8" name = "heikin"> <br> <br> <hr> </body> </html > このような平均点を求めるプログラムでも point = new Array( ); point[0] = ei.value * 1; point[1] = su.value * 1 ; point[2] = ko.value * 1; sum = 0; for( i = 0 ; i < 3 ; i ++) { sum += point[i ]; このように配列変数を使っているのですが、なぜ配列変数をこのように使っているのかが わかりません。 なぜ、平均点を出すときはnew Array( )の( )の中身は何もなくて、上記のような表現を しているのでしょうか? よろしくお願いします。。

  • 開いたウインドーの、ハンドルはどこに?

     ウインドー、オープンは、できたのですが、  その新ウインドーの要素・   エレメントの、ハンドルがわかりません。  オープンした返値、 Widが、 別ウインドーのハンドルじゃ、ないのでしょうか  親ウインドーから、新ウインドーの内容を読み出したいのです。   <html> <head> <script language="JavaScript" type="text/javascript"> wid = window.open("http://kikitai.teacup.com/205/c221.html"); var taglist = ""; for (i = 0; i < wid.document.all.length; i++) { taglist += wid.document.all(i).tagName; taglist += " "; } //tx_hd = wid.prompt( taglist, ); document.writeln("<pre>"); document.writeln("AAA"); document.writeln(taglist ); document.writeln("AAA"); document.writeln(wid ); document.writeln("</pre>"); </script> </head> <body> オープンウインドー テスト<br> </body> </html>

  • JavascriptからJavaへの変え方

    Javascriptで作ったものをJavaにしないといけなくなったのですが 私はJava初心者でまったくわかりません。 色々ネットで調べてみたのですが、どうも難しくて理解することができませんでした。 下にJavascriptで作ったものを載せてるのですがどなたかやり方を教えてもらえないでしょうか? <html> <head> <title>サンプル</title> <script type="text/javascript"> function jikoku() { dd = new Date(); document.F1.T1.value = dd.toLocaleString(); window.setTimeout("jikoku()", 1000); } </script> <script type="text/javascript"> mes = new Array(5); mes[0]="0"; mes[1]="1"; mes[2]="2"; mes[3]="3"; mes[4]="4"; date=(new Date()).getHours(); if( 0 <= date && date <= 5 ){ document.write(mes[0]); } else if( 6 <= date && date <= 10 ){ document.write(mes[1]); } else if( 11 <= date && date <= 16 ){ document.write(mes[2]); } else if( 17 <= date && date <= 19 ){ document.write(mes[3]); } else{ document.write(mes[4]); } </script> <script type="text/javascript"> function Random() { var kazu = Math.random(); kazu = kazu*100; kazu = Math.ceil(kazu); if( kazu<=9 ) document.write('<br/>○1<br/>'); else if( kazu<=19 ) document.write('<br/>○2<br/>'); else if( kazu<=29 ) document.write('<br/>○3<br/>'); else if( kazu<=39 ) document.write('<br/>○4<br/>'); else if( kazu<=49 ) document.write('<br/>○5<br/>'); else if( kazu<=59 ) document.write('<br/>○6<br/>'); else if( kazu<=69 ) document.write('<br/>○7<br/>'); else if( kazu<=79 ) document.write('<br/>○8<br/>'); else if( kazu<=89 ) document.write('<br/>○9<br/>'); else document.write('<br/>○10<br/>'); } Random() </script> <script language="JavaScript"> var imglist = new Array( "sample1.jpg", "sample2.jpg", "sample3.jpg", "sample4.jpg" ); var selectnum = Math.floor((Math.random() * 100)) % imglist.length; var output = "<img src=" + imglist[selectnum] + ">"; document.write(output); </script> </head> </html>

専門家に質問してみよう