+ JavaScript の質問用スレッド vol.109 +
JavaScript を自ら学ぶ人のための質問スレッドです。
>>2-4 のテンプレを読んだ上で質問してください。
■質問を書く上で
(1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。
(2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。
(ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など)
(3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。(なりすまし及び煽り防止のため)
(4) 常に自発的に調べる心構えを持ってください。
具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。
わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。
(5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。
(6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。
※必ず「問題の事象が再現されること」を確認してください。
必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。
(7) サンプルコードに HTML が含まれる場合は
http://validator.w3.org/ で [Check] してみてください。
(8) 質問を具体的かつ詳細に書くと回答を得られやすいです。質問テンプレートを活用してみてください。
■質問テンプレート
【環境】OS, ブラウザをバージョンと共に記入してください。(ex: IE8, Firefox4)
【何をしたのか】何をしたら問題の現象が発生するのか。再現手順を具体的に書いてください。
【エラーメッセージ】エラーメッセージがあれば正確に書き写してください。(Windows なら「コピット」を活用)
【期待する結果】最終的にどういう結果を望んでいるのか、を書いてください。
【サンプルコード】現象を再現可能な最小限のコードを書いてください。
1レスに収まらないならコード投稿サイトを利用してください。
http://jsdo.it/ http://jsbin.com/ http://jsfiddle.net/ http://ideone.com/
■主要FAQ (全部は
http://fiddle.jshell.net/vSqKr/33/show/ )
Q1. 別窓・フレーム内容やローカルファイルを読み書きしたいのですが…
A1. 別サーバのページやファイルの内容はセキュリティ制約でアクセス不可です。
Q2. document.write()でページ内容を追加したいのですが…
A2. 一度表示完了後にwriteするとページ内容が消去されます。DOM等別手段を。
Q3. table内容のinnerHTMLやDOMでの変更がうまく行かないのですが…
A3. IEではtable/tbody/trのinnerHTML書き換え不可です。DOMを使いますが、
DOMの場合tableの直下にはtbody要素が(作らなくても)あることに注意。
Q4. フォーム部品名を変数にした「...myform.変数名.value」が動きません…
A4. 「document.forms.myform.elements[変数名].value」でどぞ。
JavaScriptでは一般に「obj.x」と「obj['x']」は同じ意味です。
グローバル変数はwindowのプロパティなので「x」と「window['x']」も。
Q5. CSSで設定した背景色がe.style.backgroundColorで取得できないのですが…
A5. 取得には document.defaultView.getComputedStyle() を使う必要あり。
IEでは要素オブジェクトのプロパティcurrentStyleを使う。
Q6. setAttribute("class","foo")、setAttribute("onclick","bar()")が動きません…
A6. IEではそれは不可。「obj.className="foo"」「obj.onclick=bar」でどぞ。
Q7. タイマーやイベントハンドラに設定するコードにthisを含めたいのですが
「"...this..."」とか「function(){...this...}」ではうまく行きません。
A7. 実行時にthisが別のものを指してしまってる。以下のようにthisを束縛保存。
「function(x){return function(){...x...};}(this)」
Q8. input type="file"の値を設定(参照)できないのですが…
A8. セキュリティ制約のため設定は絶対に不可。参照はブラウザにより不可。
Q9. getElementById('ID名')や$('ID名')で要素が取れないのですが…
A9. コード実行時点でHTMLがそこまで読まれてない。window.onload 中でやるとか
■主要FAQ (全部は
http://fiddle.jshell.net/vSqKr/33/show/ )
Q1. 別窓・フレーム内容やローカルファイルを読み書きしたいのですが…
A1. 別サーバのページやファイルの内容はセキュリティ制約でアクセス不可です。
Q2. document.write()でページ内容を追加したいのですが…
A2. 一度表示完了後にwriteするとページ内容が消去されます。DOM等別手段を。
Q3. table内容のinnerHTMLやDOMでの変更がうまく行かないのですが…
A3. IEではtable/tbody/trのinnerHTML書き換え不可です。DOMを使いますが、
DOMの場合tableの直下にはtbody要素が(作らなくても)あることに注意。
Q4. フォーム部品名を変数にした「...myform.変数名.value」が動きません…
A4. 「document.forms.myform.elements[変数名].value」でどぞ。
JavaScriptでは一般に「obj.x」と「obj['x']」は同じ意味です。
グローバル変数はwindowのプロパティなので「x」と「window['x']」も。
Q5. CSSで設定した背景色がe.style.backgroundColorで取得できないのですが…
A5. 取得には document.defaultView.getComputedStyle() を使う必要あり。
IEでは要素オブジェクトのプロパティcurrentStyleを使う。
Q6. setAttribute("class","foo")、setAttribute("onclick","bar()")が動きません…
A6. IEではそれは不可。「obj.className="foo"」「obj.onclick=bar」でどぞ。
Q7. タイマーやイベントハンドラに設定するコードにthisを含めたいのですが
「"...this..."」とか「function(){...this...}」ではうまく行きません。
A7. 実行時にthisが別のものを指してしまってる。以下のようにthisを束縛保存。
「function(x){return function(){...x...};}(this)」
Q8. input type="file"の値を設定(参照)できないのですが…
A8. セキュリティ制約のため設定は絶対に不可。参照はブラウザにより不可。
Q9. getElementById('ID名')や$('ID名')で要素が取れないのですが…
A9. コード実行時点でHTMLがそこまで読まれてない。window.onload 中でやるとか
5 :
Name_Not_Found :2013/09/21(土) 23:25:21.28 ID:31XAV7Zv
前スレからです。 よろしくおねがいします。 書き込み不可なはずのプロパティに、 何度か書き込みをかけたり、その作業をする関数を何度か呼ぶと、 Chromeでは書き込みができてしまい、困惑しています。 これはブラウザのバグなのでしょうか? Object.defineProperty(Object.prototype,'0',{set:function (v){this.first_value=v}}); function test1(){ var a=[]; a[0]=123; return a[0]; } function test2(){ var a=[]; for(var i=0;i<100;i++)a[0]=123; return a[0]; } test1() //undefined test1() //123 test1() //123 test2() //123
nullがオブジェクトでtrueやfalseが違うのは何故ですか?
>>8 貴重な情報、大変大変ありがとうございます。
php+Jascrip+jQuerytでAjaxの勉強してるが、なんか、かなり難しいな 全然簡単じゃないやん。 仕事ではJavaで使ってるが、いつかphp+Jascrip+jQuerytでAjaxの勉強 してたことが生かされるときってきますかね?
ジャスクリップ? ジェイクエリート?
12 :
10 :2013/09/22(日) 01:42:39.67 ID:???
ミスった ☓Jascrip ○Javascript
検索力と根気が役に立つ
14 :
10 :2013/09/22(日) 02:20:12.19 ID:???
>>13 なるほどな。
不具合情報とか、Javascript、phpのプログラムの本の間違えとか
ブログで指摘しまくってたら、1日20〜30人くらい人が来るようになった。
特定の不具合情報検索したらオレのブログがグーグルで1番目にくるのは
ちょっと達成感ある。
ショボww
alertの件は結果でたの?
16進数の桁揃えを一番シンプルにする方法は何ですか? ff→00ff(4桁) など
('000'+(s.toString(16)).slice(-4) 以上にシンプルな方法ありますか?
(num+0x10000).toString(16).slice(-4) とか。
0x0aを var a = 0x0a; これを文字列"0x0a"にする方法を教えて String(a)だと"10"に変換されるからダメ
10進数ならIntlAPIが便利だから覚えておくといいよ。
与えられた文字を使って、指定した長さの文字列(文字の重複もOK)の全組み合わせ var a = ["a","b", "c", "d", "e"]; for(var i=0; i<a.length; i++) { for(var k=0; k<a.length; k++) { for(var j=0; j<a.length; j++) { console.log(a[i] + a[k] + a[j]); } } } これは5つの文字を使って、長さが3の文字列の組み合わせを出力している でも、長さを5にしたり10にしたり変更する場合いちいちforを追加してやらなければならない どうやって改善すればいいか教えて
>>24 この例なら、5進数3桁と考えてみるとか。
5進数3桁だから、繰り返し回数は5^3。 カウンタを回しながら、('00'+count.toString(5)).slice(-3)して、 各々の桁に対応する文字を取り出す。
文盲ばっかり
参照を保持したまま配列の要素を全て削除するにはどうしたらいいですか? var a = [1,2,3,4]; var b = a; var a = []; console.dir(b); こうすると、aがbとは別配列になってしまいます delete(a[0]); とすれば、参照を保持したまま要素の内容は削除できますが、 要素数が減りません
while (a.pop()); で出来ました 失礼しました
>>28 別配列じゃダメなん?って思ってしまうが、
var a = [1,2,3,4];
a.length = 0;
a.splice(0,a.length); の方がいいですね
>>31 そんな方法もあったのですね
ありがとうございました
>>24 a = ['a', 'b', 'c', 'd', 'e']
let dup=(a,i,s='',b=[])=>i?a.forEach(v=>dup(a,i-1,s+v,b))||b:b.push(s)
s = dup(a,2) //["aa","ab","ac","ad","ae","ba","bb",......
>>33 勝利とか、そういう低レベルな話ではないのです
dup(a,2).forEach(s=>console.log(s))
>>25-26 それだと文字の種類が増えたときと長さの変更に耐えられないし的外れ
>>39 桁数や文字種が数字になってるんだから、そこはなんとかできるでしょ。
>>35 ES3版
var dup=function(a,i,s,b){
if(!s)s=''
if(!b)b=[]
if(i){
for(var j=0;j<a.length;j++){
dup(a,i-1,s+a[j],b)
}
return b
}
b.push(s)
}
オブジェクトを加工する時は、なるべく参照を保持したまま加工した方が ガベージコレクションは減りますよね? 別オブジェクトを作成するタイプの関数を破壊的な関数に置き換えたらパフォーマンスが上がる これは正しいですか?
可読性をあげた版 function dup(ary, i, str, ret) { if ( !str ) str = ''; if ( !ret ) ret = []; if (i) { for (var j = 0; j < ary.length; j++) { var char = ary[j]; dup(ary, i-1, str+char, ret); } return ret; } ret.push(str); }
具体的にコード貼れ 書いてることが根本的に矛盾してるから意図が分からん
>>42 ベンチマークが全て
まずやってから書き込んでくれ。
「なるべく参照を保持したまま加工」ってどういうこと? 参照を保持しないと加工なんて出来ないじゃん クロージャでの変数キャッシュとパフォーマンスの関係を聞いてる? でも何でGCが出てくるのかがわからん
>>43 を改良してみた
function dup(ary, i) {
var ret = [];
function dup_deep(i, str) {
if (i) {
for (var j = 0; j < ary.length; j++) {
dup_deep(i-1, str+ary[j]);
}
}
ret.push(str);
}
dup_deep(i, '');
return ret;
}
var a = ['a', 'b', 'c', 'd', 'e'];
console.log(dup(a, 2));
それはIEが仕様的に悪いとは言わないが、最適化が弱い部分 但しV8は64Kを超えるノードは後から追加してくれと1年前の公演で言っていた 今は分からないが、まあ本当に色んな条件が絡んでくるだろうね まあ、2つ言えるとしたら、new Array(lowLength)はここ数年は優位 確実性を求めるのなら、数値配列であればTypedArrayを使う
<script src="lodash.js"></script> <script> function dup(list, len) { return (function deep(i, str) { return i ? _(list).reduce(function (sum, ch) { return sum.concat(deep(i-1, str+ch)) }, []) : str })(len, '') } var a = ['a', 'b', 'c', 'd', 'e']; console.log(dup(a, 2)); </script> lodashを使って、ES3でも動くようにして 読みやすさを保ったまま、ぎりぎりまでコードを絞った。 pushはなんかださいのでやめた。 まあ、好きな方を選んでくれ。 let dup=(a,i,s='',b=[])=>i?a.forEach(v=>dup(a,i-1,s+v,b))||b:b.push(s)
tiddywikiってあるじゃないですか あれどうやってファイルに書き込みしてるんですか?
2つ3つでいいのならこうも書ける dup = [ v1+v2 for (v1 of arr) for (v2 of arr) ] // 現firefox dup = [ for (v1 of arr) for (v2 of arr) v1+v2 ] // ES6?
54 :
50 :2013/09/22(日) 16:21:55.40 ID:???
>>50 をベースにlodashを取り除いてES5専用にした。
といっても _ を取り除いただけだけどw
function dup(list, len) {
return (function deep(i, str) {
return i
? list.reduce(function (sum, ch) {
return sum.concat(deep(i-1, str+ch))
}, [])
: str
})(len, '')
}
アロー関数に置き換えた
function dup(list, len) {
var deep = (i, str) =>
i
? list.reduce((sum, ch) =>
sum.concat(deep(i-1, str+ch))
, [])
: str
return deep(len, '')
}
行数を減らした
function dup(list, len) {
var deep = (i, str) => i ? list.reduce((sum, ch) => sum.concat(deep(i-1, str+ch)) , []) : str
return deep(len, '')
}
現状サポートされているダウンロードAPIじゃ何かを妥協しないといけない A.FileAPI 1.好きなタイミング、構造を指定できるが、ルートはブラウザが決めた特定の場所になる 2.内容とフォルダ構造は概ね保たれるが、外から見た時名前は飛ぶ B.AnchorDownload 1.ブラウザの設定によって保存ダイアログが出るか、デフォルトの場所に保存される 2.どんなファイルでも壊れずに保存できるが、上書きや読み込みはユーザー手動
57 :
50 :2013/09/22(日) 16:28:20.70 ID:???
デフォルトパラメータを使った
var dup = (list, i, str='') => i ? list.reduce((sum, ch) => sum.concat(dup(list, i-1, str+ch)) , []) : str
>>35 に合わせて名前をわかりにくくして可読性を下げたw
var dup = (a, i, s='') => i ? a.reduce((b, v) => b.concat(dup(a, i-1, s+v)) , []) : s
>>35 に合わせて空白を削ってさらに可読性を下げたw
var dup=(a,i,s='')=>i?a.reduce((b,v)=>b.concat(dup(a,i-1,s+v)),[]):s
(69文字)
>>35 と比較してみた
let dup=(a,i,s='',b=[])=>i?a.forEach(v=>dup(a,i-1,s+v,b))||b:b.push(s)
(71文字)
勝ったw ひとしきり遊んだ
まあ面白かったよ。
こいつプログラム板で暴れてる通称巨人様だから相手しなくていいぞ
巨人様のファンですか? いつも巨人様のことを考えていそうですねw
出張乙
61 :
50 :2013/09/22(日) 16:43:50.90 ID:???
>>58 別に俺は巨人様じゃないし、そもそも巨人様なんて知らんし。
進撃の巨人のネタか? 見てないから知らん。
それよりお前(
>>58 )が、その巨人様と
なにか言い争っていたやつだってことは
はっきりわかってるぞ。
自分で告白したようなもんだからなw
はい、次行こか。
巨人様ほっといて次行けるわけ無いだろ。
巨人は自称 【PHP,Python】スクリプト,バトルロワイヤル38【Perl,Ruby】 681 . デフォルトの名無しさん 2013/09/16(月) 01:01:27.49 狂人にはもう触るな… 682 . デフォルトの名無しさん 2013/09/16(月) 01:02:23.75 そう。巨人には手を出しても負けるだけw
>>64 詳しいなw
一つ忠告しといてあげるよ。
勝った方は、誰に勝ったかなんて覚えてないが、
負けた方は、相手のことを忘れられないんだ。
それが匿名掲示板だと、気に入らない相手全てが
「ヤツなんだ!」って思うようになってしまうよ。
精神病の始まりだねw
巨人だか何だか知らんがどうでもいいだろ スレに沿った話なんだから 巨人自体の話はスレ違い
誰が巨人の話をしだしたんだろうね。 まったく迷惑だ。
>>66 あんまり自演してるとさるさんになりますよ
嵐にレスする奴も嵐です。
最近ここに来た統合失調症の人か
〜〜〜ここまで全て2、3人による演劇〜〜〜 〜〜〜ここからも2、3人による演劇〜〜〜
>>64 のスレ知ってるけど、
JS叩きが酷いんだよね。
多分、
>>64 はこのスレを荒らしに来たやつだろう。
ES3でも動くようにするなら、
>>50 ES5専用でいいなら
>>57 の一番上のコードが
読みやすく一番バランスがとれてるって感じた。
プッw
これが最後の捨て屁になればいいのに。
すげえなES5 いつから使えるんだぜ?
みなのこころのなかに それがES5なんだよね
>>78 es5-shimみたいなのを使えば、
関数レベルで実装できるもの
(forEachやreduceなんか)は
今すぐ使える。
=>てのもES5なんでしょう?
スレが伸びてると思ったらじゃれあいか。 仲がよろしくて結構。
let dup=(a,i,s='',b=[])=>i?a.forEach(v=>dup(a,i-1,s+v,b))||b:b.push(s) と var dup=(a,i,s='')=>i?a.reduce((b,v)=>b.concat(dup(a,i-1,s+v)),[]):s じゃ機能が違うな。 後者は新しく作ることしか出来ないが、前者は続きや追加ができる。 まあパクリにできることなんてこれくらいが限界だろうけどw
A.B.C.D === "str" が調べたい時、 if(A&&A.B&&A.B.C&&A.B.C.D === "str") とするのが長ったらしくて嫌なのですが 簡潔な方法はありますか?
new Array(num)で要素数を指定した後、 pushしすぎてもエラーも出ずに動作していますが、 指定した要素数を超えても特に問題はないのでしょうか?
(function(){ new Array(100000000000000); })() ってやったら ページを開いている間ずっとメモリ100000000000000byte分使われてしまうのですか?
JavaScriptでベンチマークを取る正しい方法をおしえてください
ありがとうございました
どのくらいのスキルがあればあごっちと対等になれますか?
Webは広いんだから、これとこれとこれはできるみたいに 1つずつ極めて行けばいいよ 極める前に、これとこれとこれはやったことはある これとこれとこれは知ってるってのを作るのも同じくらい大事だけど
あごっちってさ 20代なのに家持ってるじゃないですか やっぱりJavaScriptで家が買えるほど儲かるんですよね だからさ ぼくはあごっちを目標にしたいんです
新しい技術を見たら忘れないうちにメモしておいて 暇な時に概要の調べてちょっと試す もう存在を忘れることはないなというとこまでやったらリストから消す
なるほど、なるほど
あごっちが2人いるよりあごっちが知らないことを知ってる人がいる方がいいに決まってる あと儲けられるかは技術的な問題だけじゃない
97 :
50 :2013/09/22(日) 21:04:05.57 ID:???
>>85 > A.B.C.D === "str"
> が調べたい時、
> if(A && A.B && A.B.C && A.B.C.D === "str")
> とするのが長ったらしくて嫌なのですが
> 簡潔な方法はありますか?
俺ならこう書くかな。関数名は適当だとしてまあとりあえずこういう関数を作っておく。
(ループの所とか、ECMAScritp5やUnderscore なんかが使える場合はそれに最適化しても良い)
function hoge(key) {
var obj = window, keys = split('.', key);
for(var i = 0; i < keys.length; i++) {
if (obj === undefined) {
return obj
}
obj = obj[i];
}
return obj;
}
後はこれだけで良い。
if( hoge('A.B.C.D') === "str")
下手にこってない素直なコードだと思う。
>>89 >
>>85 これでどう?
>
http://ideone.com/EVzNzu >
>
> if (hoge && hoge.fuga && hoge.fuga.puyo === 123) {}
> //↓
> if ($hoge.fuga.puyo.$ === 123) {}
それはさすがに書き方がダサい。
レビューがあれば、なんでこんなコード書いた?って
追求されるレベル。
try-catchでいい件
try-catchは例外を補足するものだから こういう時に使うべきではないなあ。
普通に&&で羅列するのが一番よくね
103 :
85 :2013/09/22(日) 21:32:49.51 ID:???
スレ違い てか誰か知らんけど個人の名前をあげるな
でも別にエラーでもないのに使うのはtry catchの間違った使い方だよな 書くのが面倒くさいからって間違った使い方するのは本末転倒じゃないか
そうか? こういう時しか使うことないのに渋っても勿体無いじゃん
JSONのパースの時はパース自体のtryと一緒にデータが正しいかのチェックに使うよ。
例外の目的は無視できない形でエラーを出すことで、それ以外の目的では使うべきではない ってコーディングルールの基本だろが
しかもパフォーマンスも悪いし
質問者の要求に答えられ無かった奴らが何を言っても滑稽なだけ
随分頭お固い人ばかりっすね...
呆れ
哀れ
終れ
>>105 一般人とJSerのプリンスを同じように扱うな!
私怨か何か知らんがまじうざい
どこにも私怨要素ねえだろwwwwwww
Perl界のdankogaiやJava界の結城のようにJavaScript界のプリンスも知らないとかお前恥ずかしいよ
2chに名前出されて喜ぶやつなんていねーから ノリもなんか気持ち悪いし消えてくれや
そんな事よりSublimeTextの話しようぜ
有名人が公に発表してる情報でいちいちうぜえだ気持ち悪いだ騒ぐなアスペ
>>122 Pythonじゃなければモット良かった
俺もJavaScriptならいいのにって思ったけど JavaScriptになるとプロセス使えないのかな?
var a; function disp(){ console.log(a); } function init(){ a=document.getElementById('a'); disp(); } これをdiv id="a"に対して実行するとHTMLDivElementとかが表示されます disp()とinit()のスコープは違うと思うのですが 1行目のvar a;をなくしても同様に問題なく表示されます 1行目のvar a;は不要だと思いますか? 自分はif文でも同様に宣言してしまうのですがおかしいですか? var a; if (cond){ a=1; } else { a=2; }
>>103 >>97 動くけどどういうこと?
君の中のレスで一番問題にしてないのは
>>97 みたいだけど。
(動かないという勘違い以外、何も言及していない)
>>106 グローバル変数って?
A.B.C.Dって言ってきたのは
>>85 だし、
A以外のグローバル変数がどれかわからない。
try-catchが簡潔ってよくわからんわ。 なんか自演っぽく見えるな。 if( hoge('A.B.C.D') === "str") 一行で済むのと try { if( A.B.C.D === "str") {} } catch(e) { } 無理やりやっても var value; try { value = A.B.C.D } catch (e) {} if( value === "str") { 簡潔? いやー、ありえんw やっぱり自演だな。
>>126 disp()関数内にもinit()関数内にも変数aに対するvar宣言がないので、
変数aは外側のスコープの変数aを使う
両関数とも1行目で宣言されてる変数aになる
外側のスコープでも変数aがvar宣言されていない場合は、それはグローバル変数になる
つまり1行目のvar宣言がない場合も、両関数で同じグローバル変数aを使うことになる
この暗黙のグローバル変数の利用は推奨されない
つまり1行目のvar宣言は全体するべき
JavaScriptの場合if文のブロックはスコープをもたないので、
上のコードと下のコードは全然意味が違う
>>126 初心者?
スコープの話をするなら aのスコープでしょ?w
aのスコープはdispとinit両方で同じa(1行目)を
参照しているのだから当然同じ。
普通に書くならこうだろうねー。
//var a;← グローバル変数は原則的に作っちゃダメ
function disp(){
console.log(a); //変数 a は見えない
}
function init(){
var a=document.getElementById('a');
disp();
}
> 自分はif文でも同様に宣言してしまうのですがおかしいですか?
上のとは全く違う話になっているけど?
まあ俺ならこう書くね。
var a = cond ? 1 : 2;
var a = 2; if (cond) a = 1;
CodeIQの古代文献の問題むずすぎ
星1個じゃん?w
>>131 ないな。変数の再代入はできるだけ避けるべきだ。
135 :
126 :2013/09/23(月) 01:04:44.49 ID:???
>>129 ありがとうございます。
暗黙でそういうふうになるんですね。
ちゃんと宣言することにします。
>>130 関数のスコープの話だと思ったので。
そのコードだとaはinitのローカル変数に見えますが、
それでちゃんと動くんですね。びっくりしました。
初心者ってほど初心者ではないと思いますが、
ちょっと自分の中の常識が崩れちゃったので、
そのコードについてもっと調べたいと思います。
if文のやつはちょっと例が悪かったですね。
かえってややこしくしてすみません。
そっちの話は忘れてやってください。
disp(a)で受け渡すようにするほうが自然な感じがしないでもない
今荒らしがいるから解答者同士の絡みは避けるように 自演も出るだろうが気にしないようにがんばろう
いちいち言わなくていいよ。 誰が荒らしかなんて見てわかるから。
今っていうか、ずっといるだろ 単に人の足を引っ張りたいだけのクズはどんな質問スレにもいるよ
>>135 >外側のスコープでも変数aがvar宣言されていない場合は、それはグローバル変数になる
>つまり1行目のvar宣言がない場合にも両関数で同じグローバル変数aを使うことになる
ここちょっと違った
関数内にも関数の外側のスコープにも存在しない変数への代入でグローバル変数が作成される
つまり1行目のvar宣言がない場合は、init()関数の代入でグローバル変数aが作成されて、
disp()関数でもそのグローバル変数を参照することになる
n個プロパティがあるオブジェクトからobj[key]で値を得たい時かかる時間のオーダーって解りますか? Arrayとそれ以外で違いますか?
>>141 明らかに宿題だね。
まず意味を理解することから始めようかw
>>130 だとconsole.log(a)でエラーじゃないの?
arrayの方が速い
>>134 どんな理屈でそう思ってるのか知らないがその考えは改めるべきだ
なんでそう思ってるのか気になる 再代入なんてプログラミングで普通のことだろ
ごめん130みたら分かった たしかにこういう再代入は綺麗じゃないわ
条件に沿った最終的な値を得る前に他の値を代入するのはアグリー 徐々に組み立てていくのならいいけど
>>145 > どんな理屈でそう思ってるのか知らないが
まず、再代入でぐぐろう。
この話を知っていましたか?
知らなかったですか?
それは再代入が遅いんじゃなくて代入が遅い話
151 :
Name_Not_Found :2013/09/23(月) 14:28:31.24 ID:GLYpuDbM
EclipseでJSLint(プラグイン)使ってる人いますか? 検証を実行しても問題ビューに何も表示されない。 敢えて引っかかるようなコードを入れて 設定ファイル(検証オプション)を変更してみても効いてない。 設定のパスを変更するとエラーになるので 設定を読み込んでるのは確かなんだが・・・
>>149 その話がなんの話か具体的に言ってくれ
まさかJITがなんたらかんたらって勘違いしたネタじゃないだろうけど
var state = INIT; if (already_init) state = PROC; こういう時は別にいいよね?
154 :
Name_Not_Found :2013/09/23(月) 15:29:27.87 ID:0ZAG49Mx
>>150 速い遅いのは無しなんかしていない。
>>152 再代入でぐぐったという証拠に
検索結果のトップ5つのタイトルを
ここにコピペしてくれ
何かを他人に伝える場合は自分の言葉ではっきりと伝えましょう
>>154 お前がぐぐった内容を盾に話がしたいならそれをここに張ればいい
157 :
Name_Not_Found :2013/09/23(月) 15:40:07.31 ID:0ZAG49Mx
お前が主張したことをここ書けばいいよ
159 :
Name_Not_Found :2013/09/23(月) 15:52:30.05 ID:0ZAG49Mx
だからそれが、Google検索結果の トップ5だってばw
再代入でぐぐった記事やスライドにJavaScriptで再代入を使いたくない根本的に納得できる理由はなかったけど
ほんとにプログラム板から移民してきちゃったんだなあ ここは質問用スレッドなんで、突っ込んだ議論をしたいならプログラム板に帰ってやってくれ
再代入が嫌なら関数型言語だけ使っとけば良いよ
同じnameのradioボタン5つに対してチェックが変わったらイベントを起こしたいのですが、 for (var i = 0; i < radio.length; i++) { //radio.length=5 radio[i].addEventListener('click', func, false); } 今こんな感じにしています。 lengthが大きくなるほど何かが間違ってる気がしてならないのですが、 こんなのでいいのでしょうか? なんかもっといい書き方があったらどんな感じにするのか教えてください。
$.(document).on('click', "セレクタ", function(){func()}
165 :
Name_Not_Found :2013/09/23(月) 20:25:23.30 ID:GLYpuDbM
以前prototype.constructorなんて使ってる人いるの?と書いた者ですが、 stackoverflowに以下のようなオブジェクトのcloneをするコードがありました function clone(obj){ if(obj == null || typeof(obj) != 'object') return obj; var temp = obj.constructor(); // changed for(var key in obj) temp[key] = clone(obj[key]); return temp; } obj.constructorで呼び出されるのってprototype.constructorですよね つまり使われるが正解でした ありがとうございました
>>166 concatさんの方は代入まで行ってるからそこまで遅いんだろ。
a.concat(b);
Array.prototype.push.apply(a, b);
処理内容だけを公平に比較するならこう。
function a(){ } function b(){ } function c(){ } じゃだめなんですか? thisとかconstructorとかapllyとか訳わかんないやつ使うメリットはなんですか?
>>168 最終的にaに連結した配列が入っていて欲しいのだから
それでは正確にはなりません
>>169 それで困らないプログラムを書いてるならそれでいい
>>170 > 破壊的連結の方が圧倒的に速かったです
この結論がおかしい。
目的ベースではなく処理単位ベースでの比較とすると 確かにおかしいかもしれませんが 現実的には有意味です
jsperf落ちてたと思ったら 全てのテストがふっとんだ?
> オブジェクトの新規生成はそれほどコストが高いということでしょうか ベンチ内容と結論が全く結びついてないんだけどね
push.applyはスタックをクソ消費するからNG
>>175 concatではオブジェクトが新規作成されますよ
非破壊的メソッドとはそのようなものです
>>177 意味不明…。
> オブジェクトの新規生成はそれほどコストが高いということでしょうか
この結論は、
>>166 の比較で concat のコストが高い理由が、
まるでオブジェクトの新規生成のみが原因とでも言ってる様なんだけど。
公平な比較もできてないのに。
>>178 代入が遅いと思い込んでいるようですが、代入=名前へのバインドのコストなど、
オブジェクトの新規作成と比べたらごくごく微々たるものですよ
http://jsperf.com/dainyuu このように代入が一つだろうが二つだろうが差はないのです
むろん差はありますが、ベンチマークの処理に飲み込まれてしまうほどその差は小さいのです
これが事実です
>>181 jQueryは使ったことないのですが、これはjQueryですよね?
具体的にセレクタって何をさせばいいんですか?
if ( ['a','b','c'].indexOf(a) < 0 ){} このような命令をループの中で実行する場合、 ループのたびに配列は別に作成されるのでしょうか?
>>180 で、以下の 2つで比較しない訳は?
a.concat(b);
Array.prototype.push.apply(a, b);
>>184 面倒くさいからです
気になるなら比較してみたらどうですか?
186 :
184 :2013/09/23(月) 22:44:15.57 ID:???
いや、勘違いしてるのは俺の方だな。
>>182 <a>
<b>
</a>
だったら"a>b"がセレクタ
jqueryでああかいとけばわざわざradioをオブジェクトを入れなくてもいいし、radioを増やそうが減らそうがコードはあのままでおk
とにかくJavaScripterなら読むべき本をあるだけ教えて
>>187 おお!それはすごい
早速やってみます!
どうもご丁寧にありがとうございました
オライリーJavaScript第六版 オライリーJavaScript Good Parts オライリー ハイパフォーマンスJavaScript オライリー メンテナブルJavaScript
O'Reilly以外には良本ないの!?
JavaScript第六版に載ってるよ
いや、MDNレベルでしか乗ってなかったからあえて皮肉で言ってるんだけど……
俺はMDN読んでもいまいちよく分からんなぁと思ったけど、サイ本読んだら分かったけどね そもそもさほどインパクトのある機能でもないと思う
esprima&escodegenで関数中のvarを集めて関数の頭に持ってくるスクリプトが形になりました varの散在したコードが一瞬でスマートになってかなりいい感じです ただesprimaはコメントを文法ツリーと分けたデータにしていて 文法ツリーの書き換えをした場合、コメントの位置情報を修正するのが困難です コメントも文法ツリーに入れていてくれれば楽だったのに。 どうすればいいですか?
インパクトはないかもしれないがES5の数少ない機能の内の御三家だし、 ES5が下地になるES6やその先のためにも、この概念は中級者の必須項目として理解しておきたい
ES8ってなにもうそんな話がでてたよ
200 :
Name_Not_Found :2013/09/24(火) 00:24:25.25 ID:9UbBiTed
>>193 いい加減宣伝やめてくれ。
うざいんだよ。
201 :
Name_Not_Found :2013/09/24(火) 00:33:53.38 ID:9UbBiTed
>>197 でもさ、これからはletを使って、ブロックレベルのスコープやるでしょ?
その時どうやって元に戻すの?
ES7で入りそうなもの ↑ ・ES6の補強(ES6に間に合わなかったもの) ・数値型系の大拡張(8xbit、巨大数、十進数、分数、複素数、その他SIMD系など) ・演算子の拡張(モジュロなどの追加) ・DOMからの逆輸入(PromiseやWorker) ・型情報付加(guard) ・部分マルチスレッド処理(Parallels) ・メタプロ大拡張(演算子オーバーロード、ValueProxy) ・遅延評価、遅延コール ↓ それ以降か、無しになりそう その他注目的な動向 ・DOMがJS標準になる? ・typeof再設計の試み再び(typeofを設定可能に?、typeof null = "null")
元に戻すとは?
おれ馬鹿だからわからないけどこれ
>>193 でprototype汚染が解決されるの?
good partsには、paerseIntが載っていて、parsefloatが載っていない のは何故なのでしょうか?何か意味があるのでしょうか?
一言で言えば「解消される」だが、いろいろ言いたいことがあるな。
まず汚染というのがfor-in等での列挙の事であれば、それを使わなければいいし、そういう風潮になってきたこと。
それから
>>193 はそういう機能があることの説明ではなく、もっと踏み込んだものであること。
綺麗に汚染できる
え、paerseIntはとうぜんbad partsとして載ってるんだよね?
forinとかwithみたいな嫌われた構文を使わなければ汚染なんて関係ないこと
>>203 要するにvarじゃなくてletを使えって言ってるんだよ。
そうすれば上に持ってこなくて済むじゃん。
paerseIntはCSSの〜pxみたいなときのパースでしか使うことはない 今はinput要素には.valueの他に.valueAsNumberがあるのでそちらを使うべき 勿論n = +strもとてもいい
>>211 その話は色んな奴がこの前したがダメなんだとよ
Object.prototypeがライブラリ同士でバッティングしててもこれからは忍者のように隠れてわからなくなるってこと?
javasriptは次から次へ似たようなAPI出てきてカオスすぎるわ
letって今普通に使えるんですか? MDN見たらまた不確定機能みたいに書かれてますが。 しかも let で宣言された変数はそれを取り囲んでいるブロックの先頭へ引き上げられます。 ってletも巻き上げられるんじゃ?
>>214 列挙されないってだけだよ
上書きを防止することもできるけど
>>216 それは旧仕様
具体的にはFirefoxが昔から導入してた
ES6の元になったJS1.なんちゃらではそう
実際のES6やChromeの実装では巻き上がらない
だからMDNの情報は古いことがあるから鵜呑みにするなって前言ったろ。 とは言ってもES6に関してはESwikiは勿論、 ドラフトもところどころ、なんと1年も反映が遅れてる部分もあるから注意。
ES6にletがあっても今現在のコーディングが変わるわけでもないし だから何としか言いようがないですね
>>209 はい。ひどいパーツで載ってました。
>>212 自分は、<div id="a1">199</div>
の199を$("#a1").html()で取得すると文字列になっているので、
文字列199を整数の199にするためにparseIntを使ってました。
.valueAsNumberってどのブラウザでも動くのでしょうか?
ieはどのバージョンから対応してますか?
HTML5ベーシックの一部だから HTML5対応をちょっとでも謳うんなら実装してないとおかしい
>>222 ありがとうございます。
10ですか、私のwebサイトではie8まではサポートしてるので
とりあえず、paerseIntを使っときます。
parseFloatってgood partsに載ってないのは、紙面に限りがある
とかですかね?
クロックフォードスタイルがletによって変わるかは疑問がありますね 宣言しなければ自動的にローカル変数になる言語になったならともかく 宣言が必要ならば、ブロックの最初でするのがベストなのでは? 最初に宣言しておけば、それ以降は宣言したかどうかを気にする必要がないので。 varでもそうですが、多重宣言にならないように気を付けるのは面倒なものです
letの多重宣言はコンパイルタイムエラーだから発見が容易だし varの多重宣言はと言うのはズレてる、スタイルに関連する問題ではない
ズレてるのは自分では・・ 言葉の意味は分かりますが文章全体としては何を言いいたいのか全く分かりませんよ
>>225 それは歴史が証明している。
他の言語でブロックの最初で定義する人は
もうほとんどいない。
何が言いたいのか分からんのはそっちだよ でも最大限推測してあげて色んなケースを考えてみたけど varの重複を気をつける必要があるシチュが思いつかない
変数名の重複を気にしなければならないほど巨大な関数をつくろうとしているのが問題なのでは。 普通に書いてればそんなこと起こらないでしょ。 そもそも似たような名前の変数を同じ関数内で宣言しなければならないという状況自体、 同じような処理を何度もやろうとしてるとかしか思いつかないんだけど。
変数名の重複ではなく宣言の重複の話です。
宣言を重複させる例 function foo() { for(var i = 0; i < 10; i++) { ・・・ } for(var i = 0; i < 10; i++) { ・・・ } } これよりも、こう書くがいいでしょう? function foo() { var i; for(i = 0; i < 10; i++) { ・・・ } for(i = 0; i < 10; i++) { ・・・ } } 理由はvarを上にまとめたほうがいいという言ってる人が説明してね。
それこそletを使えば良いじゃん なぜわざわざvarで重複させたり、 iが必要ないforの外でまでiを参照できるようにしとく必要があるの?
どっちがいいかという話でletは関係ないお
letのサポートSafari×、IE10以上って結構ザックリいくんだな
デモもあったけどURLが長いんで、 traceur-compiler online で検索してくれ 右上のoptionsに全部チェック入れると letもアロー関数も対応してるのがわかる。
>>193 よく見たらコンステレーションって人、escodegenの作者なんですね
>>232 これは非常に気持ち悪く感じる…感性の問題かもしれんけど
他の言語では大抵重複宣言はエラーになるから、 意識する様に習慣付いてるという理由で JavaScript でも それに従う、という程度かな。
他の言語のやり方に従うというであれば、 使う所で宣言する習慣にしたがえよw
sには10進数の文字列が入っていてほしいんですが、sにはいろんな型が入っているかもしれません parseInt(s, 10)でint型に変換してint型で利用したいんですが いい方法教えてください parseInt("0x0a", 10)と parseInt(0x0a, 10) は 0 と 10 になるのでNG。元が16進数なので省きたい parseInt("true", 10) やparseInt(true, 10) は NaN になるから省けるのでOK
+'0x0a' //10
16進数を10進数に直したいのではないんです とにかく第一引数が10進数の整数・文字列じゃないときは全部NGにしたいんですよ
if(typeof s == "symbol" || !(""+s).match(/^\d+$/)) throw "10進数値だけよ";
>>246 0x0a // 10
"0110" // "0110"
0110 // 72
10.0 // 10
/\d*\.?\d*/ とか? 1.0e6みたいな表現にも対応するのは面倒だな。
if(!Number.isFinite(+s)) throw "じゃあの"
これでFA if (parseFloat(s,10) != +s) throw "んじゃの"
>>251 callとapplyの実行時間の差より配列作る時間の方が長かったりしない?
別に同じ意味のプログラムである必要はないんだから、callも配列作って渡してみれば?
なるほど 確かに配列の作成はコストが高そうです ありがとうございました
arrayが参照されないから最適化されちゃってるんじゃないの? 両方とも配列渡しちゃえよ
IEはapplyの方が早いし、Chromeはそんな差がないじゃん
配列を渡したらそれはそれで両者の条件が変わりますよ というかそこが本質でないのは明らかです この大きな速度差はどこから来ているのか?という問題が主題です
a = [1,2,3..略..99999] って1から99999まで入ってる配列があります これをメモリデバッガなどで値を書き換えるってことは加納ですか?
>>257 大きな速度差はfirefoxだけだから、たぶん配列に関する最適化の差だな
配列か否かだけでこんなに差が出るわけがないと思いますが。 関数オブジェクト自体を作り直してるんじゃないかという勢いです bindは関数オブジェクトを作ると聞いた記憶があるので 内部でbindしてるのかもしれませんね
遅いapplyを使ってるapply.pushより遅いconcatって・・プークスクス
>>261 大きな差があるのはfirefoxだけなのは確認した?
firefoxのcallのほうは配列に関する処理をまったくやってない可能性がある
bindは全く関係無いよ
二倍近い差は充分に大きな差ですが・・ bindは全く関係ないとか、知らないのに何で言っちゃうんですか?プークスクス
>>262 本来用途の違うものを比較してプークスクスって・・プークスクス
>>261 applyが内部でbind使うの?callは使わないの?
firefoxで大差、chromeで2倍弱、IEで結果がひっくり返るってことは たぶんJSの最適化関係なんだろうなw firefoxのこれはたぶん無茶なインチキくさい最適化してるw
引数が動的に与えられるとキャッシュが効かないとかかなぁ
IEではapplyの方が早いのを全く無視して話をすすめるのか
じゃあapplyの中でcall呼んでるんじゃね?
>>268 > bindが内部でapplyを使っているようですね
どこにそんな記述がある?
そもそも bind は function オブジェクトを返すもので、
bind 呼び出し時は関数は実行されないから、apply の実行速度と
全く関係ないと思うけど。
apply - 関数呼び出し bind - applyのthisの参照をクロージャで維持した関数を返す bindの実装でのapplyの使用のされ方ってこんな感じかな?
普通に考えるとapplyの方が素に近い処理じゃないか? 可変長の引数の取り扱いより、配列1個受け取ったほうが処理は楽だろ?
なんでやねんw インターフェイスが確定されないんだからパフォーマンス落ちるのが当然
applyよりもcallが速い理由を考えるんじゃなくて applyは遅くない!と何故か主張しだすアホはなんなんだw
呼び出しより配列確保の影響の方が大きいというのは
わりと面白い推測だと思うけど
>>275 でIEだけ傾向が変わってるし
VB2012PROのアプリケーション作成でjsを用いてるのですが、なぜか画像が表示されません(
http://i.imgur.com/wbCbetF.jpg )
<img src="C:\Users\User\Documents\Visual Studio 2012\Projects\App2\App2\images\BOfcow-CAAE48Nz.jpg large.jpg" />
この文のどこに問題があるのでしょうか?
\ \ \ \ \ \ \ \
>>282 画像はあきらめてCanvasで自己解決しました
チャットみたいに1行文字列を要素の下に追加していく場合 obj.innerHTML += "<div>aaaaaa</div>"; ってinnerHTMLを使うのが一番良いですか?
いいえ
どうやるのが一番いいですか?
appendでしょうね
最適化のためにローカル変数に代入しまくるとか オブジェクトのループ書くためにObject.keys書きまくるとか面倒くさくなってきました coffee scriptか?とも思うけどcoffee scriptにした後にcoffee scriptが廃れたら・・とか不安です どうしたらいいですか
ループはsublimeのスニペットで何とかなりますかね〜
オブジェクトのキーの列挙に最適化なんて要らん ローコル変数のキャッシュも同じく そういう細かい所はエンジンの責任 あとはパレードの法則に従えば限られてくる だがその前にアルゴリズムを疑え 最適化気にする奴が書くコードは質が悪い 最適化っていうのは良いコードを書いて最後にちょこちょこっとするものだ
オブジェクトのループと言う時点で結構怪しい。
if (hoge) a =1 else b=1; だとエラーになり if (hoge) a =1;else b=1; だとエラーにならないのは何故ですか?
パフォーマンスを気にしないで書けるほどJavaScriptの最適化が進んでいるとは思いませんが。 むろん理想的にはそうです。
ありがとうございます 早速読んでみました ifステートメントのconsequentがブロックステートメントでない時は ステートメントの終わりが分からないということだと思います しかしelseが出てきたならその時点でステートメントの終わりなのは明らかです 現に他の言語では;を必要としないものも多くあります 何故JSでは;を必要とするのでしょうか?
特殊なケースを覗いてわざわざ悪い書き方をしてないのに遅いんならエンジンの責任。 逆に最適化ノウハウはエンジンごとに違うから多用するものではない。 結局、「「素直」」に書くってのが一番大事。素直にね。 苦しんで書いたコードとかメンテの面でも良くない。
>>294 パフォーマンスを全く気にしないで良いなんて言ってないがな
パレートの法則でggr
>>297 JavaScriptではステートメントの最後に;を付けなければいけない仕様だから。
これがいやならCoffeeScriptでも使うか、仕様変更を提案してください。
パレートの法則なんてもちろん知ってますが。 2の部分にはチューンが求められるでしょう その部分を楽に書きたいんですが
質問に対して奇妙な前提を持ち出して「それは違う」とか言い出す人は何なのでしょうか
一つの関数の中に同じ変数名が複数回出てきた時に 自動的にローカル変数に置き換えるような そんなソースコードオプチマイザがあればいいのではと思うのですが そういうのありませんか?
ぶつからないように名前付けに自分ルール作る
インプットに文字入力するとヒットしたキーワードが一瞬でセレクトボックスみたいなのに表示されるやつあるじゃないですか あれってどういう仕組みなんですか?
>>303 ここは質問に対してはある程度制限を設けてる
おまえは無視してるみたいだけど
回答に対しては特に制限を設けてない
任意の前提を付け加えた回答を書き込むのは自由
>>289 「面倒くさくなってきました」
挙句に「不安です、どうしたらいいですか」
典型的なゆとり、低脳。
>>197 この件ですが、コメントを文法ツリーに入れた上で、それをunparseするunparserを書いたらいいのでは?
と思い、escodegenクローンのようなものを作り始めておおかた形になってきたのですが
その結果、文法ツリーは緻密でコメントを埋め込められるような代物じゃないということが分かりました
だからescodegenは分けて出力してたのですね・・
どうすればいいですか?
2の部分にObject.keysが必要なことが驚き 十中八九ボトルネックになるのはDOM操作のはずなんだが 設計を疑った方がいいのでは? ゲームなんかでロジックの最適化が重要な場合でも キーの列挙が出てくるケースが思いつかないし 適当に言ってるだけでは? それにちゃんと構造化してれば沢山書き換えることにならないはずだよ 取り敢えずどんなことがしたいのか、ソースコードを教えて欲しい
アンドロイドに特化したcanvasのライブラリおしえて
Androidにブラウザはたくさんあります
そう、だから特化したやつがほしいんだよ
ん?なんだって?もう一度お願い。
Object.keysはfor inループを避けるために使うのですよ そしてDOMアクセスの最適化も当然のことです 高速化が必要な部分では可能な限りチューンする 当たり前のことです
forinループやObject.keysがそんなに必要になる事自体おかしい。 ソース見してみ。
頻繁にループで舐めるデータ構造なら配列を使ったほうがいいんじゃないか?
つーーれーたーつーれーたーー♫
オブジェクトのループがめずらしいと言っちゃう人がどんなソースを書いているのか興味ありますね オブジェクトのループのないソースコードなんてほとんどないのでは?
ループの順序を逆順にすることは、 プログラミング言語では一般的な最適化手法であるが、
一般的にはよく理解されていない。
JavaScript においても、 ループの順番をひっくり返すことによって行う処理を減らすことができるため、
ループのパフォーマンスをわずかながら向上させる。
という「ハイパフォーマンスJavaScript」の記述を信じていたのですが、
ふと思い立って試してみたところ、
http://jsperf.com/for-loop-hikaku 驚くべきことに逆順ループの方が遅かったです
しかも、洒落にならないレベルで。
これは一体どういうことなのでしょうか?
PHPのhttp_parse_cookie()のように Set-Cookieの値をオブジェクトにする機能またはライブラリはありませんか? あれば教えてください
「一般的にはよく理解されていない」ことをすると 最適化の進歩の網から抜け落ちてしまうということでしょうか・・
糞ワラタt
testとupdateを一度にするというトリッキーさが気にはなっていたのですが。 トリッキーな最適化は環境の進歩と共に非最適化になってしまいがちなのでしょう 注意してくださいね
テストを単一の条件でのみ試して結論付ける馬鹿って何なの?
は????
こんなに短い文章なのにまじで何言ってるか分からん
誰か
>>326 が何言ってるのか訳して
あごっち知らない奴はJavaScriptのもぐりかHTML5expartを見てないボンクラ
>>329 知り合いの外国人数名に聞いたけど
誰も知らなかったよw
とりあえず普通の日本語を書いてくれないとツッコミもできんw
一般オブジェクトのループなんてどこで使うんだ? JSONを列挙するときや 置換用のテーブルオブジェクトのキーを列挙するときくらいしか無くないか?
どんなプログラム書いてんだよww
質問に対して正面から答えられないやつほど「そんなことしないだろ」とか言い出すよね お前がするかしないか知らねーよw 分からないなら黙っとけよ
どんな回答をするのも自由
自分が気に食わない回答を罵倒するやつはここに書き込むな
>>335 な〜に言ってんだこいつ
皆真正面から答えたがそれでも質問者が納得しないから
解決に向けて折り合いを付けてる段階だろうが
さらなる意見を貰いたいんならこちらの要求に答えてソースコード出すなりしろよ
「回答」じゃないんだから問題ないなw
一般的問題なのにソースコード出せとか意味不明 問題にだけ集中しろ 分からないなら黙っとけ お前の意見は何の役にも立たないんだから
343 :
Name_Not_Found :2013/09/26(木) 00:07:09.93 ID:tuUPKup3
もうお前らID出して書き込め
>>342 ここは分からない人が黙らなければいけないなんてルールはありませんよ
ルールに従わない人は黙っててくれませんかね?
345 :
Name_Not_Found :2013/09/26(木) 00:10:19.87 ID:rgFe7zwL
上げていくか
347 :
Name_Not_Found :2013/09/26(木) 00:11:55.46 ID:FKDqe9WW
あれ・・・
348 :
Name_Not_Found :2013/09/26(木) 00:13:15.80 ID:FKDqe9WW
とりあえずオブジェクトをループで列挙して処理する目的を知りたいな これは質問です
>>345 これ。
「面倒くさい」とか「不安」という主観的理由が発端で、
それについて「どうしたらいいですか」と。
289 :Name_Not_Found:2013/09/25(水) 11:48:20.07 ID:???
最適化のためにローカル変数に代入しまくるとか
オブジェクトのループ書くためにObject.keys書きまくるとか面倒くさくなってきました
coffee scriptか?とも思うけどcoffee scriptにした後にcoffee scriptが廃れたら・・とか不安です
どうしたらいいですか
>>348 一意のlDをふったオブジェクトの集合を扱っているので
IDをキーにしてテーブル的に処理しています
オブジェクトのループなんてしないよ派は たとえばkey-valueストアを配列にしろとでもいうのでしょうか? 配列に格納できないデータをオブジェクトに入れるのはごく自然なことだと思いますが。
うん。普通は index-key-valueにする
353 :
Name_Not_Found :2013/09/26(木) 00:44:25.22 ID:rgFe7zwL
どうしたいのか言えよ for-in&getOwnは良くてkeysが面倒だという話じゃなくて もうコードを書くのがだるいな、愚痴聞いて同情してくださいよーってことだろ
>>352 それは何ですか?
>>353 愚痴ではありません
最適化の自動化が可能ではないか?
だとしたらそれはどのようなものか?という問題です
パーサ&アンパーサをいじったり作ったりしているのは、それを踏まえてのことです
何の話をしているかしらんけど、underscoreかlodash使えば オブジェクトのキーとかの問題は全て解決する。
Object.keys使うにしてもfor-in-hasOwnProperty使うにしても 各所にそのコードが散らばるとかはないなあ 走査用の関数作って各所ではそれを使うだけだ
だから、_ つかえって。
358 :
Name_Not_Found :2013/09/26(木) 01:20:00.91 ID:tuUPKup3
hasOwnProperty を使わなきゃいいだけ しっかり管理されてるなら for in で構わんよ
だから _ 使えって言ってるだろ。
var a='<a href="〜" id="PC">nm<\/a>'; から、文字列nmだけ抜き出してきて、 var bに格納するやり方を教えて下さい。 また、実際には、変数aは$("#aa").html()で 取得した値なのですが、取得すると<\/a>でなく </a>となるのは、javascriptの文法上まずくないでしょうか? 対処策があれば教えて下さい。 <div id="aa"><a href="〜" id="PC">nm</a></div>
$("#aa").html()なんかいらんだろ? var b = $("#aa").text(); で一発で取得できる。 divの中に他に文字列があったとしても var b = $("#aa a").text(); これでよい
>>360 var a='<a href="〜" id="PC">nm<\/a>';
var r = new RegExp(/>([^<]*)/);
var m, b;
if (m = r.exec(a)) b = m[1];
alert(b);
/
jqueryのajaxでasyncをfalseにすると 直前のcss変更が聞かないんですがなぜですか? asyncがtrueだと変更できるんですが $(obj).css(〜); $.ajax(){ 〜 }.done(〜) .fail(〜);
ブラウザが固まるから
同期するということは全てのcss適応が向こうかされるってことですか?
固まってる間反映されないだけ
underscoreって便利関数集ですか〜 なかなかよさそうですね string系のユーティリティーも欲しいところです
多重ループになるとkeysとkeyとlenが大量になって間違えがちなので ループするオブジェクト名をプレフィックスにして hogeKeys,hogeKey,hogeLenとしたらいいと気付きました ありがとうございました
>>367 通信する前にcssを書いてるのに反映されないっておかしくないですか
>>371 Aの仕事が終わったらBの仕事やれ。暇になったらCに反映しといて
って言ってるような状態
>>321 この件についてですが、
for ( var i=100-1;i>-1;i--);
とすると、当然ですが通常ループと変わらないパフォーマンスが出ました
この書き方だと
var i=array.length-1
と書けて一時変数lenが必要なくなるのでいいかもしれません
お次の方どうぞー
javascriptでwebページ全体を画像にするっていうのあるじゃないですか あれはどういう仕組みなんでしょうか?
|::::::::::::::: ∧_∧:::::::::::: __ (´・ω・`) :::::::: すみません、ここでうんこしていいですか? ◎ー) / \::::::::: | | (⌒) (⌒二 ):::::::::::: ~~~ /⌒ヽ( ̄、 ヽ___ / Lヽ \ノ___ ゙ー―――(__)---
ループ数が少ないとfor inの方が速い? それともキーの名前によって変わる?
382 :
Name_Not_Found :2013/09/26(木) 21:22:34.68 ID:S0oMH2UQ
addEventListener()などでリスナーがセットされたオブジェクトに対して あるリスナー(イベントハンドラ)がセットされているかどうか確認する方法はあるんでしょうか? 例えばhasEventListener()のようなメソッドを定義できないかと考えています # 擬似コード obj.addEventListener("click", handler1, false); obj.addEventListener("click", handler2, false); obj.hasEventListener("click", handler1); #=>true (or false) しかしハンドラがどこに保持されてるかは見えないように思われます(直接アクセスできない?) どうでしょうか
ページの下までスクロールされたら特定の処理がしたいんですが ページの下にいる状態で横スクロールを動かすと処理が動いてしまいます どう改善したらいいのかアドバイスください obj.addEventListener('scroll', function(){ // ページ下までスクロールされているか判定 }, false);
Object.keysにより配列オブジェクトを新規作成するコストが for inループで余計にかかるコストをうわまる間は、for inの方が速いということでしょうね それだけオブジェクトの新規作成は処理的に重いと・・
>>383 IEとfirefoxはfor inの方が早いよ
IEはfor inの圧勝
本当ですね そうなるとシンプルなfor inの方がいいな 結局何もしない方が良かったということに・・(´;ω;`)
縦スクロールだけイベントを発生させる方法ありませんか?
う〜ん ページ下部に移動したら処理を実行させるサンプルをいろいろ見て回ったけど どれも横スクロールは考慮されてないものしか見つからない・・・ 無理なのかな
ステップ数の多い関数の方がより少ない回数の呼び出しで最適化対象になるから
ありがとうございました
394 :
Name_Not_Found :2013/09/27(金) 10:27:52.28 ID:c6HtV5qr
そんなことができてしまったらマズイ
>>394 > ステータス欄に表示するものとリンク先を別にする
これができたらフィッシング詐欺し放題になってしまうのでセキュリティ上不可。
そもそも、ステータスバーに何かを表示するという事自体、
リンク先情報などが見えなくなるから最近のブラウザはできないようになってるはず。
どうして出来ないと思うのよ? mousedownでリンクを変更したらいいよ Google検索とかで当たり前に使われてるでしょ
毎日アクセス解析でニヤニヤしてるクソ野郎を一泡吹かせるためにさ リファラを書き換えてキチガイナところからアクセスされてるようにみせたい どうやって相手サーバに任意のリファラを送信できますか?
HTTPリクエストを書き換える
モーダルウインドウは、ウインドウ外クリックで消えるべきですか?
array.uniq的なことがしたくなったのでアンスコを使おうかと思うのですが やはりこういったユーティリティーライブラリではアンスコが代表的なのでしょうか?
アンスコってなに?
underscoreです
>>389 現在のスクロール位置を調べて前と縦位置が変わってなければ無視
するようなハンドラをつければよくない?
preventDefaultをする必要のあるclickイベントって たとえばどういうケースですか?
規約に同意のチェックボックスがチェックしてたら次のページに移動したいとき
407 :
Name_Not_Found :2013/09/27(金) 19:12:30.75 ID:vV9NbbQ0
あほな質問ですが 変数名って取得できますか? コンソールに出力するときに var hoge = 1; console.log('hoge',hoge); と書くのが面倒、ってだけなのですが
jQueryで$("#foo")のように取得したオブジェクトは 内部でキャッシュされてるのかな 何度も呼び出すときは var foo = $("#foo"); のようにしてfooを持ち回した方がいいんだろうか
>>407 意図がいまいちわからない。
仮に、getVariableName(hoge)で変数名が取得できたとして(実際は不可能)、
console.log('hoge', hoge);
って書くのと、
console.log(getVariableName(hoge), hoge);
って書くので面倒くささが変わるとは思えない。
肝心の可否については、windowのプロパティを全て列挙して中身が一致するものを探索する、
とかすれば不可能ではないと思うけど、
不正確だし、少なくとも直接書く以上に簡単になるとは思えないね。
現在のタイムスタンプをGMTで取得したいのですが、どのようにすればいいですか?
>>407 windowオブジェクトの中にその変数名が入ってる
>>409 されてないよ
だからキャッシュしたら速くなる
>>410 >>407 ようするにこうしたいんでしょ。
function mylog(value) { console.log(getVariableName(value), value); }
値から変数名は無理だけど逆ならグローバル限定ということにすれば。
function mylog(name) { console.log(name, window[name]); }
var a = 100; ってやったらaはキャッシュされてるのですか?
100がaにキャッシュされてる
417 :
409 :2013/09/27(金) 21:52:11.86 ID:???
>>413 ありがとう。よく考えたら、取得したノードは変更されるかもしれないし
キャッシュされたら困る局面もあるよね・・・
「配列が指定個数以上あったら指定個数に制限する」みたいな関数は underscoreにないのですか?
firstで出来ました 失礼しました
配列のuniq uArr = [...new Set(oArr)]
何でアンスコって略すの?
アンスコっていうとアンインストールの略にしか思えん… それに _ って直接書いたほうが打鍵数少ないし楽じゃないか?
JavaScriptをJSと言ったりするようなものです
lodashはindexがあるかどうかを確認してない 例えばネイティブで [0,1,,,4,5].forEach は4回しか呼ばれないがlodashは6回呼ばれる ネイティブはin演算子で確認してる分だけオーバーヘッドがある
ネイティブ関数って中身はJavaScriptなんですか?
空きのある配列をforeachすることなんてあまり考えにくいから lodashのやり方の方がいいですね ありがとうございました
特権JSってなんぞ じゃあそれ使ったら超速いコードが書けるんですか??すごくないですか
裏JavaScript・・!?
どちらがいいというか仕様の問題。 そもそも速度が必要な操作では関数コールのforEachはNGだし、 今も昔も配列はforで回すに限る。 標準の関数使える環境でわざわざライブラリのを使うのは変態だと思うし。
>>429 ,430
V8やNodeで「--allow-natives-syntax」つけて起動すると%付きの関数使えるよ
%OptimizeFunctionOnNextCall(func)とか
もしかしたらChromeでも
--js-flags=--allow-natives-syntax
でできるかもね
そんなに早くはならないと思う
精々色んなチェックの分のオーバーヘッドが無くなるくらい
これが通じる奴はゆとり ・ジェキュー ・ジャミ ・ジャモ ・アドイベ ・プロタイ ・フォイ
window.location.reload() document.location.reload() この違いってなんですか?
ない
document.location == location //true
document.location == window.document.location // true
438 :
434 :2013/09/28(土) 06:02:29.73 ID:???
回答どうも 違いが理解できませんでしたが、 どうでもよさそうなので気にしないことにします
location == document.location == window.document.location // false
window.location は書き換え可能 document.location はIE以外書き換え可能
441 :
Name_Not_Found :2013/09/28(土) 10:41:24.59 ID:ctMqRiXE
b=a.replace(/(a+)/, 'A'); alert(RegExp.$1); c=b.replace(/(b+)/, 'B'); alert(RegExp.$1); 2回目のreplaceでマッチしなかった時にRegExp.$1が変わらない(1回目のalertと2回目のalertが同じ)って当然?
JavaScriptでバリデーションする場合によく使われるライブラリって何ですか?
JSHint使って良いJavaScriptを書くためには Enforcing optionsは全部trueにしたほうがいいですか? Relaxing optionsは全部falseにしたほうがいいですか?
>>432 オプション付けないと使えないんですね
特殊な記法をすれば普通に使えるのかと勘違いしてテンションあがってしまった
ありがとうございました
>>443 自分で意味を理解していないと
良いJavaScriptは書けません。
>>443 内容を読んで、自分に不要だと思ったものだけをOFFにすればよい。
裸のJS想像しながらjQueryってヤツだな
JSHintのmaxstatementsは関数ごとのステートメントの数を制限するそうですが このステートメントのサンプルを誰かください
ステートメントのサンプルって何 行数が多い関数を警告するだけでしょ
>>448 いくらなんでも一つの関数にこんなに
行数が多いとかありえねーよwww
って数値を指定しておけば良い。
即時関数の中に全部いれるパターンだとどうなるんだろ
さっぱりよくわかりません サンプルコードをください
ブラウザのように戻ると進むの機能を実装します A→B→C→D と移動したあと 戻るボタンを二回押し、 A→B に戻ったあと、 A→B→E と別ルートに行ったとすると、最初のC→Dルートには、戻る・進むボタンでは行けなくなるのでしょうか?
A→B→C→D→C→B→E 履歴を記録しといて、履歴からたどれば
>>453 ブラウザではどうなりますか?
ブラウザのように実装するのでしょう?
>>454 そういう正味の履歴も、ないと不便なので付けてあります
>>455 chromeでは消えるみたいです
ただブラウザによってはどうも違うみたいで、実装が謎なんですよね
実装が謎な理由が今分かりました google検索では、A→B→A→Cと行っても、「戻る」からBが消えない 検索エンジンではそういう動作の方が便利なので、これはどうも履歴を操作してそうしているようです wikipediaで移動してもそういう動きにはならない つまりgoogle検索で試していたから良く分からない挙動になっていたようです
B消えるだろ
解決したんだからぶり返すな
$(document)をキャッシュして使用していました scrollハンドラの動作がおかしいので調べたところ、 キャッシュした$documentにスクロールハンドラを付けた時には一度しか動作せず 関数内で$documentを作り直した時には動作するようです しかし$(document)は、作り直そうがキャッシュしようが同じものではないのでしょうか? scrollハンドラ以外で問題出ていないのも謎です こんな問題に当たった人いますか?
キャッシュの問題ではなく、他のイベント内でスクロールハンドラを付け外ししてるので、 その時に外しちゃってるみたいです 失礼しました
chromeデバッガでconsole.dirしたオブジェクトを その後変更すると、console上のdir出力も書き換わってしまい 出力された時点のオブジェクトではなくなってしまうのですが これを解決する方法ありますか?
>>461 この件ですが、
$(document).off('scroll', 存在しない関数)
となっていたため、第二引数がundefinedになり
その結果documentにbindされた全てのscrollイベントがリムーブされていたのが原因でした
/* jshint devel:false */ console.log(1); これでエラーにならないのはなぜですか?
エラーになる理由がない
jshintの設定でdevelをfalseしたらalertやconsole系で警告がでるはずなんですよ
ドットインストールいいね 独学だと基礎的なところをぽろぽろ落としてたりするから助かる
でないでないでないでない 表記は464で書いた通りなのにでないでないでない jshint v2.1.11
Environmentsの設定だけなぜか効かない
ちあんみにnpmからいれたjshint
npmから入れたら古いだろう?
npm空入れても公式の最新2.1.11です
OSから再インストールせよ
sublimeのJSHintを使ったらいい
数値を最小値と最大値の間におさめるなど 数値関係のユーティリティライブラリありませんか? underscore.numberというのがあったのですが、上記のような関数はないようです
>>476 飽和演算とかsaturationでググると吉かも。
1つのページでPOSTとGETをするフォームがあるのですが、 そこをXMLHttpRequestで非同期で処理しています。 XMLHttpRequestは2つインスタンスを作成するべきでしょうか? それとも1つを使い回ししていいのでしょうか?
>>476 作るは簡単なんだけど、適切な関数名が
思いつかないんだよね。
>>477 軽く飽和演算で検索してみたけど、
演算した時に飽和する話が多かった。
>>476 > underscore.numberというのがあったのですが、上記のような関数はないようです
おい、あるじゃねーかw
https://github.com/hanamura/underscore.number pinch _.num.pinch(num, min, max)
Puts num in a range of min to max.
Returns min if num is smaller than min, max if num is larger than max, and num itself if it’s already in a range of min to max.
_.num.pinch(12, 0, 10); // 10
_.num.pinch(5, 0, 10); // 5
_.num.pinch(-3, 0, 10); // 0
(function(){ function AAA() { var a = document.getElementById('a'); var F = function() { //処理 }; a.addEventListener('load', F, false); a.addEventListener('click', F, false); } window.addEventListener('load', AAA, false); }()); ページロード時とaをクリックしたときにFを実行するために上のように書いてみました。 a.addEventListener('load'〜ができないのでここを window.addEventListener('load'〜に変えたけど動きませんでした。 色々ためしたものの拉致があかなかったので、 (function(){ function AAA() { var a = document.getElementById('a'); //処理 a.removeEventListener('click', AAA, false); a.addEventListener('click', AAA, false); } window.addEventListener('load', AAA, false); }()); このようにしてみたところうまく動きました。 これで大丈夫でしょうか?なおすところがあったらご指導お願いします。 jQueryに頼らない書き方を覚えたいのでjQueryはなしでお願いします。
10x400くらいの数字が入った二次元配列をtableにして表示するのに高速な方法教えてください。 それに最初の行の各セルに異なるclickイベントを付けたいです。
>>482 よくわかんないけど
array[tr要素10個][td要素400個]
こういうこと?
for'()する時毎回length取得するんじゃなくてfor(vari,len=array[tr要素1].length; i<len; i++)
ってやるぐらいしか
質問ですが、 GoogleってJavaScriptコードを外部ファイルではなくHTML内に記述していますよね?(cssもそうですが) これって何か理由があるのでしょうか? JSファイルは外部ファイルにすべきと聞いてそうしていたのでとても気になります。 外部ファイルにした方がブラウザのキャッシュを利用して読み込みを軽減してトラフィックとかも減りますよね? もし理由がわかる方いらっしゃれば教えてください。
485 :
Name_Not_Found :2013/09/30(月) 11:52:12.15 ID:VtFspj3d
>>484 逆にキャッシュに残らないようにしてるんじゃね?
>>480 あれ本当ですね
早とちりでした
ありがとうございました
関数の実行時間を測る簡単な方法を教えてください
491 :
Name_Not_Found :2013/09/30(月) 18:06:43.10 ID:VtFspj3d
console.time()
performance.now()
>>482 2次元でなく単次元のTypedArrayを使う
どうしても2次元が良ければBinaryDataのArrayTypeを使う(ES6)
hogeという変数?オブジェクト?とdocument.getElementById('hoge')が連動するのは仕様なのでしょうか? var hoge = document.getElementById('hoge'); alert(hoge.value); という感じで今までやってたのですが、ふとしたことからいちいち定義しないでも、 alert(hoge.value);でいけることに気づきました。
仕様
operaなんだが、 var obj = { "items": [] }, val1 = "---", val2 = "==="; obj.items.push ( {"p1":val1, "p2":val2 } ); として、 var str = JSON.stringify (obj); とすると、 {"items": [ {"p1":"---", "p1":"==="} ] } にならずに、 {"items": "[{\"p1\":\"---\",\"p2\":\"===\"}]" } となるのは仕様?
気のせい
500 :
Name_Not_Found :2013/09/30(月) 23:41:14.65 ID:CvGcS7pT
expressフレームワークとはMVCなのでしょうか? MVCとぐぐってもMVCみたいにでてませんが なんという分類でしょうか?教えてください
デファクトスタンダード
opacityを使ったフェードアウト時 残像が残っていることに気付きました opacityに0を設定し、それを読んでも実際に0なのに、 スクリプトの実行中は opacityが0.1くらいの薄さで残るのです どうすれば解決できるでしょうか ブラウザはchromeです
503 :
Name_Not_Found :2013/09/30(月) 23:52:49.55 ID:CvGcS7pT
>>501 意味わかりません
MVCとはどうちがうのでしょうか?教えてください
M=Model V=View C=Controller なのですが MVCじゃないフレームワークはどのような感じなんでんしょうか? MVCじゃないとどういうのか教えてください
MVCデザイン以外を知らないとかゆとり世代ですか?
ソートするテーブルのセルにbuttonを入れています。 buttonにはイベントが設定されているのですが、 ソートするたびにイベントを追加しています。 イベント追加前にイベントを削除する処理は入れなくてもいいのでしょうか? メモリリークとかなんかしますか?
>>502 の件ですが、
どうもDOM操作の直後に重い処理をすると、処理の間はDOMに反映しないようです・・?
opacityが0になったら関数としてcallbackを呼び出していたのですが、 0に設定した後もsetTimeoutでcallbackを呼ぶようにしたら、 CSSへの反映の後にcallbackが呼ばれるようになりました\(^o^)/ ありがとうございました
そういうことになるから jQuery使えってことになるんだよ。
jQueryで出来るってことは使わなくても出来るってことなんだよ
使わないのが効率悪いから jQuery使うんでしょ?
512 :
Name_Not_Found :2013/10/01(火) 03:22:54.28 ID:euIGZs7o
時間測ったりした結果を配列とかに入れてるのですが、これをjson形式やデータベースの形に変換してファイルに出力するためにはどうすればいいでしょうか? Javascript単体でできるのでしょうか?またはPHPなどを使うのでしょうか?
function JSONDL(data) { var json = JSON.stringify(data) var blob = new Blob([json], {type: 'application/json'}) var link = document.createElement('a') link.href = URL.createObjectURL(blob) link.download = 'mydata.json' link.click() }
【環境】windows7 64bit home chrome
【何をしたのか】
http://orteil.dashnet.org/cookieclicker/ というブラウザゲームを起動し、F12でconsoleを呼び出し、以下を記述。また、ブックマークに登録し、起動してからブックマークレットとして呼び出す。
javascript:
for(var i = 0 ; i < 100 ; i++ )
{Game.ClickCookie();}
または
Game.ClickCookie();Game.ClickCookie();
【エラーメッセージ】なし
【期待する結果】複数回Game.ClickCookie();を呼び出したい。
また、ブックマークレットにも登録したい。
【サンプルコード】上記です。
ブラウザゲームを少しいじってみようと思ったのですが、うまくいきませんでした。
sourcesを直接書き換えればうまくいきますが、consoleの使い方も覚えたいのと、ブックマークレットという機能も使えるようになりたいと思っています。
ソースのGame.ClickCookieは以下のようになっています。ゲームの作者もソースをパクらなければ改造ぐらいはしていいよ、とのことでした。
Game.ClickCookie=function(){
if (new Date().getTime()-Game.lastClick<1000/250){}
else{
if (new Date().getTime()-Game.lastClick<1000/15){
Game.autoclickerDetected+=Game.fps;
if (Game.autoclickerDetected>=Game.fps*5) Game.Win('Uncanny clicker');
}Game.Earn(Game.computedMouseCps);
Game.handmadeCookies+=Game.computedMouseCps;
if (Game.prefs.particles) Game.cookieParticleAdd();
if (Game.prefs.numbers) Game.cookieNumberAdd('+'+Beautify(Game.computedMouseCps,1));
Game.cookieClicks++;
}
Game.lastClick=new Date().getTime();
}
まともな回答帰ってこないなココ。
例えばどれがよ?
>>514 そのGame.ClickCookie()関数は4ms以内に複数回呼び出した場合、
1回呼び出したことにしかならん
Game.ClickCookie();Game.ClickCookie();とか書いても4ms以内に
終わるだろうから意味ない
ちょっと違った 前回の呼び出しから4ms経過してないときは何もしないだった ループで回しても、;で区切って続けて書いても、 各呼び出しの間は4ms未満だと思うので最初の1回以外は意味ないね たとえループで1秒間延々と回したとしても、意味があるのは最初の1回だけかな
オブジェクトの最初を簡単に取得する方法はありますか? var obj = {1:"1",2:"2",3:"3"}; if (obj.item(0)) { //objに何か入ってる } みたいな感じにしたいのですが、 Object.keys(obj).length > 0 とかでもいいのですが、わりと新しく導入されたようで、 IE8ぐらいでも平気な簡単な方法があれば教えてください。
質問失礼します。 javascriptのcanvas上の矩形内にhtmlを表示したいです。 しかもそのhtmlが貼られた矩形を回転したいです。 可能ならばhtmlを画像化せずに表示したいのですが、可能でしょうか? (回転表示が行えるのであれば、無理にcanvas上じゃなくても良いです) よろしくお願いします。
521 :
Name_Not_Found :2013/10/01(火) 11:46:59.66 ID:JEpLn2iz
トップに縦500px、横1200pxのGifアニメを置いています。 これが完全にスクロールアウトして何秒も経つとブラウザが固まりやすいので それを防ぐために、 下へスクロールしていったときにGifアニメを高さ100pxだけ残して固定させて スクロールに追従させたいんです。 まず、そのGifファイルを<div id="top-bar"></div>で囲みました。 次に、以下を<body></body>間に置きました。 <script type="text/javascript"> var zahyou=scrollTop(); if( zahyou > 400 ) { document.write('<style type="text/css">div#top-bar{position:fixed; top:100px;}</style>'); } else { document.write('<style type="text/css">div#top-bar{position:static;}</style>'); } </script> 動作確認してみると、上手くいきませんでした。 (そのGifアニメが通常通り完全にスクロールアウトしていってしまいます。) どこをどのように直せばいいか、教えていただけないでしょうか。
for for in forEach それぞれどういうときに使うんですか?
>>519 for-inとhasOwnPropertyならIE8でも使えるんじゃないの?
>>520 画像にしたく無いならCSS3のtransform:rotate()とか試してみれ
>>522 forは普通の制御構文
for-inはオブジェクトの中身を順番に処理するときに使う
forEachは配列を順番に処理するときに使う
配列の場合でもforEachは使わずforを使う人がけっこういる
classNameに複数のクラス名が記述されている時、 それが分割されて格納されている配列ってDOMの中にないんですか?
528 :
521 :2013/10/01(火) 15:14:41.99 ID:s69EcN0o
document.writeを使わない代わりに次のコードをhead内に記述しました。 <link rel="stylesheet" type="text/css" href="kousei1.css" id="kouseiCSS"> <script type="text/javascript"> var zahyou=window.scrollTop(); if( zahyou > 400 ) { document.getElementById('kouseiCSS').href = "kousei1.css"; } else { document.getElementById('kouseiCSS').href = "kousei2.css"; } </script> kousei1.cssにはdiv#top-bar{position:static;}と記述し、 kousei2.cssにはdiv#top-bar{position:fixed; top:-400px;}と記述しました。 しかし、実際に400px下へスクロールするとGifアニメの下部100px分は固定されませんでした。 1度ページを読んだ後に2種類のcssをスクロール位置で切り替えることは 不可能なのでしょうか。 他に方法はありませんか?できればコードで記述してくださると嬉しいのですが。
>>528 window.scrollTop()ってエラーでない?
CSSのlinkタグにid属性つけてhref書き換えるって動くんだなw笑えるw
そういえば昔のsafariは、ページ読み込み後にhrefを変更しても CSSが反映されないバグがあった気がするけど、あれもう直ったのかな
ここはクロスブラウザの罠に嵌めて楽しむスレだから気にするな
536 :
521 :2013/10/01(火) 21:48:54.22 ID:???
結局、 $('#top-bar').css({ 'position': 'fixed', 'top':-400, }); みたいな記述でスタイルを切り替えることになりました。 ソースコード検索をしたら色々と例が見つかったので ソレを利用すればなんとかなりそうです。 ChromeとIE7で挙動が違うのが気にかかりますが・・・
537 :
514 :2013/10/01(火) 22:30:04.41 ID:???
ありがとうございます。 最後に document.getElementById('bigCookie').onclick=Game.ClickCookie;})(); が足りないのが原因でした。ご迷惑おかけしました
stopPropagationでは他のライブラリへの伝播が止まってしまい困ります 自前のハンドラに対する伝播だけを止めるにはどうしたらいいですか?
jqueryのイベントオブジェクト e,handleObj.selectorにセレクタが入っている時と入っていない時があるのですが どのセレクタで反応したのか必ず調べるにはどうしたらいいのでしょうか
つまり同種のイベントは同じゲートウェイを通過させたいのです
ハンドラのセットの仕方が間違ってたのでselectorがないだけでした すみません
542 :
Name_Not_Found :2013/10/02(水) 02:27:36.85 ID:++jRA9WW
Apacheにて、下記の設定をし、 <FilesMatch "\.(gif|jpg)$"> ExpiresActive Off </FilesMatch> HTMLに下の記述をし @<img src="hoge.gif" width=30 height=40> A<script type="text/javascript" src="saitama.js"></script> JavaScript部分(saitama.js) document.write('<img src="saitama.gif" width="40" height="30" />'); ※実際はもっと複雑です。 @のflower.gif画像ファイルのログを見ると、キャッシュされてないため、これを埋め込んだHTMLにアクセスがあった分だけログに記録されますが、 AのようにJavaScriptで埋め込んだ画像saitama.gifはキャッシュされてしまっているようで、二度目のアクセスはアクセスログに記録されません。(F5なら記録される) Aもアクセスログが記録されるような書き方はありますか? JavaScriptを使うなと言えばそれまでですが、JSでどうにかしたいのです。
ジェイクエリーのイベントをconsoleに出力する方法を教えて下さい
544 :
Name_Not_Found :2013/10/02(水) 10:11:26.64 ID:3vucsB+Q
chiba.gif?hoge,getTime()
jqueryのイベントを付ける順番によってパフォーマンスは変化しますか?
ハンドラでthisを参照できない問題は以下のように解決できるのではないでしょうか? var a = { b:function b(){ console.log(b._this.c); }, c:'hoge' } for ( var key in a ){ if (typeof a[key] === 'function'){ a[key]._this = a; } } a.b();
普通にbindすればいいじゃん
bindは遅いのです
549 :
Name_Not_Found :2013/10/02(水) 11:44:54.98 ID:Y2SqMS34
>>546 var a = {
b : function(){
var A = this;
console.log(A.c);
},
c : 'hoge'
};
こう書くのはもう古いんだろうか…
>>549 それだとbを呼ぶときにa.b()としないとだめだよね
551 :
Name_Not_Found :2013/10/02(水) 11:51:24.17 ID:Y2SqMS34
どゆこと?
>>546 はx=a.bとかやってx()で呼び出す場合に、
関数bの中でaをthisとして参照できない問題を解決したいんじゃないの?
$(document).on('click',a.b); などとすると、thisではbからaを得ることが出来ないのです
554 :
Name_Not_Found :2013/10/02(水) 12:02:29.68 ID:Y2SqMS34
あー、なるほど 結局、thisキーワードを使わなければ良いのだね?
sageるの忘れてたすまん $(document).on('click',function(evt){ a.b(evt); }); こうするのと、どっちが効率よいのだろう
ビルド方式はイニシャルコストがかかりますがハンドラ呼び出しコストは低いというメリットがあります
もともとオブジェクトを走査していくクラスビルド関数があったので、 $_で始まる関数名を持つメソッドに親オブジェクトを持たせる機能を組み込んだら いい感じになりました
addEventListenerの第二引数にオブジェクトを指定すると オブジェクトのhandleEventメソッドを呼んで、thisはオブジェクトを指してくれるらしいので IE8以下用にaddEventListenerをエミュレートする関数を用意してあげれば多くのことが解決するのでしょうか?
そんな仕様あったっけ? いずれにしろ呼び出されるのがhandleEventメソッド固定ならほとんど使い道がないような
>>559 関数でラップせずに閉じたスコープが作れるとか
>>559 逆にイベントを直接受ける関数を1つにまとめられるからかなり有用だよ
イベントオブジェクトが引数に必要な関数ばかり作ると、
イベント発生の時にしか呼べない関数が多数できることになるし。
同じところで受けたかったら同じメソッドを指定したらいいだけでは?
ありがとうございます イベント的にはルートノードが上なんですね
stopPropagationで止めるとすると、イベントを遮りたいすべての要素にイベントを付けないといけなくなるので bodyのclickハンドラでe.targetを見て判定したいと思います $(document).on('click','body',fn) とdocumentにデレゲートした場合、 e.targetのイベント発生元情報がデレゲート元オブジェクトに変わっているようです e.targetを使う場合はデレゲートは使えないということでしょうか
すみません勘違いでした stopPropagationしてたからe.targetが変わってただけでした(∵)
すいませんがもう不必要です^^;
570 :
567 :2013/10/02(水) 19:28:56.29 ID:???
↑なり済ましです!
ここまで全部偽者ですw
ワロチww
>>568 ありがとうございます
同じやり方でした
ですので不必要でした(∵)
すべてのイベントを一つのハンドラで受け取り そこから分配するのは確かにいいかもしれませんね
とても勉強になりました
jqueryではイベントがfocus→focusin、blur→focusoutに名前が変わっているようですが何故ですか
ライブラリだけの質問はライブラリスレでお願いします。
querySelectorのセレクタについて質問です <div> <p><a>いいい</a></p> <a>あああ</a> </div> div.querySelector(""); あああ だけを取得したいのですが、どのようなセレクタを書けばいいでしょうか? イメージ的には > a のような感じです
document.querySelector('div > a').textContent
if(/version ([0-9\.]+)/.test(ua)) vn = RegExp.$1; else vn = 0; のようなことをやってたのですがRegExp.$1〜$9は廃止予定で非推奨と聞きました RegExpオブジェクトを使わない場合どのような書き方ができるのしょうか
>>581 RegExp.exec()の結果を使う。
vn = (ua.match(/version ([0-9\.]+)/)||"00")[1]
>>583 すげ〜感心したが、その後でif(vn)とかやってると結果が
>>581 と変わっちまわない?
ならどれでも好きなのをどうぞ vn = (ua.match(/version ([0-9\.]+)/)||[0,0])[1] //オリジナル vn = (ua.match(/version ([0-9\.]+)/)||"00" )[1] //文字列型 vn =+(ua.match(/version ([0-9\.]+)/)||"00" )[1] //数値型
キモ
これも好き vn = ua.match(/version ([0-9\.]+)/) vn = vn ? vn[1] : 0
変数に入る型がバラバラなのは気持ち悪いな
だからもし
>>584 の場合は数値に揃えないんなら
0の代わりに空文字にして
最後出力する時に
vn || '0'
とした方がいいな
このやり方だとバージョンがないよと言う状態を持たせておいて
バージョンがなければ0にするっていうのがわかりやすい
vn || '無し'
みたいにしたくなってもとても良い
数値と文字列はしっかり区別したいところだね。 やっぱり型付が緩い言語で一番問題になるのはここだから、 使う時じゃなくて事前に揃えておいた方がいいと思う。
>>582 のアドバイスをいただいたあと色々調べて最終的に関数化しました
ありがとうございました
var r, ua = navigator.userAgent;
if(r = /MSIE ([0-9\.]+)/.test(ua)) return "IE " + r[1];
else if(r = /Chrome\/([0-9\.]+)/.exec(ua)) return "Chrome " + r[1];
else if(r = /Firefox\/([0-9\.]+)/.exec(ua)) return "Firefox " + r[1];
〜
else return "";
これはひどい。。。
誤植だろ
Chrome、Firefox、IE9で開発をしています。 ソースコード中に旧型の8進数リテラルがあり、strict modeではエラーになります。 そこでモダンブラウザが対応している新型に切り替えたのですが、 今度は当然レガシーブラウザでエラーになります。 可読性を崩したくないのですがどうするのが一番よいでしょうか? 場合によってはレガシーブラウザは切り捨てます。
chromeでよく落ちるようになり、バグるようになりました デバッガで追っていくと突然落ちたり、本来実行するべきじゃないところがいきなり実行されたり。 ロールバックすると起きなくなったのでコードに原因があったようです JavaScriptで変なことをしても影響が環境の枠の外に及ぶのはおかしいと思うのですが なんでそんなことが起きるんですか
chromeがバグったんじゃね?
困りますな〜
嘘乙 証拠のビデオうpはよ
調べてみるとどうも宇宙線の影響だそうで、稀によくあることらしいです ありがとうございました
今まで一つのハンドラで受けてtargetで分岐してたのを、 jQueryのデレゲートに置き換えたのがやったことです その結果変な風になりました 一つのハンドラで受けていた場合、その処理が終われば他の同種のハンドラに飛びませんが 要素ごとにデレゲートした場合は飛ぶので、その結果変なことになったのか あるいはbootstrapとの相性か 何なのか分かりませんが
jQuery固有の問題はライブラリスレで
jQuery固有の問題ではありません
で、何が聞きたいの? 変なふうになったってのしか伝わってこないんだけど?
本気で答えて欲しい質問じゃなくでっち上げなことがすぐ分かるなw
原因不明な異常なことが起きてるので 同種の体験談とか経験知があればお聞かせください
ライブラリスレへどうぞ
ライブラリはJavaScriptで書かれているんですよ ライブラリの正常な機能に関してならばライブラリスレにも行きましょう 事件はライブラリではなくJavaScriptで起きてるんです
ソースも貼らないで人に伝わる言葉も選ばない 日記や愚痴は他所でやってくれ ここは真剣に質問する場所なんだから
(6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。 ※必ず「問題の事象が再現されること」を確認してください。 必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。
足りないことは具体的に聞いてもらわないと こちらとしても答えられません
原因が不明なんだからソースを抜き出すことも不可能です 分からないことに文句を言うつもりはありませんので、 分からないのなら黙っておいてください
偽物が出始めましたね 問題をまとめると 「何をするとJavaScriptはブラウザをクラッシュさせるのか?」 ということです 回答お待ちしております
わかる。 わかるよー。 寂しかったんだね。 おーヨチヨチ
ブラウザの実装が不十分ならよくある話 WebGL、WebAudio、WebRTC、IndexedDB、Worker 全て何回も落ちた経験がある そういうもん
>>612 ついにでっち上げ質問の内容も忘れたかw
哀れwwwwww
Chromeを再インストしたの?拡張機能全部切ってみた?dev版使って無いよね?
ありがとうございます 不合理にあらわれる突然の穴を避けるには、 なるべくトリッキーなことは避けるくらいしか方法ないですかね。。
トリッキーっていうのは
>>585 みたいなのを言うんだぜ
言葉は正しく使おうな
>>616 ロールバックしたら安定したので再インストールなどはしていません
今はロールバックしたコードから
徐々に不安定なコードに近づけて原因を探してるところです
分かったら教えてくれよな あ、経過報告は要らないからね 黙って頑張れ!
空の<div>を生成して短いテキストを入れたいとき、 innerHTML, innerText, textContent, nodeValueで一番速いのはどれですか
早いとかクソじゃなくて その使い方だと紛れも無くtextContentがもっとも適切
どんなに適切でなかろうが数倍の速度の違いが出るなら早いほうを取る
使い方が適切な方がいいに決まってる それを顧みない最適化は文字列連結にjoinを使うのと同じですぐに破綻する
GeckoとSM、BlinkとV8プロジェクトは今DOMをJSエンジンに組み込むことを もっとも重要な目標の1つにおいてるから速度なんて容易に変わり得る。 ECMAも乗り気だし。
>>590 の関連です
バージョンを比較する関数を作ったのですが何か腑に落ちません
もっと効率化する方法や、もっと常識的な設計はあるのでしょうかか?
function versionCompare(a,b) {
var i, l = Math.max(a.length,b.length);
_a = a.split('.');
_b = b.split('.');
for(i = 0; i < l; i++) {
if(_a[i] === undefined) _a[i] = 0; else _a[i] = parseInt(_a[i],10);
if(_b[i] === undefined) _b[i] = 0; else _b[i] = parseInt(_b[i],10);
if(_a[i] > _b[i]) return -1;
if(_a[i] < _b[i]) return 1;
}
return 0;
}
あ、すいません Math.max(a.length,b.length) は split の後でしかもアンダーバーが抜けてますね・・・
しかも_a, _bがグローバル変数に・・・修正しました function versionCompare(a,b) { var i, l, _a, _b; _a = a.split('.'); _b = b.split('.'); l = Math.max(_a.length, _b.length); for(i = 0; i < l; i++) { if(_a[i] === undefined) _a[i] = 0; else _a[i] = parseInt(_a[i],10); if(_b[i] === undefined) _b[i] = 0; else _b[i] = parseInt(_b[i],10); if(_a[i] > _b[i]) return -1; if(_a[i] < _b[i]) return 1; } return 0; }
if(+a > +b) return -1; if(+a < +b) return 1; return 0
>>628 屋上に寝室、地下に露天風呂くらいめちゃくちゃ
基本の真ん中辺りからやり直した方がいい
台所に滑り台がある感じ
初心者は焦ってコードを組み立てようとしないで1行1行の意味を考えて書こう。 全体を整えることを意識するのはそれができるようになってから。
自分でも何か変だなとは思うのですが、どこが悪いのか分からない状態なので質問しました できれば一つ一つ指摘していただけないでしょうか
まずaとbに何が入ってくるのかハッキリさせよう
"12.34"とか"30"とか?
それと
>>629 は試したの?
オブジェクトってピラミッドの頂点がwindowで windowsの下に幹部がいて 幹部の下に手下がいて その下に派遣社員みたいな役割がいる こんな認識であってますか?
>>634 引数a,bはバージョン文字列ですので"10.2"とか"12.4.25"などです
>>629 は試しましたが望んだ結果にならずよくわかりませんでした
>>635 それでいいよ
>>636 そういう大事なことはちゃんと言わないと
皆超能力者じゃないんだから
スリム化したいんならこれでいいんじゃない a = a.split('.'); b = b.split('.'); for(var i = 0; i < Math.max(a.length, b.length); i++) { if(a[i]|0 > b[i]|0) return -1; if(a[i]|0 < b[i]|0) return 1; } return 0;
バージョン名に 1.0.3b みたいなアルファベットが入る可能性はないのか。
>>594 の件ですが、
古いクリックハンドラは処理する対象がないとfalseを返すようになっていて、
するとjQueryはstopPropagationとpreventDefaultを実行します
つまり意図せずに、イベントが止まりやすくなっていました
それを新しく書き換えたので、今まで止まっていたイベントの伝播が発生するようになりました
その結果<a href="#"></a>で画面が移動するようになり
その現象を解明するために色々コードを書いてるうちに不安定になりました
どうすれば不安定になったのかは分かりませんが、
きっかけとなった現象の原因は分かったのでこれでよしとします
ありがとうございました
再現性のないブラウザがちょっと落ちたくらいで一々騒ぎ立てんな
再現性はありますよ 継続的に何度も落ちまくったのです 勝手に補完しないように
【サンプルコード】現象を再現可能な最小限のコードを書いてください。
原因が不明なのだからコードを抜き出すことが不可能なのは自明です そのテンプレこそこのスレのバグです 次に立てる人はデバッグして下さいね
意地っ張り乙 お前のPCの調子が悪いのかもしれないだろうが 日記はお断り
助けてください!原因不明です! ↑ マジ基地ワロタw
単に事実を述べているだけですよ コードを抜き出せるようになるのはデバッグの最終段階でしょう バグに悩まされている人にコードを抜き出せなどと言うのはナンセンスです
>>638 undefined|0で0になるんですね、すごくシンプルになりました
>>639 そこまで考えると大変ですね・・・
ありがとうございました
あちゃー 言葉が理解できない人だったか… 失敬失敬 もう帰っていいよ
>>647 主要コードを抜き出せないなら全部公開すればいいだけの話
自分のローカル環境だけであーだこーだ言われても
こちらとしては再現性が全くないから嘘や戯言と同じでしか無い
ライブラリを組み合わせる場合、 たとえばクリックをstopPropagationをすると開いたポップオーバーが閉じない、 という現象が出てきますね stopPropagationは基本的には使わず、 preventDefaultは何か処理した時には基本的に行なう、 という感じがいいでしょうか?
>>649 =650
自演の人格批判をして何が楽しいんですか
こちらは質問スレらしいレスしかしていないので
人格批判ですぐ話を逸らすあなたに言われるようなことはありませんよ
ブラウザのデフォ動作を防ぎたければpreventDefaultを使う
>>652 質問の仕方が下手すぎるんだよ
上手な質問の文章を作るという作業は
回答をもらいやすいというだけでなく
良いコードを書く上でも大事なんだぜ
全部公開しろとかアホすぎて何も言えんわ
こちらが提示できる条件は全部出しました これ以上できることはありません
解答者傲慢すぎww
自演乙
イベントハンドラの中でイベントハンドラをappendしたら 追加したハンドラにも、その当該イベントは伝播しますか?
JavaScriptってオブジェクトじゃないですか 例えば = とか + とかそういうのも上書きしたりできますか?
661 :
Name_Not_Found :2013/10/04(金) 00:22:57.40 ID:QHzg+peO
>>660 一行目で何を言いたいのかわからんかったから詳しく
オーバーロードは無理
オーバーロードはES7までおあずけ
array.sortの代わりにクイックソートを使ったら速くなったりしますか?
古いバージョンだったのですか ありがとうございます これは努力の甲斐ありますね
一番速いFFpop+を更に合理化してみました 配列の処理は基本的に重いのでベンチには現われませんが。 あなたはこれよりキュンキュンに出来ますかな? function qs(array) { var pivot,left,right,v,len; len = array.length; if (len <= 1) { return array; } pivot = array.pop(); left = []; right = []; for (; len>1; len--) { v = array.pop(); (v < pivot ? left : right).push(v); } return qs(left).concat(pivot, qs(right)); }
669 :
Name_Not_Found :2013/10/04(金) 08:49:14.13 ID:1DC/3sxI
ユーザーが入力したURL文字列を受け取り、 それを検証して妥当であるか、Public Suffixは含まれているかを調べたいのですが、 Public Suffixを調べるにはどう処理をすればいいでしょうか? また、そういうLibraryがあれば教えてください。
あごさんがmasterブランチにプルリクエスト送ってることにショック そこは別のブランチ作って送信するべきなのに・・・・
配列操作しない方が速いよね。某テキストに載ってたものをJS化。 function qs0(array) { qs1(array, 0, a.length-1); return array; } function qs1(a, i, j) { if(j <= i) return; var pivot = a[j], s = i; for(var k = i; k < j; ++k) if(a[k] <= pivot) { var x = a[s]; a[s] = a[k]; a[k] = x; ++s; } a[j] = a[s]; a[s] = pivot; qs1(a, i, s-1); qs1(a, s+1, j); }
げげ、 a.length-1 => array.length-1
そこまでするのならasm.jsとTypedArrayを使うべし V8も型決め型への対応を進めてる
asm.jsは4,5回書いたが未だ慣れん とにかくエラー表示が昔のIE並でデバッグかしづらくて敵わん
誰が早いと言った?
!?
http://benchmarkjs.com/ このベンチマークを使おうと思って
<script src="benchmark.js"></script>
と読み込んでサンプル通り
var suite = new Benchmark.Suite;
を実行するといきなりエラーになりますが
どうしたらいいのですか?
>>638 ,639
バージョン比較関数ですが、最終的にbなどにも対応させてこんな感じになりました
function versionCompare(a,b) {
if(typeof a !== "string" || typeof b !== "string")
throw new TypeError('引数が文字列でないか、引数が不足しています');
var f = function(c) {
if(!c||/^[0-9]/.test(c)) return c|0;
if(/^[a-z]/.test(c)) return -123 + c.charCodeAt(0);
if(/^[A-Z]/.test(c)) return -91 + c.charCodeAt(0);
};
if(!(a = a.match(/(?:[0-9]+|[a-zA-Z]+)/g))) a = ["0"];
if(!(b = b.match(/(?:[0-9]+|[a-zA-Z]+)/g))) b = ["0"];
for(var i = 0, l = Math.max(a.length, b.length); i < l; i++) {
a[i] = f(a[i]);
b[i] = f(b[i]);
if(a[i] > b[i]) return -1;
if(a[i] < b[i]) return 1;
}
return 0;
}
chromeのコンソール出力ですが 大量に出力しリアルタイムに状況を見たい場合にスクロールアウトして不便です 上に追加されて下に流れていけば見やすいと思うのですが なんとかする方法ありませんか?
いやしくもコンソール出力なら出力に追随しろと思うんですが・・
>>665 今の今まで「JSぷれふ(jspref)」と勘違いしていた…
>>130 それは保守しにくくてバグを生みやすいコード
>>680 window.clear = console._commandLineAPI.clear
とコンソールに打つ
プログラム側でclear()してから再度今までのログを書き出すようにする
昔、JSコンソールがなくて、テキストエリアで手作りしていた頃の value += '¥n' + '新しいログ'; とするか value = '新しいログ¥n' + value とするかの話じゃないのん?
クリアしなきゃ無尽蔵に溜まって重くなる 毎回クリアしてラスト数十件くらいを出力 それ以前は必要に応じて出力できるようにするのがベスト
こうだな console.clear = console._commandLineAPI.clear
>>675 qs0は渡された配列をそのまま整列するじゃない。ベンチマークの方で毎回
新しく配列を作って渡すんでないとへんなことになりそうだよね。
ありがとうございます consoleっていろいろ機能あったんですね console.timeとかも便利そうだ
そもそも上のソートは浮動小数点演算だから SMIの範囲だとまた変わるよ
あと要素数が少なければ当然オーバーヘッドの問題も出てくる
連想配列の中にあるデータを取得したいのですが いちいちキーを指定して取得するのが大変です 連想配列には配列など色々入ってるのですが 一気に全て展開する方法ありませんか? 教えてください
例を書いて もし出力表示のことをいってるのならconsole.dirだけど きっと分割代入を求めてるんだと思う
四つの整数から最小のものを得る一番速い方法を教えてください
s = a<b ? a<c ? a<d ? a : d : c<d ? c : d : b<c ? b<d ? b : d : c<d ? c : d
>>696 自分の環境じゃ後者のほうが微妙に早いよ
698 :
692 :2013/10/04(金) 20:55:57.21 ID:???
答えてください
質問の意味が分からないから答えようがない
エスパーだと配列のjoinみたいに全要素の値を文字列として欲しいんじゃないか?
ちゃんと質問しろよ
>>698 「一気にすべて展開」がどういう意味なのかちゃんと書いてくれ
一次元配列にするってことじゃね
704 :
669 :2013/10/04(金) 21:46:25.05 ID:1DC/3sxI
解決しました。 お前ら無能すぎ
配列のintersectionっていうんですか 重複した値の抽出をしたいんですが 一番速い方法はどういうものですか?
といっても方法は 連想配列にしてキーをチェック、配列のままindexOfで検索、 の二択くらいですかね
firefoxの内部実装も基本的にfor function ArrayFilter(func) { var array = this; var buffer = []; for (var i = 0; i < array.length; i++) { var elem = array[i]; if (func(elem, i, array)) buffer.push(elem); } return buffer; }
711 :
Name_Not_Found :2013/10/04(金) 22:58:24.75 ID:1DC/3sxI
>>705 答えられなかった時点でお前は俺より下なんだが?
712 :
Name_Not_Found :2013/10/04(金) 22:59:06.31 ID:1DC/3sxI
自力で解決できちゃう俺ってやっぱすげーわ
それに比べて
>>705 みたいな奴ってほんと底辺だよな
エスパー募集スレと聞いて
>>711 上とか下とか言ってる奴に本当に出来る人間は一人もいない
715 :
Name_Not_Found :2013/10/04(金) 23:04:04.99 ID:1DC/3sxI
IDも出さずに口だけ達者って惨めだよね 俺は出来たのにお前は出来なかった っていう結果が出てるのに 現実見ような?
はい、次の方どうぞ〜
>>715 歩いてる横をいきなり全力ダッシュしてはい勝った〜とか言ってるピエロがお前だよ
719 :
Name_Not_Found :2013/10/04(金) 23:18:56.46 ID:1DC/3sxI
>>717 事実を突きつけられてよほど悔しいようだな
なんどもで言ってやるよ
お 前 は 無 能
いくら底辺でもそれくらい理解して自覚しておけよな
(4) 常に自発的に調べる心構えを持ってください。 自己解決出来るようなら質問しないでくださいね
722 :
Name_Not_Found :2013/10/04(金) 23:24:52.04 ID:1DC/3sxI
>>720 とうとう単芝まで生やしちゃったか、ダサいよお前
>>721 はい、すみませんでした
無能の皆さんには無理なレベルの質問でしたね
今後気をつけます
単芝って何だよw お前の文化圏の常識を持ち込むなカス ゴミだと自覚しなさい
貴重な絶滅危惧種を発見
>>718 filterParって何かと思ったらES7のparallelsなのかあ
おもしろい
単芝は単芝を使うような馬鹿にはわからない
お前の文化圏の常識を持ち込むなカス(キリッ
(単芝がなんなのかホントにわからないけど質問したら怒られそう)
>>718 ありがとうございます
結局filterが速いという結果で、三番目はエラーになりましたが・・?
>>728 ググればすぐわかるような事を質問したらそら怒られるわな
>>728 頭の悪い連中の間ではwを使うのがタブーらしいよ
そういう奴らの多くは困ったことにその村の常識が街の人にも通用すると思ってるんだよな
それがまさに自身の視野の狭さを示しているのだということに気付いていない
お前ら煽られすぎだろ 心に余裕ない奴等だなぁ・・・ 必死に粘着してる奴が若干1名いるが、顔真っ赤だぞ?少し落ち着けよ
w ↑ これ使ってる奴と使ってない奴で比べるなら、使ってる奴の方が頭悪く見える
それだとforが速いですね 一考の余地がありそうです ありがとうございました
>>709 と
>>735 みれば分かるけど
たったこれだけのバージョンの違いでもバージョンが上がるほど
ループの性能割合が上がってきてると見ていいと思う
どちらが早いとかに下手に拘る必要はない
それこそ速度に凝るならasm.jsとかparallels.jsの出番だろう
自然に書くのが一番
Parallelsとやらの効果を入れるとどうなの?
asmって何だと思ったら事前にコンパイルする機能ですか〜 でも、asm向けに書いて将来asmが廃れたらとか考えると、あまり積極的に使いたくはないかな
色を混ぜたり濃さ調整の計算をさせるのに便利なクラスってありますか?
jquery-color
>>740 事前にコンパイルするんじゃなくて、型情報を書いておくことで
JITが効率的に処理できるようにするだけ。
素のJavaScriptとしても実行できるから万が一廃れても問題ないよ
ChromeはJITがasm.jsソースの型情報を有効利用するような感じなものを暫定的に実装したらしい Firefoxはasm.jsソースをロードされた段階で全部ネイティブにコンパイルするのでJITとはちょっと違う
Objectのkeyに使用できる文字って、制限というか決まりはありますか? varの変数名だと決規則がありますよね(先頭に数字は使えないなど)。 なので、疑問に思って質問です。 例えばこんなのです。 var key = '.C\@[]{}",http;//test/?a=b&c=d'; var obj = {}; obj[key] = 'ok'; console.log(obj); 一応、Chromeでは正常に動作するようですが・・・こういう文字をkeyを使っていいものか正しいのか不安です。
決まりはあります
どんな決まりがあって、どこで規定されているのか知りたいです。
>>747 決まりはありません。
オブジェクトプロパティの名前には、空文字列を含む、文字列に変換できるあらゆるものが使えます。
748は馬鹿なので信じなくていいです。
ただし、JavaScript 識別子として正しくないプロパティ名にアクセスするには ブラケット(角括弧)表記法でのみしかアクセスできないので注意しましょう。
数字をキーにしても文字列に変換されるんですか?
748 Name_Not_Found sage 2013/10/05(土) 14:50:37.31 ID:???
決まりはあります
752 Name_Not_Found sage New! 2013/10/05(土) 15:07:03.88 ID:???
>>747 変数名にも制限はないよ
↑
これは酷い・・・
馬鹿は口を開かないほうがいいわ
>>750 いや待てwこれが決まりだろw
「空文字列を含む、文字列に変換できるあらゆるものが使えます。 」
>>756 そう、だから「使用できる"文字"に制限はあるか?」という質問に対しては無いだろ
>>757 質問はこうだぞ?
「Objectのkeyに使用できる文字って、制限というか決まりはありますか?」
nullは使えるんですか?はい論破
760 :
747 :2013/10/05(土) 15:28:41.79 ID:???
747です。
もう答えを頂き疑問も解消したのでこれ以上は申し訳ないですが結構です。
なんだから荒れ気味なので・・・。(ID出しておきます)
質問の意図を汲んで答えてくださった
>>750 さんには感謝します。
また、その他ご解答頂いた皆様もありがとうございました。
761 :
747 :2013/10/05(土) 15:29:19.19 ID:i7c2daZU
ID出し忘れました。
null,true,false,undefinedは使えるんですか?
関数も使えるな 文字じゃないオブジェクトそのものもいけるってことか a = {}; a[function(){return 10;}] = 123; console.dir(a); Object function (){return 10;}: 123 __proto__: Object
>>750 のようなまともな解答者がいる一方
見当違いな珍解答をする輩もいて面白いな、このスレ
俺も何か質問してみるか
null,true,false,undefinedも使えるな 変数名には無理だが 普段意識する事はなかったが、まぁトリビア的な意味で勉強になった var obj = {}; try { obj[undefined] = 'undefined'; obj[null] = 'null'; obj[true] = 'true'; obj[false] = 'false'; obj[/regexo/g] = 'RegExp'; obj[' '] = 'space'; obj[' '] = '空白'; } catch (err) { alert(err.message); } console.log(obj);
関数使えるのうそや これ文字列に変換されてキーになってるな nullもたぶん a={}; a[function(){return 10;}] = 123; a[null] = 456; Object.keys(a) // => ["function (){return 10;}", "null"]
いや、使える=文字列に変換されるって意味だろこの場合。。。
キーとして使えるっていうにはobj["null"]とobj[null]が区別されないとね
>>766 その意図だとa[function(){}]とa[function(){}]は永遠にイコールになることはないぞ。
文字列に変換するからこそ使えるわけで
>>769 実際はイコールになるから、関数オブジェクトがキーになってるわけじゃなくて
文字列に変換されてキーになってるってことを言ってるんじゃないの?
単にtoString()されて使われてるだけだろ はい論破
>>772 >単にtoString()されて使われてるだけだろ
null や undefined はtoString()できませんが?
また完全勝利してしまった・・・
敗北を知りたい
ワロタw
ハッシュは何故速いのですか?
>キーとして使えるっていうにはobj["null"]とobj[null]が区別されないとね ??? 区別されるわけねーじゃん
区別されねえから、実際にキーとして使われるのはnullじゃなくて文字列に変換された"null"だろうって意味だ
toString()じゃなくて、+"" と同じ変換か これどっか仕様に載ってる?
779 :
Name_Not_Found :2013/10/05(土) 16:44:30.02 ID:5DXO+IAv
ファイルの連結や諸々の処理にAntを使ってみようと思って試してるんだけど Windowsのコマンドラインで触ってる現状、 タスク実行でUTF8のソースファイルがSJIS(CP932=Javaのデフォルト文字コード)で読み込まれるらしく 日本語(の一部)が文字化けしてしまう。 AntからJavaのVMに渡るように文字コード指定するにはどうすれば??
一度だけ言う スレタイ嫁
>>779 スレチ
IDE使ってるならそこで設定できるんじゃね?
あと、俺の環境ではbatファイル(utf8)からの実行でもちゃんとutf8で読み込まれて問題ない
>>491 console.timeで測定できました
ありがとうございました
my $sock=IO::Socket::SSL->new( PeerAddr=>'example.com', PeerPort=>'110', Proto=>'tcp', Timeout=>20, ); print $sock 'Hello'; これをjavascriptでやりたいんですけど 接続させる方法あってありますか?
node.jsなら可
ブラウザのJSは任意のホストとのコネクションは張れん やるにはクロスドメインの設定が必要になる サーバ側にも設定が必要
>>778 12.1.5 Object Initialiser
PropertyName :
LiteralPropertyName
ComputedPropertyName
12.1.5.6 Runtime Semantics: Evaluation
ComputedPropertyName : [ AssignmentExpression ]
・AssignmentExpressionを評価してToPropertyKeyにかける
7.1.10 ToPropertyKey
・タイプがSymbolでなかったらToStringにかける
7.1.8 ToString
Undefined → "undefined"
Null → "null"
......
Object →
・ToPrimitiveにStringヒントを与えて呼び出す
・返り値を再びToStringにかける
7.1.1 ToPrimitive
Stringヒントが渡されて呼ばれた場合 →
・まず"toString"メソッドを試して成功すればそれを返して終わる
・次に"valueOf"メソッドを試して成功すればそれを返して終わる
>>784-785 私もnode.jsのsocket.ioだと思ったのですが
送信したり受信したりを非同期で行いたいのですが
どのように実装すればいいのでしょうか?
var socket = io.connect('example.com', {port: 110})
それでasyncってのを使うと思うのですが教えてください
バカ socket.ioはWebSocketであってTCPSocketじゃねえよ
>>786 7.1.8 ToString
Undefined → "undefined"
Null → "null"
やっぱりundefinedやnullもtoStringされてるんじゃん
ブラウザの挙動だけでは本質は見えないんだよはい論破
でもWebSocketはTCPSocketだよ。
>>788 そうですか・・・
これを解決するためにはどんなものを使えばいいのでしょうか?
いやWebSocketとTCPはレイヤーが違う 通常TCPってだけだし もう一度言うがそもそもレイヤーが違う 再度言うがレイヤーが違うんだから比較することがおかしい 転がるタイヤと車を比較してるようなもの
>>789 undefinedやnullは
文字列化されてるだけであって
toStringは呼び出されてないよ。
>>791 何がしたいのか具体的に。
まず、Node.jsなのかブラウザ上の話なのかわからん。
クライアントークライアント
クライアントーサーバー
サーバーーサーバー
のどれ?
具体的にどんなことがしたいの?
>>786 ありがとう、参考になったw
でもES3にもES5.1にも7.1.8とか見当たらんと思ったら、これES6なのね
ES5.1だとここだった
9.1 ToPrimitive
9.8 ToString
>>789 ネタでやってるんだろうけど、それはtoString()メソッドと違うw
文字列化されているということは実質的にtoString()されていると言えますが?はい論破
toStringメソッドとToString内部メソッドは違います
toString()されて使われてるだけだろ と述べただけでObject.toString()とは言っていない >null や undefined はtoString()できませんが? この答えは一つ。出来る。なぜならそうなっているから。 はい論破。
そもそも、nullやundefined そして数値などの非オブジェクト型には toStringメソッドは存在しない。
null や undefined はtoString()できません 何故ならToObjectでエラーになるから ToObject Undefined → Throw a TypeError exception. Null → Throw a TypeError exception.
なんか皆さんtoString()にこだわってるけど String(x) でいいんでしょ?
オブジェクトのプロパティの文字列への変換に使う抽象操作ToString()と 関数String()とは1点だけ違いがある
まずStringを挙げる時点で話の眼点がズレてる。
DOMツリーが複雑になると動作が重くなるのでこまめに削除・生成をしているのですが 作成する要素が増えると作成時の微妙な遅延が気になってきました DOMツリーにappendしない状態のままの要素を大量に作ってもやはり重くなりますか?
そりゃあ数に比例するだろ
フェードイン・アウトの間に作成したりと高速化の努力をしたのですが それでも微妙に気になるようになってきたんです どこにも繋がっていないDOMにキャッシュできたらいいのですが・・
>>803 mapって何ですか?
array.mapのことじゃないですよね
Map、Setコンストラクタのこと
MapとかSetとか現時点で標準で有効になってるブラウザはFirefoxぐらいだろ
V8は対応してるからChromeならchrome:flags、Nodeなら--harmonyで使える イテレータブルじゃないのがかなりネックだけど基本機能はある 特にWeakMap、WeakSetはエミュレート不可だから重宝する
標準厨は絶滅してください 世の中は広いんです
IEは多分12くらいになるんだろうな…… で、13でようやくES6完全対応と
ieもchromeみたいに自動アップデートにしたらいいのに ふるくせーな
IE7からWindows Updateでメジャーアップデートされるようになったじゃん。
テストしたところ、DOMツリーに追加しない要素は大量に作ってもパフォーマンスへの影響は小さいようでした
XPで8、Vistaで9、7,8で10は保証されてるはずなんだよなあ
ここは真剣に困った人が来る場所なの パフォーマンス厨はお呼びでない
??? パフォーマンスで困ってるんですが?
質問内容を見れば 単なるパフォーマンスマニアじゃないことは明らかだと思うのですが・・
分かるよ、分かる。 かまってちゃんだよね。
質問内容を見れば構ってちゃんなどではないことは明らかですが?
removeChildはoldChildを返すようになっています ということはやはり 便宜ツリーから切り離して再利用するのが定石なのでしょうか
・・・とか。。。とか???とかよく使う奴にろくな奴はいねえな このスレだとかまってちゃんと罵ってくる奴がよく使うんだよね
人の足を引っ張るだけが趣味のクズよりマシだと思いますが・・
処理をタイマーで定期的に分割実行するにはどうしたらいいですか? たとえば実行に時間のかかるループを、 指定した実行時間で分割しながら少しずつ実行する、など
JavaScriptのタイマー割り込みは、 タイマー割り込み処理中には発生しないのでしょうか?
しない setImmediateで回すと楽 Workerを使うのも賢い ぶつ切りにするのは調整が面倒だからオススメしない
workerですか 使ったことないのでどんなものか分からないですが調べてみます ありがとうござました
Workerも知らないパフォーマンス厨には流石に苦笑
障害のある方かな
?
DOMにはアクセスできない事すら知らないで 知ってたとかもうねw
すぐには使わないものを調べないのはごく普通のことですが? ネットで5分程度で分かるようなものなのだから さらっとした輪郭だけ知っておけばそれでいいのですよ 低能な人ほどネットで5分程度で得られる単なる知識を誇りたがるから困ったものです
自分から知ってるとか言い出したくせに支離滅裂だな(笑)
知ってるって言ったら、 完璧に知ってるのが普通ですよ。 俺、JavaScript知ってるしwww
「知っている」にそんな意味はありません
存在を知ってるだけで知ってることになるとは何たる暴言……
JavaScriptと直接関係ないかもしれませんが、Cometに挑戦しています。 Cometの実装方法についてなんですが、XMLHttpRequestをサーバに飛ばした後、 サーバはリクエストを確保(無限ループ)しておいて、 リクエストを返せる状態になったら返し、 返すものがなくても、ブラウザやサーバのタイムアウトを考慮して、 一定期間経ったら無限ループを終了して返す。 といった具合でいいのでしょうか? Ajaxと同じ手順で実装して、サーバだけ変えてみたのですが、 ローディング中みたいなブラウザのクルクル表示(時計表示)がずっと回ってるんですが、 Cometを謳っているチャットを見るとそのようにはなっていません。 何が駄目なのか分かる方いますでしょうか?
まずはwebに乗ってるサンプルコードで試してみたら? やろうとしてる事はそれであってると思うが、それだけじゃ分からない
あ、サーバー変えてるならクロスドメインの制限に引っかかってるんじゃないかな?
844 :
841 :2013/10/06(日) 09:56:12.02 ID:???
憶測しかできない解答はいりません。 黙っててください。
よっしじゃあみんなで憶測しようぜーw
やり方が根本的に間違ってる
そもそもクルクル表示以外の問題点、 一番肝心なサーバからのレスポンスを受け取れてるかどうかを書いてないとか
駄目な理由はわかるけど教えたくない
849 :
841 :2013/10/06(日) 11:21:11.29 ID:???
皆さんレスありがとうございました。
原因は単純なところにありました。
XMLHttpRequestのopenメソッドの第三引数にfalseを指定して同期にしていたせいでした。
後分かるとは思いますが
>>844 は偽物なのでスルーお願いします。
コードも出さずに、エスパーさせておいて、挙句の果てには自己解決 何がしたかったの?二度とくんな
別にID強制スレじゃないし偽物とかたち悪いだけ 偽物ごっこやりたきゃPHPスレに帰れよ
質問 → 回答者を煽る書き込み → 自己解決しました 何回目だと思ってるんだ? もう偽者じゃないし、わざとやって遊んでるとしか思えない
お前がそれを見るのは何回目かもしれないが (暇なの? 粘着してるの?) 質問者はそれぞれ別の人だ。 それぐらい気づけよw
>>849 ID出せばいいのに
君の書き込みはもうみんな一目でわかるからID出すことのリスクなんて無いよ?
ID出しても出さなくても、こいつ延々と質問だけする糞野郎だって評価は変わらない
ID出しとけば、ID無しは(たとえそれが本人の書き込みだとしても!)偽者ということにできる
ID出すことは君にとって利点しか無い
何か勘違いされてるみたいですが849は俺じゃないですよ? 質問者は一人じゃないです 文体の違いを感じて頂けると幸いです
やはりWeb系はどこへいっても低レベルだな
そもそも質問回答するのに同一人物判定なんてする必要もないので そんな判定はしないのが一番いいかな?
だからさもう次スレは質問用限定にするなよ
>>854 おれは
>>849 がいつもの「〜の件ですが・・・」の彼だと思ったわw
なんで別人だって断定できた?
自己解決した時に結果を書けば 質問打ち切りも宣言できるし他の人の参考にもなる 何がまずいのか分からんな
なんかスレ荒れてすみませんでした。 コード貼ろうか迷ったのですが、原因になる場所のコードがわからなくて、 サーバ側も載せるとなると2.3レスは使っちゃいそうな勢いだったので自重しました。 エスパー質問になってすみませんでした。 次からは気をつけます。
とにかくfirebugとかすいうのから変数の値を書き換えられない方法をおしえて あと変数が書き換えられたらそれを検知できる方法もおしえて
ブラウザ上で動くんだからそんなのないよ
867 :
Name_Not_Found :2013/10/06(日) 13:56:03.96 ID:oFv6xwXl
0で始まる6桁のランダムの数字を出したく下記を実行すると ("0" + Math.floor(Math.random()*100000)).substr(-6, 6) 次のようにたまに5桁以下のものが混じってしまいます。 【実行結果】 031127 017210 047001 052098 09925 ←たまに5桁 042524 これを必ず6桁で表示させるにはどのようにしたらよいでしょうか?
そんなの当たり前じゃんw 数字一つ一つ乱数で作らないと
>>867 望みの桁数-1桁の"0"を加えなきゃ駄目じゃん。
君さあ、それ5桁しか見つけてないみたいだけど4桁とか3桁も出てくるのは理解してる? ゼロフィルとか桁揃えでググればいくらでも出ると思うけど ("00000" + Math.floor(Math.random()*100000)).slice(-6); でいいんじゃない
n = 5; //桁 s = ("" + Math.pow(10,n+1) + Math.floor(Math.random()*Math.pow(10,n+1))).slice(-n); d = "0" + s
872 :
Name_Not_Found :2013/10/06(日) 14:25:11.27 ID:iD8QLYOM
Fooを継承してBarをつくるとき Bar.prototype = new Foo(); ってやるけど、どういう内部動作があってこれが成立するか説明できる人いますか? prototypeはObjectなのにfooインスタンスを渡してうまくいくからには 式が実行された裏で何かが行われてると思うんだけど・・・ __proto__っていうのが関わってるらしきことはわかるものの整理がつかないびっち
インスタンスもオブジェクトじゃん 何いってんの そんなことnew Fooで帰ってくるオブジェクト見れば分かることでしょ 自分で何もしないで人任せにするのはNG
874 :
Name_Not_Found :2013/10/06(日) 15:00:00.60 ID:iD8QLYOM
インスタンスもObject? consoleで表示するとそんな表記にはなってるけど そのものとは思わなかったー けどそうなると別の疑問が生じてくるけど function Foo(name) { this.name = name; } var foo = new Foo("taro"); としたとき、fooが{name:"taro"}だとして Bar.prototype = {name:"taro"}; と同じではなくないですか? これではインスタンスのプロパティnameもBarのprototypeになってしまう
875 :
Name_Not_Found :2013/10/06(日) 15:03:08.05 ID:iD8QLYOM
ん、違うな、これでは堂々めぐりだ、前に考えたことといっしょだ。 ごめん、やっぱしわからない・・・
876 :
Name_Not_Found :2013/10/06(日) 15:18:19.08 ID:iD8QLYOM
Bar.protptypeへの代入式を分解して var foo = new Foo(); Bar.prototype = foo; (仮説)2行目の式は内部で↓に変換される B.prototype = foo.__proto__; これが現在の俺の限界
>これではインスタンスのプロパティnameもBarのprototypeになってしまう 実際そうなる
BarのプロトタイプにFooのインスタンスを指定すれば BarはFooの持つメソッドが使えるようになる、という結果的な継承で 正統的なやり方じゃないよ
「Fooプロトタイプを継承させたプロトタイプ」が入るべきところに Fooインスタンスが入っているってことは、プロトタイプチェーンも伸びてるのかな?
firefoxの標準デバッガってdebuggerステートメントが効かないんですか? なんか止まらないんですが・・
FooインスタンスfooはFoo.prototypeをプロトタイプとしてるんだから fooをBoo.prototypeに入れるってことは Boo.prototype.__proto__ == Foo.prototypeとなって Booインスタンスbooでは boo.__proto__ == Boo.prototype boo.__proto__.__proto__ == Foo.prototypeとなって プロトタイプチェーンは伸びる
new Object()は { __proto__: Object.prototype } Object.prototype === new Object().__proto__ Foo コンストラクタ定義 Foo = function(){} デフォルトで Foo.prototype = new Object() みたいなのが設定されてる なのでこうなる Foo.prototype.__proto__ === Object.prototype Foo.prototype.__proto__ === new Object().__proto__ new Foo() は { __proto__ : { __proto__: Object.prototype } } Foo.prototype === new Foo().__proto__ Object.prototype === new Foo().__proto__.__proto__ Bar コンストラクタ定義 Bar = function(){} Bar.prototype置き換え Bar.prototype = new Foo() その結果こうなる Bar.prototype.__proto__ === Foo.prototype Bar.prototype.__proto__.__proto__ === new Object().__proto__ new Bar() は { __proto__ : { __proto__ : { __proto__: Object.prototype } } } Bar.prototype === new Bar().__proto__ Foo.prototype === new Bar().__proto__.__proto__ Object.prototype === new Bar().__proto__.__proto__.__proto__
なんでコンストラクタだけプロトタイプから飛び出てるの?
コンストラクタ内のthisはその関数のprototypeプロパティをプロトタイプとしたオブジェクト コンストラクタは最後にthisを返す つまりBoo.prototype = new Foo()は Foo.prototypeプロパティをプロトタイプとしたオブジェクトを Boo.prototypeプロパティにセットしてる だいたいこう まあ今じゃObject.createやら__proto__やらあるからこの方法を使う必要はない 欠陥があるしね 一番いいのはclassでextendsすること、これに勝るものはない
関数が作られた時そのprototypeプロパティに自動的に {constructor: 自分自身の関数}がセットされると思えばOK
Fooコンストラクタで生成されたFooインスタンスのプロパティまで継承されるよね? それが気持ち悪い ○と△を無理矢理繋げたみたいな感じ
>>886 コンストラクタ = 関数を作ると、
関数オブジェクトのプロパティとして prototype が自動的に作られて、
さらに prototype.consructor は自分自身に、prototype.__proto__ はObject.prototypeに、自動的に設定される
かな?
function Hoge(){ this.moge = 'poge'; } function Moge(){ } Moge.prototype = new Hoge(); var a = new Moge(); console.log(a.moge); こんなの絶対おかしいよ
だからprototypeにインスタンスを入れるやつはセンスない はい論破
prototypeは普通のobject、普通のobjectは全てObjectのインスタンスなんだから prototype.__proto__がObject.prototypeになるのは当たり前 a = {} a.__proto__ == Object.prototype
jquery.stylesheetを使ってCSSを書き換えていたのですが CDNから読み込んだCSSはクロスドメインと判定されて書き換えられないとエラーが出ました (ただしchromeではスルー) CSSを書き換えるのはあまりいい方法ではないのでしょうか
893 :
872 :2013/10/06(日) 16:14:57.67 ID:iD8QLYOM
よくわかりました。
Bar.prototype = new Foo();
の中に
Bar.prototype.__proto__ = foo.__proto__:
も含まれているので、__proto__を辿ってメソッド等を参照でき
結果として継承関係が成立するということですね。
>>879 のスライド見て、他にもいろんな説明をいただきましたが、
今はどれもよくわかる。ありがとうございました
>>892 この件ですが、
css = document.createElement('style');
css.innerText = 'body{background-color:#000}';
document.getElementsByTagName('head')[0].appendChild(css);
みたいな感じに動的にstyleタグを生成して設定を上書きすることにしようかと思うのですが
このやり方で問題ないでしょうか?
document.body.style.backgroundColor="#000" でええやん
これは例が悪かったです 実際にしたいのはクラス設定の変更です
問題ないよ
おまえらみたいな仕事でコード書いてないクズが議論してもなんも生まれない
仕事してようがしてまいが書いたコードでwebを動かせば同じ
つうか動かしてみれば分かるじゃん 結局は動かしてみないと分かんないんだし そうじゃね?
cssTextで一度に設定できるのはchromeだけで 汎用的にするには、 一つずつcss.sheet.insertRuleしないといけないようです セレクタを指定して削除したり置換する時はどうしたらいいのでしょうか?
後から書いたものが有効になるから削除する必要はない
それだと変更するたびにCSSがどんどん伸びていくのでは
>>901 cssTextのサンプルくれませんか
あとcss.sheet.insertRuleでひとつづつやるサンプルもください
そうしたら僕の取って置きのやつをcodepadに貼り付けますから
var css = document.createElement('style'); document.getElementsByTagName('head')[0].appendChild(css); css.sheet.insertRule('body{background-color:#000}',0); これでどうですか cssTextは使わない方向で行きます
なんで使わないの? firefoxでもSafariでもIEでもChromeでも使えるのに
907 :
Name_Not_Found :2013/10/06(日) 20:50:38.74 ID:dNwCa4ys
>>906 使えない感じだったのですが
css.sheet.cssRules[n].style.cssText
を書き換えることでルール置換出来ました
ありがとうございました
909 :
Name_Not_Found :2013/10/06(日) 21:12:42.29 ID:Px6yCcRl
910 :
>>2 :2013/10/06(日) 21:13:18.64 ID:Px6yCcRl
911 :
>>4 :2013/10/06(日) 21:13:51.48 ID:Px6yCcRl
■質問テンプレート を今風に改善してもらえないか?
ィョゥ!
css.sheet.cssRules[n].selectorTextのセレクタ名は、表記そのままではなく、 正規化されているようです .hoge,.fuga と間を空けずに書いても、 .hoge, .fuga と,の後ろにスペースが一つ付きます この正規化の書式は全てのブラウザで同じなのでしょうか?
マルチセレクタは分けて格納するブラウザもあったりと 調べるほどややこしいので jquery-stylesheetを見に行ったらfixされてました(∵)
>>907 今正常に動作するプログラムがブラウザのバージョンアップで動かなくなる可能性はつねにある
プログラムが標準仕様だけに従っていれば可能性は低くなるけど、
標準仕様の範囲だけで目的が達成できなければ、標準仕様外のものを使わざるを得ない
そのライブラリについてちらっと調べた限りでは、
タッチパネル動作とマウス動作を切り分ける手段に適当な方法を使っている(いた)感じ
【JavaScript】下らねぇ質問はID出して書き込みやがれ 110
勧告されてない仕様は大いに変わる可能性があることを忘れてはならない
ライブラリも勝手に仕様変わるよね
ライブラリは好きなバージョン選べるやん
scrollHeightですが、 chromeとIEではpaddingとの合計、 firefoxではpaddingを除いたものを返してくるようです ブラウザ名のチェックではなく ダック・タイピング的にどちらのパターンかを判別するにはどうしたらいいでしょうか
パターンも何もpaddingを含むのが仕様 それ以外は気にしなくていい 嫌ならclientHeightやoffsetHeightを使う
>>923 ダックタイピングをどういう意味で使ってるのか分からんが
ちょっとでももとの意味を理解してるのなら判別という言葉とくっつくことは無いはず
オレオレ用語はよしてくれや
じゃあfirefoxが間違ってるんですね scrollHeight < offsetHeight なら含まないと判定することにしました ありがとうございました
>>925 ここまで学習したように、オブジェクトのクラスを判定する方法は、
少なくともクライアントサイドJavaScript においては、どれも問題があります。
もう 1 つ解決方法があります。それは、この問題はとりあえず放っておくことです。
「このオブジェクトのクラスは何か」を調べるのではなく、
「このオブジェクトは何ができるのか」を調べます。
JavaScript プログラマの場合は、この表現は次のような意味になります。
「オブジェクトが Duck のように歩き、 Duck のように泳ぎ、
Duck のように鳴けば、そのオブジェクトを Duck として扱えます。
たとえ、 そのオブジェクトが Duck クラスのプロトタイプオブジェクトを継承していなかったとしても、です」 。
(オライリー「JavaScript第六版」)
「判別という言葉とくっつくことがない」などと言っているあなたの方が恐らく間違っているようです
そのバグは去年治っただろ
最新のfirefox24で実際にそうなっていますが?
>>927 俺のほうがとかはいいよ
その文章も当然知ってるし
でも今は俺がお前さんに注意してるんだから
素直にいう事聞いとき
世界中のFirefoxの最新が24でそれで100%バグが起こると証明できるのか? いやwできないwww
そもそもIE独自のものだったもので標準規格じゃないでしょ いつか無くなるよ ちなみに皆event.returnValueはもう使うなよ Chromeではまもなく無くなるから
>>581 非推奨じゃないよ
HTML5の仕様に移行したからWebでは問題なく使える
HTML5の仕様の中にRegExp.$1とか規定されてるんですか。知らなかった。 どの文書ですか?
>>930 いやあなたが何を言ってるのかさっぱり分かりません
>>937 ダック・タイピングと似たようなアプローチで判別する方法はないか?
ってところまで書けってことだよ。それでもわかりづらいことには変わりないけど
擁護は正しくっていうのは、勝手に派生させないってのも含むよ
プログラム書いてるなら、未定義の用語を濫用することの無意味さはわかるじゃろ?
>>939 ダックタイピング「的」と言っているでしょう
自分の認識が間違っていて、間違った認識の上に立って物言いを付けてきたのだから
反省すべきはあなたなんですよ
狂ってるんですか?
941 :
939 :2013/10/07(月) 14:39:39.31 ID:d7N9VSvE
ごめん、俺は
>>925 じゃない
お前は「的」とつければ自分の意図が必ず伝わると思い込んでるだけだって話
JS-MLで俺も言葉足らずをよく指摘されたからわかるんだが
回答者は何でもかんでも汲んでくれるわけじゃないんだ
お前のお母さんじゃないんだから
いやまておまえら ダックタイピングは全く関係無いだろ ダックタイピング的ですらもない もしかしてアンサイクロペディアのダックタイピングの記述あたりを信じて、 勝手に言葉の意味拡張して使ってる?
ああ全然違うものだと思うよ。多分質問者は scrollHeightで返るものがクライアント毎に変わるから それを要素などの持つ特徴的な何かで判別できないか、と考えていて それをダック・タイピング的だと表現した、とエスパーしてみた アンサイクロペディアのダックタイピングは面白かった
特徴も何もただの数値じゃんw
ダックタイピングの本質は「あひると同じことが出来るのならあひると扱う」 この一言に集約されるんです それはますあひるかどうかかの調査から始まる こんなことは当たり前のことです アホはアンサイクロペディアでも読んで溜飲を下げていて下さいね
>回答者は何でもかんでも汲んでくれるわけじゃない って、そんなことを期待していないのは明らかでしょう? 分からない人は黙っていてくれとしか思ってませんよ 「そこ!?」っていうところに噛みついてくるレベルの人には何も期待していないんですよ ただ単に、黙っててくれ。
んで結局
>>923 の言うダック・タイピングは何を指してたわけ?
もういいよ バカに付き合うとバカになるぞ
親divの中に100個の子divを作り個別にidやstyle.top, leftを指定、更新時には親divごと消す ということをやってるのですが、どうやらcloneNode〜removeChildよりも HTMLテキストを繋げてinnerHTMLで上書きする方が倍ほど早いようです それでもinnerHTMLは使わないべきでしょうか?
innerHTMLより遅いなんてよほど馬鹿なコード書いてるとしか思えん
>>948 実際の動作によって性質を判定する方法をダックタイピング的と言ったのです
これは今後もJavaScriptにおいても重要な手法となるので覚えておいてくださいね
逆にブラウザ名で判別するのはモダンではない
jQuery.browserがなくなったのも同じ傾向上にあるものです
>>951 innerHTMLの方が速い場合もあるよ
場合によって使い分けるべきで、どちらの方が絶対にいいというもでもない
そりゃ逆だ 物の肩書ではなく持っている性質によって振る舞いが決定される つまり主導権は物側にあるというのがダックタイピングだ 性質を量るというのはタイプ、つまり型で判定するということで ダックタイピングとは真逆だぞ
>>954 それをダックタイピング的と呼ぶのは恥ずかしいからやめとけ
>>955 そうか〜?innerHTMLでできることをパーサーを動かさないノード操作に
置き換えて遅くなるとかほとんど無かったんだが
一見すると絶対innerHTMLの早いだろう?って感じのコードでも実際に
計ってみるとノード操作の方が早かったりした
まあそれでも、誤差程度の差にしかならん場所には、
わかりやすさ重視でinnerHTMLを使ったりするけどね
>>956 それは違います
レンダリングという実際のふるまいで判定しているのですからダックタイピング的です
比較対象が最終段階で数字となっているのであなたは勘違いしているのです
ものごとの本質を見て下さいね
>>957 C級技術者には伝わらないということが嫌というほど分かったで気を付けますね
てか少し前に、このスレでもinnerHTMLの方が速い場合もあるという結論が出てたと思うけど
>>959 ダックタイピングっていうのはあくまでも型付けの手法
実際のふるまいは関係無い
実際のふるまいでなくメソッドの名前等(シグネチャ)で判別される
異なるふるまいをするとしても同じシグネチャのメソッドが揃っていれば同じ型とみなされる
>>959 素直に「そうだったんですか」とか
「勘違いしました」って謝ればいいのに
引込みがつかなくなるとこまで意地を張る哀れな性格の奴だな
今からでも「分かりました」って一言かけば
こちらとてそれ以上追求しないし
お前さんの人間度もupするぞ
いい加減見苦しい意地張りはやめよう
恥ずかしいよ?
>>960 一般的な操作においては明らかに遅いです
コードも貼られてないんだから一般的なケースで話すのが当たり前 〜の場合もあるとか言ってたらキリがないし パフォーマンス云々じゃなくて質問者のコードの問題を取り去って 改善するという考え方でいかないと
javascriptで関数の引数を配列として明示したいのですが どのようにやればいいのでしょうか? function(int[] arr){} みたいにやりたいのですが
配列として明示するって具体的にどういうこと? 見た目の問題? 配列以外をエラーにしたいの? それとも初期値を空配列にしたいとか? もしくはargumentsみたいなこと言ってるんじゃないよね?
>>967 見た目の問題です
配列ってわかるようにしたいです
function(array arr){}みたいにはできないみたいですし
教えてください
>>968 /**
* @param {Array} arr 配列でね!
*/
function( arr ){}
ではだめかね
は? 「arr」で配列だって一目瞭然じゃない? この程度にDOCなんていらんよ
ダックタイピング的に考えると 配列が必ずしもArrayであるとは限らない
TypeScriptでも使ったほうがいいな
ダック・タイピング的にやるなら、こうすか? function( arr ){ if(arr != null && typeof arr === "object" && 'splice' in arr && 'join' in arr){ console.log('良し'); } else{ throw('フジャッケンナ!フジャッケンナ!'); } }
ダックタイピング&実用的にはArray.fromでパースするのがいい lengthを持つあらゆるオブジェクトとイテレータブルオブジェクトを配列に変換できるすぐれもの
見た目的でいいんなら悪い書き方だけどこう書くこともできるよ function ( arr = Array ) { }
もし部下がこんなコード書いてたら90分説教だわ
>>977 また本質的には変わらないコード書いた上に
長い説教するのだけは勘弁して下さい
>>976 これ引数指定し忘れたりundefinedだっらarrがArrayオブジェクトになるんだぞ
それでもいいんか?
まずArrayかどうかを判断するのがもの凄く難しいからな…… Array.isArrayが使える環境なら問題ないんだけど
だからこそのダックタイピング
>>964 誰が「一般」を決めるんだよw
innerHTMLが速いのは大量のコードをDOMツリーに追加するような場合だよ
これも十分一般的な用途だが
>>963 それはこっちの台詞だよw
最初は優しく教えてあげてるんだからそれで納得しろよ
君と関わってもこっちは何も得るところがないんだから
まとめての場合でも50倍遅いって上のベンチで出ちゃってるじゃんwwww 嘘つきw
しまった巨人様だ! 皆スルーして早く帰ってもらおう!
>>827 この件ですが、pot.jsをヒントにして配列をインターバルにイテレートする処理を書いて
体感速度を大幅に上昇させることができました
ありがとうございました
ポットンJSの話何回するんですかねえ……
引篭り児童を更生させてあげるのも大人の役目 早く彼が良くなることを願って茶番に付きあおう
こりゃ大層なツッコミ待ちだこと
>>821 確かにお前さん言うとおり只者で無いことは分かった。
表に出ちゃいけない人間だよ、お前。
流れが悪いと察するやいなや個人攻撃に切り替える人間の屑 屑だよあんた、屑、屑、屑、くず!1
質問スレで議論うぜえな
すみませんでした 今ではむきになって言い過ぎたと反省しております
反省は人を成長させる
実際の使用方法は要素を空にするより追加や書き換えが主
>>953 の比べ方こそ特殊
富豪プログラミングしろよ
999ならパフォーマンス厨昇天
1000ならパフォーマンス厨堕天
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。