+ JavaScript の質問用スレッド vol.122 +©2ch.net

このエントリーをはてなブックマークに追加
834Name_Not_Found:2015/02/07(土) 14:40:14.03 ID:???
>>832
>>826を理解した上で配列の要素数を返すプロパティだと認識していた
要素数でないなら length は何を返すものなんだろう?
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/length
835Name_Not_Found:2015/02/07(土) 14:51:11.27 ID:???
>>834
厳密に言うと、最大添字数+1でしょうね
添字が0から始まって要素が隙間なく埋まってたら要素数と一致するが

そこにも書いてあるじゃない lengthの値と実際の要素数は一致しないこともあると
836Name_Not_Found:2015/02/07(土) 15:23:50.86 ID:???
>>835
あなたがいいたかったのはこういうことだろうか

var numbers = [1, 2, 3, 4, 5];
console.log(numbers.length); // 5
delete numbers[1];
console.log('1' in numbers); // false
console.log(numbers.length); // 5
numbers.forEach (function (element) {
console.log(element); // 1 -> 3 -> 4 -> 5
});

> そこにも書いてあるじゃない lengthの値と実際の要素数は一致しないこともあると
MDN で説明している不一致になるパターンは「length プロパティを実際よりも大きな値に書き換えた場合」であなたの説明とは無関係だと思うのだが…
(実際にはほぼ使わない例外的な挙動なので私はこれを考慮していなかった)
結論としては、下記のようになるということか

・length は「最大数値添字値+1」を返す
・ただし、ユーザが実際の要素数よりも大きな数値で length プロパティを書き換えた場合はその値を返す
837Name_Not_Found:2015/02/07(土) 15:50:07.14 ID:???
lengthは「長さ」だからなあ
サイズとはまた違うものだと思う

このスレのどこかにあったけど、サイズを調べるのは Object.keys(a).length でできるよ
838Name_Not_Found:2015/02/07(土) 15:53:15.73 ID:???
>>836
こんなんでもいいんじゃない?
var a = [];
a[100] = 'a';
これでlengthは101だけど要素数は1だよね

要素数を返すという根拠にそのページを挙げてたと思われたので、
そのページでも実際の要素数とは区別して書いているんだよと言いたかった > 書いてあるじゃない
839Name_Not_Found:2015/02/07(土) 16:16:48.65 ID:???
>>836
for 文だと hasOwnProperty を使わないと Array.prototype.forEach と同じ挙動にならないんだな…

>>837
Map.prototype.size と Array.prototype.length の挙動が違うようなものか
Object.keys のコードは>>531だな
840Name_Not_Found:2015/02/07(土) 16:52:03.22 ID:???
>>831
その理解でもまああんまり問題ないけど、正確に言うと違う
JavaScript の Object のプロパティ名はすべて String型(ES6 から Symbol型 も加わったが)
Array の添え字ももちろん String型 で管理されている

var a = [];
a[5] = true;
a["1"+"0"] = true; // a[10] = true; と同じ
alert(a.length); // 11
for(var i in a) alert(typeof i + ": " + i); // 「string: 5」「string: 10」

あとそのサイトはES3なので、今更そのサイトを参照元にするのはお勧めできない
841Name_Not_Found:2015/02/07(土) 17:32:01.07 ID:???
>>840
> JavaScript の Object のプロパティ名はすべて String型(ES6 から Symbol型 も加わったが)
わかってはいたが、>>826が理解できる説明をする自信がなかったので簡略化してしまった
下記のように理解してる

---
var newLenDesc = ToUint32(propertyName),
oldLenDesc = this.length;

if (newLenDesc !== ToNumber(propertyName)) {
 throw new RangeError;
}

if (++newLenDesc > oldLenDesc) {
 this.length = newLenDesc;
}
--

> あとそのサイトはES3なので、今更そのサイトを参照元にするのはお勧めできない
これは大分迷ったが、>>826に紹介するなら日本語でないと読めないと思ったのであえて古い ES3 を紹介した
読めそうな人には ES5 を紹介するんだが…
http://es5.github.io/#x15.4.5
842840:2015/02/07(土) 17:49:30.41 ID:???
>>841
なるほど、そこまで考えて回答してるとは思わなかったわ、すまん
確かにES5の日本語化は不足してるからなあ…
唯一見れるのはhttp://tsofthome.appspot.com/ecmascript.htmlくらいかな
Arrayの部分はきれいに飛ばされてるけどw
843841:2015/02/07(土) 21:14:40.37 ID:???
>>842
いや、私も全ての仕様を熟知しているわけではないので細かな点まで指摘してもらえるのは有難い
今にして思えば、「厳密には違うが、簡単に説明すれば」の前置きを置いたり、ES3, ES5 のURLを併記すれば良かったように思う
私も積極的に指摘するので今後も指摘して貰えると助かるのが正直な気持ちだ

ところで、「プロパティ名はすべて String型」だが、正確にはプロパティ名に型は存在しないので、内部処理で「プロパティ名は String 型にキャスト(型変換)される」が正解だと思う
プロパティアクセス演算子で扱える型に制限はなかったはずなので a[NaN] も a[true] も問題なく評価できるはずだ
(ES6 では Symbol 型、Map、WeakMap だけ扱いが特殊だが)

> 唯一見れるのはhttp://tsofthome.appspot.com/ecmascript.htmlくらいかな
知らなかったが、部分的でも和訳があるのはいいな
テンプレに入れてもいいぐらいだと思う
844Name_Not_Found:2015/02/07(土) 23:51:52.56 ID:???
http://tsofthome.appspot.com/ecmascript.html をテンプレの>>4に入れようと思ったが、行数制限で入らなかった
>>4から不要なリンクを削除して入れる事を試みる
ES5 で標準化された JSON http://www.json.org/json-ja.html は削除してもいいと思うのだが、どうだろう?
845Name_Not_Found:2015/02/08(日) 01:26:47.31 ID:???
>>844
だめだな。勝手なことするな。
846Name_Not_Found:2015/02/08(日) 01:27:42.26 ID:???
>>844
分けて入れればいいだろ
847Name_Not_Found:2015/02/08(日) 01:34:16.45 ID:???
俺としては、>>3を消したいな。
あれIE6ぐらいの時代のもので
今となっては説明不足&間違ってる&どうでもいい話
848Name_Not_Found:2015/02/08(日) 01:35:13.78 ID:???
次スレはあるんだから、立てるならvol.124にしろよ

+ JavaScript の質問用スレッド vol.123 + [転載禁止](c)2ch.net
http://peace.2ch.net/test/read.cgi/hp/1422084185/
849Name_Not_Found:2015/02/08(日) 01:53:00.08 ID:???
>>845
代替案をくれ

>>846
分けるというのは>>4の一部を>>5に移すということか?

>>847
確かに俺も http://fiddle.jshell.net/vSqKr/33/show/ があれば、>>3は不要だと思うが…
今のところは、>>4の一部を>>3>>5に移すのが妥当か
850Name_Not_Found:2015/02/08(日) 02:37:13.69 ID:???
>>1-5のテンプレを更新した
http://fiddle.jshell.net/fH4cC/163/show/

- ECMAScript 3 和訳を Internet Archive 版へ差し替え(現在、閉鎖中の為)
- ECMAScript 3 原文サイトを追加
- ECMAScript 5 和訳を追加 ( http://tsofthome.appspot.com/ecmascript.html )
- >>4の一部を>>5へ移行した (>>846の提案通り)
- リンク集を更新した ( http://fiddle.jshell.net/vSqKr/35/ )

>>847は他の人の意見待ちで保留
テンプレサイトのrev数が尋常じゃないな...
851Name_Not_Found:2015/02/08(日) 02:49:12.10 ID:???
> Q4. フォーム部品名を変数にした「...myform.変数名.value」が動きません…
> A4. 「document.forms.myform.elements[変数名].value」でどぞ。

これとかさぁ、今は普通フォームにID付けて
getElementByIdとかするだろ・・・ってな。
一体いつの知識なんだか。
852Name_Not_Found:2015/02/08(日) 02:55:44.88 ID:???
実際のところ、>>3は定期的に消す要望が出るが、賛成意見が出てこなくて保留することが多い
とはいえ、サイレンとマジョリティの可能性もあるので、>>3を消した版も作って意見を待つべきか...
853Name_Not_Found:2015/02/08(日) 03:04:16.86 ID:???
http://fiddle.jshell.net/vSqKr/35/show/ も古い情報を基にして作っているところがあるな

Q2. JavaScriptでローカルファイルを読み/書きたいのですが…
Webではセキュリティ制約により絶対無理です。できたら恐ろしいことに…
⇒window.postMessage or XHR2 で可能

Q2. JavaScriptでローカルファイルを読み/書きたいのですが…
Webではセキュリティ制約により絶対無理です。できたら恐ろしいことに…
⇒File API でファイルの読み込みは可能

Q9. <a href="http://example.com/" onclick=""> で動作指定してるのですが時々動きません…
return false; でデフォルトアクションを抑制しないとページ移動してしまいます。
⇒そもそも、リンク処理を抑制させるなら a 要素で表現しようとするな

Q14. setTimeout() やイベントハンドラ関数に設定するコードに this を含めたいのですが…
this を別の変数(下例では that) に束縛し、その変数を使って対応してください。
⇒Function#bind でもOK

Q17. document.getElementById('hoge') や $('#hoge') で要素ノードが取れないのですが…
コード実行時点でHTMLがそこまで読まれてない。window.onload 中でやるとか。
⇒addEventListener (attachEvent) を使うべき
854Name_Not_Found:2015/02/08(日) 03:04:29.70 ID:???
いつもテンプレ編集お疲れさんです
そもそも論だけど、>>3については適当な質問者は読み飛ばす文量だし
またこれを見て理解できる人はそれ以前に検索で答えを見つけられると思う
該当する質問がきたらアンカー投げる先って程度の役割なら不要かな
もちろんやる気のある質問者のためにFAQへの誘導文は残すべきだけど
855Name_Not_Found:2015/02/08(日) 03:07:17.44 ID:???
>>853で Q2. を2回書いたが、一方は Q1. を書いたつもりだった

Q1. 開いた別窓/フレームの内容にアクセスできないのですが…
ページ内容が別サーバの場合セキュリティ制約により絶対無理です。
⇒window.postMessage or XHR2 で可能
856Name_Not_Found:2015/02/08(日) 03:08:13.96 ID:???
>>3を消すなら、開発者ツールやDeveloper Toolsの基本的な使い方でも書くといいと思うな
実際、これが使えればすぐ解決するような質問は多いし

あと、>>4のDHTMLはさすがに古すぎだしいらなくね
857Name_Not_Found:2015/02/08(日) 10:30:57.91 ID:???
循環参照もテンプレに入れろよ
858Name_Not_Found:2015/02/08(日) 11:21:40.95 ID:???
>>856
「Developer Toolsの基本的な使い方」はあったら便利だと思うが、どこまで説明したものか
- ページ上で右クリックして [要素を検証] -> [Styles], [Computed], [Properties] でステータス確認
- [Ctrl] + [Alt] + [J] でコンソールを呼び出し、コンソールデバッグ
- Breakpoints
正直、Breakpoints は上手く説明できる自信がない

>>857
定期的に要望が出るので入れようとは思うが、「言うは易し」という言葉があってだな
859Name_Not_Found:2015/02/08(日) 12:16:31.08 ID:???
循環参照は初心者が引っ掛かる内容でもないしテンプレ入りは不要でしょ
頻出する話題としてテンプレ案に設けるのが理想的だと思うけど中の人の負担が強いかな
860Name_Not_Found:2015/02/08(日) 14:03:40.25 ID:???
じゃあなんか循環参照のレスで大量消費するつもりなんだよ
861Name_Not_Found:2015/02/08(日) 14:12:17.26 ID:???
>>861
循環参照なんかしてんじゃねーぞ。
862Name_Not_Found:2015/02/08(日) 17:02:04.92 ID:???
>>859
指摘されて気がついたが、テンプレではなく、FAQ入りとして脳内変換していた
そもそも、文章量が1レスに収まらない事が予想されるのでテンプレ入りは無理だ
現在は下記の構成で考えている

- >>3を削除してFAQへのリンクのみにする(>>851,854,856)
- >>3に「Developer Toolsの基本的な使い方」を代わりに入れる(>>856)
- FAQ(jsfiddle)に循環参照の説明を入れる(>>857)

> 頻出する話題としてテンプレ案に設けるのが理想的だと思うけど中の人の負担が強いかな
循環参照については説明量が多すぎるので時間がかかるのは事実
早くても今夜帰宅して、「Developer Toolsの基本的な使い方」まで書ければいいところだろう
気長に待って欲しい
863Name_Not_Found:2015/02/09(月) 02:18:13.42 ID:???
FAQを更新した
http://fiddle.jshell.net/vSqKr/37/show/#Browser-Developer-Tools

- 後でFAQ項目を整理するときにタイトルがナンバリングされていると不便なのでタイトルのナンバリングを削除してフラグメント識別子をユニークにした
- FAQ に「開発者ツール(Developer Tools)の基本的な使い方」を追加した

テンプレへの書き起こしは後でやる(要素の検証、コンソールで埋まる予定、他候補があれば要望は受け付ける)
FAQからナンバリングを廃止したので、FAQのリンクリスト生成JavaScriptで ol 要素も生成できる機能を追加したい⇒後でやる
864Name_Not_Found:2015/02/10(火) 01:20:04.05 ID:???
>>1-5のテンプレを更新した
http://fiddle.jshell.net/fH4cC/165/show/

- >>3の主要FAQを削除し、FAQリンクと「Developer Toolsの基本的な使い方」を代わりに入れた(>>851,854,856)
- リンクリスト生成JavaScriptを更新してFAQリストを ol 要素でマークアップするようにした
- http://fiddle.jshell.net/vSqKr/40/show/#Browser-Developer-Tools を加筆
865Name_Not_Found:2015/02/10(火) 06:38:06.98 ID:???
おつおつ
866Name_Not_Found:2015/02/10(火) 11:34:14.15 ID:???
書き起こしとか一人で一々やってたらキリがないわな
適当な解説にリンク貼ってよさ気なレス書かれたらそれと入れ替えればいいんじゃない
867Name_Not_Found:2015/02/10(火) 12:46:24.23 ID:???
要望出すだけ出して文章を一人に丸投げしている現状が異常だと思う
自分が要望を出したときには文案ぐらいは出していたし、簡単な更新ならやったことがある
「テンプレ更新者が専任でいて頼めば何でもやってくれる」という風潮が良くないと思うな
全部やれとまではいわないけど、簡単な文案を出すとか、テンプレの要望リストに載せるとか、可能な範囲で要望者も作業を負担すべきだと思う
868Name_Not_Found:2015/02/10(火) 12:57:02.86 ID:???
JavaScript界でフォローすべきTwitter アカウント一覧を入れるべきだ

・mizchi
・kyoago
869Name_Not_Found:2015/02/10(火) 12:57:39.86 ID:???
この二人をウォッチしとけばJavaScript素人も自然と能力を伸ばすことが出来る
870Name_Not_Found:2015/02/10(火) 13:16:05.83 ID:???
ジャップ技術者にそんなレベル高い奴いるわけねーだろ
871Name_Not_Found:2015/02/10(火) 13:19:10.10 ID:???
日本語大変お上手ですね
ジャップの掲示板にわざわざ出張しての書き込み、ご苦労様です
872Name_Not_Found:2015/02/10(火) 13:19:24.30 ID:???
そういうのはネトヲチ板でやってね
873Name_Not_Found:2015/02/10(火) 15:54:36.80 ID:???
・jagarikin
874Name_Not_Found:2015/02/10(火) 17:07:19.64 ID:???
ユーザ名を掲載するのは本人の迷惑になるので今すぐに止めるべきだ
875Name_Not_Found:2015/02/10(火) 17:26:10.73 ID:???
前も書いてたな
書いてるの同一人物だろ
876Name_Not_Found:2015/02/10(火) 17:28:13.46 ID:???
それってprogrammerprofile.netに勝手に登録されることにも言えるね
俺は初心者だから有名な人を挙げてくれるのは助かってる
877Name_Not_Found:2015/02/10(火) 17:28:43.60 ID:???
そもそも何の迷惑になるのか疑問
878Name_Not_Found:2015/02/10(火) 18:00:39.03 ID:???
自分の名前が上がらないから嫉妬でしょ、たぶん
879Name_Not_Found:2015/02/10(火) 18:04:16.65 ID:???
名前書いてる奴は性格が気持ち悪いから
わざと叩かせようとしてるみたいな印象を受ける
880Name_Not_Found:2015/02/10(火) 18:06:03.08 ID:???
thisのことをコンテキストと言いますが、いまいちしっくり来ません
「オブジェクト自身」とでも呼んだ方がいいと思います
どの辺がコンテキストなんですか?
881Name_Not_Found:2015/02/10(火) 18:31:49.27 ID:???
2ちゃんだから叩くっていう発想自体が気持ち悪い
882Name_Not_Found:2015/02/10(火) 18:47:55.58 ID:???
>>880
コンテキスト=状態とすると
JavaScriptのthisは状況に応じて参照しているオブジェクトが変わるから
thisをコンテキストと呼んだりするんだろう
他の言語ではコンテキストなんて言わない
883Name_Not_Found
>>880
仕様書的に言うと、this(ThisBinding)は "Execution Contexts" の中のひとつ。
だから「コンテキスト」と呼ばれているのではないかと思う。
http://www.ecma-international.org/ecma-262/5.1/#sec-10.3