JavaScriptの学習を始めたのですが、最初で躓いてしまいました。
私はgoogle chromeを規定のブラウザとして使用しています。
test.htmlでの記述:
<html>
<head>
<title>JavaScript test</title>
<meta http-equiv="Content-Script-Type" content="text/javascript">
</head>
<body>
<script type="text/javascript" src="test.js">
</script>
</body>
</html>
test.jsでの記述:
var num=[11,22,33,44,55];
var name=['test','test1','test2','test3','test4'];
for(var i=0;i<5;i++){
document.write(name[i]+"の点数は"+num[i]+"です<br />");
}
期待していた表示は、
testの点数は11です
test1の点数は22です
test2の点数は33です
test3の点数は44です
test4の点数は55です
という感じなのですが・・・google chromeでは
tの点数は11です
eの点数は22です
sの点数は33です
tの点数は44です
,の点数は55です
と表示されてしまいます。
IEでは問題ありませんでした。
全てのブラウザで問題なく表示させるためには、
どのようにすればいいのでしょうか?
ご教示願います。
No.3ベストアンサー
- 回答日時:
この問題は DOM とグローバル変数の仕組みを知らないと難しいですね…。
変数nameはグローバル変数として宣言されています。
グローバル変数 name は window.name と同じです。
https://developer.mozilla.org/ja/Core_JavaScript …
ところが、window.name はウインドウの名前を指定するプロパティとして DOM で規定されています。
https://developer.mozilla.org/ja/DOM/window.name
window.name は String型 のプロパティとして規定されているので、初期化される値は全て String型 に変換されます。
var name = ['test','test1','test2','test3','test4']; // "test,test1,test2,test3,test4" に変換して格納される
ES3 規定にはありませんが、Stringオブジェクトは配列のように扱えるように拡張されているJavaScriptエンジンがあり、Google Chrome もその一つです。
https://developer.mozilla.org/ja/Core_JavaScript …
# この仕様は ES5 規定で取り込まれました。http://sideshowbarker.github.com/es5-spec/#x15.5 …
var string = 'Hello';
alert(string[0]); // "Hello" の1文字目である "H" が出力される (対象が空文字でなければ string[0] は string.charAt(0) と等価)
従って、質問文にあるコードでは "test,test1,test2,test3,test4" の1番目の文字から順番に出力してしまうのです。
この現象を避けるために関数内で変数を定義してください。
(function () { // コード全体を匿名関数(無名関数)で括る
var num = [11, 22, 33, 44, 55];
var name = ['test', 'test1', 'test2', 'test3', 'test4']; // ローカル変数を宣言する
for (var i = 0; i < 5; i++){
document.write(name[i] + 'の点数は' + num[i] + 'です\u003Cbr\u003E');
}
})();
ローカル変数はグローバル変数とは別に定義されるので、window.name との名前の衝突を気にする必要がなくなります。
[JavaScript] 猿でもわかるクロージャ超入門 3 無名関数 - DQNEO起業日記
http://dqn.sakusakutto.jp/2009/01/javascript_2.h …
ありがとうございます。
こんなすばらしい回答をすぐにいただけるとは感動しております。
実はJavaScriptは昨日から学習を始めたばかりで、
今まではC/C++/perl/phpと学習して来たんですが、
まだJavaScriptにおいてのローカルとグローバルな変数については
学習していなくて・・・
これで全てつじつまがあいました!
気持ちよく次のステップへ進めそうです。
疑問としては、IEではString型を配列として扱えない点です。
Cなどでは文字列=配列ということが念頭に置かれていたので・・
逆にこのように文字列を配列として扱いたい場合にIEではどうするのか?
このあたりは自分で調べてみます。
ありがとうございました。
また質問させてください。
No.4
- 回答日時:
#3 です。
> 対象が空文字でなければ string[0] は string.charAt(0) と等価
存在しないindex値の参照を失念していました。「ほぼ等価」に訂正します。
存在しないindex値を指定した場合、String#charAt は空文字を返し、String[[GetOwnProperty]] は undefined を返します。
# "Object Internal Methods" の [[GetOwnProperty]] (ES5 8.12.1) を利用しているので、プロパティアクセス演算子や配列と同じイメージでいいと思います。
http://sideshowbarker.github.com/es5-spec/#x8.12.1 (8.12.1 [[GetOwnProperty]])
http://sideshowbarker.github.com/es5-spec/#x15.5 … (15.5.5.2 [[GetOwnProperty]])
http://sideshowbarker.github.com/es5-spec/#x15.5 … (15.5.4.4 String.prototype.charAt)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 … (15.5.4.4 String.prototype.charAt)
No.2
- 回答日時:
nameってのが予約語だからか?
<script type="text/javascript">
var num=[11,22,33,44,55];
var namae=["test","test1","test2","test3","test4"];
alert(namae.length);
for(var i=0;i<5;i++){
document.write(namae[i]+"の点数は"+num[i]+"です<br />");
}
</script>
だとChromeでも問題ないぞ!
ありがとうございました。
確かにnamaeにすると、Chromeでも問題ありませんでした。
けれど、JavaScriptの予約語を調べたんですが、nameというのが、
見つかりませんでした。
もっと調べてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
C#で、ContextMenuStripに動的...
-
GASでundefinedエラーが出ます
-
JavaScriptで文字列の特定文字...
-
Google Apps Script で添付ファ...
-
javaScript textareaの一行あた...
-
html javascript リンク先アド...
-
XMLの空白要素をJavas...
-
指定日数経過でHTML上のデータ...
-
【乱数】任意の範囲、固定個数...
-
javascriptで困っています。教...
-
lengthが読めない理由が分からない
-
pdfに丸秘などのスタンプを...
-
テキスト改行(split+vbCrLf)に...
-
javascriptでiframeのURL変更は?
-
javascriptでテーブルに追加し...
-
ローカルにあるファイルを検索...
-
ジェネレーターの作り方
-
商品コードを入力で、商品名、...
-
シンプルなweb版スタンプラリー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
C#で、ContextMenuStripに動的...
-
C#OpenCv V4にのエラーに関する...
-
GASでundefinedエラーが出ます
-
ジェネレーターの作り方
-
ASP.NET MVCでObjectをjsに渡す
-
翌月を取得するGASが分かりません
-
gas スプレッドシートがアクテ...
-
ASP.NETのコントロールの値をJa...
-
ローカルにあるファイルを検索...
-
シンプルなweb版スタンプラリー...
-
なぜmatchメソッドがエラーにな...
-
APIを使って埋め込んだグーグル...
-
jqGridについて
-
イラレでナンバリングする方法
-
JavaScriptで文字列の特定文字...
-
【javascript】正規表現で括弧...
-
VSCODE[Python]の設定について
-
JAVASCRIPTで万年カレンダーを...
-
javascriptでiframeのURL変更は?
おすすめ情報