のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,646,544人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

元スレ+ JavaScript の質問用スレッド vol.84 +

JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
851 : Name_Not - 2011/03/28(月) 21:14:28.65 ID:??? (-2,-30,-57)
for(i in ["hello","world"]){
    console.log(i);
}
今気づいたけどfirefox4だと 0, 1が出力されるようになってるのね
852 : Name_Not - 2011/03/28(月) 21:18:17.01 ID:??? (+52,+29,-4)
え?どのブラウザでもそうでしょ
853 : Name_Not - 2011/03/28(月) 21:40:57.03 ID:??? (-1,-29,-1)
javaとかのfor inとは違うぞ
854 : Name_Not - 2011/03/28(月) 22:08:18.06 ID:??? (+60,-30,-166)
>>848
ミスです。治したらfirefoxでは正常に動くのにieで動かなくなりました。何故でしょうか?
(function() {
var dir = new Object(), head = document.getElementsByTagName("script")[0];

dir["./common/js/"] = new Array("foo.js", "bar.js");

var script;
for (i in dir) {
for (var j = 0, len = dir[i].length; j < len; j++) {
script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", i + dir[i][j]);
head.appendChild(script);
}
}
})();
855 : 854 - 2011/03/28(月) 22:18:51.65 ID:??? (+3,-30,-91)
script自体はちゃんと作れているようです。
alert(script.src);で確認しました。
どうやらappendChildができていないようですが・・・。
alert(head);もalert(head.appendChild);もちゃんと動きます。
856 : Name_Not - 2011/03/28(月) 22:30:27.54 ID:??? (+53,+25,-8)
ぶっちゃけ何がやりたいの?
そのコード
857 : Name_Not - 2011/03/28(月) 22:56:56.32 ID:??? (+4,-29,-14)
for-in は実行順の保証がないので forEach か for が妥当かと。
858 : Name_Not - 2011/03/28(月) 23:05:02.24 ID:??? (+0,-28,-13)
forEachは今の所Firefoxだけじゃん
859 : Name_Not - 2011/03/28(月) 23:05:42.75 ID:??? (+5,-29,-48)
>>854
にわか知識で手を抜こうとして失敗する典型だな。まあ、なにごとも勉強だけど。
とりあえず、getElementsByTagName("script") のscriptはheadの間違いだろ
860 : Name_Not - 2011/03/28(月) 23:05:57.95 ID:??? (-1,-29,-84)
ループ回数も保証されていないので、配列の処理にfor-inは使うべきではない。
互換性が低すぎるので、forEachも使うべきではない。
861 : Name_Not - 2011/03/28(月) 23:10:28.30 ID:??? (+3,-30,-108)
Array.prototype.forEachならECMA 262 5thでも定義されてるし、
Firefox、Opera9.5、Safari3、Chrome、IE9で使える。
IE6,7にもArray.prototype.forEachを定義することはできるけど、あまりオススメはしない。
ちなみに、E4Xの for eachのことならFirefoxだけだ。
862 : 854 - 2011/03/28(月) 23:11:01.18 ID:??? (+3,-30,-123)
あ、しまった。
×head = document.getElementsByTagName("script")[0];
◯head = document.getElementsByTagName("head")[0];

>>857
そうですね。そういえば少し前に何かの記事でforinの中にfor文作るとすごいパフォーマンスが下がるみたいに書いてあったとうろ覚えしてます。
やっぱ無駄にfor文増やすより普通に./common/js/***で指定した方がよさそうです。

みなさん有難うございました。
863 : 854 - 2011/03/28(月) 23:18:23.63 ID:??? (+51,+23,-6)
なんかの記事っていうのもあれか・・・。これです。
http://www.hyuki.com/yukiwiki/wiki.cgi?EfficientJavaScript#i11
こういうのちょくちょく読んでるんですが、当てにできるのかな・・・。
864 : Name_Not - 2011/03/28(月) 23:20:46.20 ID:??? (+9,-30,-195)
横からだが他にもおかしいところが山程ある
(function() {
    var files  = ["foo.js", "bar.js"],
        length = files.length,
        head   = document.getElementsByTagName("head")[0];
    for (var i=0; i < length; i++) {
        var script = document.createElement("script");
        script.setAttribute("type", "text/javascript");
        script.setAttribute("src", "./common/js/" + files[i]);
        head.appendChild(script);
    }
})();

書くならこんな感じにする事
865 : 854 - 2011/03/28(月) 23:38:03.81 ID:??? (+44,-30,-134)
>>864
jsがfilesになっているのはできるだけ分かりやすい名前を使うっていう事しょうか。
for(var i = 0, length = files.length; i < length; i++)が普通だと思っていました。外に出した方がいいんですね。

あと配列のところですが、["foo.js", "bar.js"]よりもnew Array();で作った方がいいという記事をまえに見たのでそうしてました。
ここの「括弧で生成せずにnewを使う」のところです。高速化より見やすさを重視してという事でしょうか?
http://journal.mycom.co.jp/news/2009/11/11/015/index.html
866 : Name_Not - 2011/03/28(月) 23:47:12.52 ID:??? (+0,-29,-25)
>>865
配列は[]を使う事
new使えとかいうそういう2年近く前の古くさい記事は忘れろ
ついでにnew Objectは{}とする事

new する時は限られたときのみ
これは基礎中の基礎
867 : Name_Not - 2011/03/28(月) 23:48:37.04 ID:??? (+52,+29,-1)
どっちもかわんねえよ
869 : 854 - 2011/03/28(月) 23:52:13.48 ID:??? (+3,-30,-226)
あーdirを一個に減らしてたから分かりづらかったのかもしれないです・・・。
(function() {
var dir = new Object(), head = document.getElementsByTagName("head")[0];

dir["./"] = new Array("qux.js");
dir["./common/"] = new Array("baz.js");
dir["./common/js/"] = new Array("foo.js", "bar.js");

var script;
for (i in dir) {
for (var j = 0, len = dir[i].length; j < len; j++) {
script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", i + dir[i][j]);
head.appendChild(script);
}
}
})();
ほんとはこんな感じにディレクトリ毎のファイルをscriptタグのsrcに指定してheadにappendChildするっていう感じでした。
連投してほんとにすいません。これで終わります・・・。
870 : Name_Not - 2011/03/28(月) 23:53:42.09 ID:??? (+68,+30,-98)
>>865
ひどい日本誤訳だな。グラフよく見てみろ、ほんちょびっとだけリテラルのほうが速いぞ。
あと、この程度の差は数万回レベルのループとかじゃないと差が出ないので、気にしないのが良いと思うね。
気になるってんなら仕方ないけど…、病的と言われるレベルだってことは認識してほしいね。
あとEfficientJavaScriptは良記事だったとは思うけど、元記事が書かれたのは2006年11月だよ。
チェックしてないけど、古い情報が混ざってるだろうね。
871 : Name_Not - 2011/03/28(月) 23:55:15.20 ID:??? (+57,+29,-15)
命名規則なんて好きにしろ

後、その記事おかしくね?
リテラルの方が早いんだが…
873 : Name_Not - 2011/03/29(火) 01:25:04.90 ID:??? (+63,+29,-73)
Good Parts、なんだかんだでクロックフォード御大の好みがにじみ出てるからね・・・

先日出た「ハイパフォーマンスJavaScript」は、
これまで散逸しがちだった「突っこんだ話」が1冊にまとまってて便利だと思ったよ
さすがに原著の出版が2010年3月なので、ブラウザ関連の話は古びてるものも出てきてたけれど・・・
NCZ様々だなー
874 : Name_Not - 2011/03/29(火) 01:29:53.44 ID:??? (+65,+29,-24)
リテラルの方が(文法的に)いいと推奨しているサイトがありますが、
理由がわかりませんでした。どうしてでしょう?
875 : Name_Not - 2011/03/29(火) 02:20:05.19 ID:3x4QjK18 (-20,+29,-67)
コンストラクタ関数をnewを付けずに実行するとグロスコが汚れる
これを回避するためにはnewを使わないことだ
だからオブジェクトも配列もリテラルで書くべきだ


なんて言われても
ハンマーで頭を殴ると死ぬから家を建てる時には釘を使うな、って感じがするよなあ
876 : Name_Not - 2011/03/29(火) 02:31:12.37 ID:??? (+27,-29,-14)
つ【Object.create】
877 : Name_Not - 2011/03/29(火) 02:42:10.97 ID:??? (+3,-30,-89)
var xx = 0;
window.onload = function(){
var img = new Image();
img.onerror = function(){xx = 1;};
img.src = "x.jpeg";
}
IEだとxxに1が入るんですけど、firefox、opera、chromeなどは全て代入処理が行われませんでした。
どうしてでしょうか?
879 : Name_Not - 2011/03/29(火) 08:12:24.08 ID:??? (+69,+29,-64)
createみたいなメソッドの中にnewする部分を閉じ込めて通常コード
には出ないようにするんでないの。でもそれならコンストラクタを
newつけずに呼んだらその中で検出して対処するんだっていいと思って
いるけどね。
880 : Name_Not - 2011/03/29(火) 08:43:12.97 ID:??? (+80,-30,-50)
>>879
> newつけずに呼んだらその中で検出して対処するんだっていいと思って
> いるけどね。

それ、どうやるの?

function create(){this.x = 'X'}
var y = {};
y.c = create;
y.c()

とやったとき、newつけていないことを検出できる?
881 : Name_Not - 2011/03/29(火) 08:50:13.94 ID:??? (+15,-21,-2)
>>874
実行時にエラーチェックできるから。
882 : Name_Not - 2011/03/29(火) 09:41:55.51 ID:??? (+69,+29,-75)
>>880
わざわざ他のもののメソッドにしたらそりゃ分からんだろうけど。
そもそもコンストラクタとして使うものにcreateとかいう名前つける?
小文字で始める?そういうコード普通に書いているというのなら私には何の
アイデアもないです。
883 : Name_Not - 2011/03/29(火) 10:37:53.31 ID:??? (-1,-29,-33)
jqueryを覚えたらprototypeとかmootoolsとか覚えなくても問題ないですか?
884 : Name_Not - 2011/03/29(火) 10:40:25.05 ID:??? (+61,+30,+0)
>>880,882
>>876
885 : Name_Not - 2011/03/29(火) 11:07:33.59 ID:??? (+55,+27,-13)
今すぐES5で書けという意味かな…それでいいの?
886 : Name_Not - 2011/03/29(火) 11:43:55.35 ID:??? (+9,-30,-113)
>>878

>>875
> コンストラクタ関数をnewを付けずに実行するとグロスコが汚れる
> これを回避するためにはnewを使わないことだ
てことなら、コンストラクタ内でnewするのはOKってことだから、

var Constructor = function() {
if (!(this instanceof Constructor)) {return new Constructor();}
}
でいいんじゃない?
888 : Name_Not - 2011/03/29(火) 13:00:39.60 ID:??? (+38,-30,-204)
>>886-887
別にvarにしなくても普通にfunctionのままで予防的に/**/の行を追加とかは?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head>
<title>sample</title>
</head>
<body>
<pre><script type="text/javascript">
function Counter() {
if(!(this instanceof Counter)) { return new Counter(); } /**/
this.x = 1;
this.add = function(d) { return this.x += d; }
}
var c1 = new Counter();
var c2 = Counter();
var c3 = Counter();
document.writeln(c1.add(1)); document.writeln(c1.add(1))
document.writeln(c2.add(1)); document.writeln(c2.add(1));
document.writeln(c3.add(1)); document.writeln(c3.add(1));
</script></pre>
</body>
</html>
889 : Name_Not - 2011/03/29(火) 13:22:54.83 ID:??? (+3,-30,-219)
>>887
たとえば組み込みのObjectコンストラクタだと、
newするときに渡す値によって使われるコンストラクタが違うので、バグの温床になる

var o1 = new Object();
o1.constructor // Object
o1.toFixed // undefined

var o2 = new Object(1);
o2.constructor // Number
o2.toFixed // 存在する

Objectコンストラクタ以外でも、上にあるようなグローバルスコープの問題とかがあるから
リテラルで済ませられるときにはnewを使うなというのは正しいと思う
890 : Name_Not - 2011/03/29(火) 13:27:23.01 ID:??? (+63,+29,-2)
>>888
おまえはいったい何が言いたいんだ
891 : Name_Not - 2011/03/29(火) 14:53:19.76 ID:??? (-2,-30,-26)
ieの場合、document.allとdocument.getElementsByTagName(*)はどっちが速いですか?
892 : Name_Not - 2011/03/29(火) 16:13:07.81 ID:??? (-1,-29,-2)
document.allが速いです。
893 : Name_Not - 2011/03/29(火) 20:23:30.91 ID:??? (+56,+28,-55)
日本でもしものサマータイム導入に備えて今のうちにコード対応したいのですが
サマータイムに対応できるライブラリってありませんか?
895 : Name_Not - 2011/03/29(火) 22:45:30.63 ID:??? (-29,-30,-250)
//練習に作った2010年電気代を安い順に並び替える
var a=new Array(4476,3757,3746,3659,3830,2116,3341,4314,4783,6033,3594,2395);
var c=new Array();var i,j,t,min,s;
for (j=0;j<a.length;j++){c[j]=a[j];}
for (i=0;i<a.length-1;i++){min=a[i];s=i;
for (j=i+1;j<a.length;j++){if (a[j]<min){min=a[j];s=j;}}t=a[i];a[i]=a[s];a[s]=t;}
for (i=0;i<a.length;i++){
poo=a[i];for (j=0;j<a.length;j++){if(c[j]===poo){h=j;}}
if(h<9){h="0"+(h+1);}
else{h=h+1}
document.write(h+"月"+":"+a[i]+"<br>");}
なんか無駄が多い気がする解決策ありますか?
896 : Name_Not - 2011/03/29(火) 22:57:54.56 ID:??? (-1,-29,-9)
a=[[1,4476],[2,3757],~]
a.sort(function(a,b){
return a[1] > b[1];//個々は昇順降順適当に合わせて
})
897 : Name_Not - 2011/03/29(火) 23:40:20.66 ID:??? (+9,-30,-105)
特定の月の最終日曜日(今月なら27日)を取得する方法が分かりません
単純に月の日数を取得して日曜日かどうか判断していく方法しか思いつきませんでした
コードは確認してないけどこんな感じですか?
もっとかっこいいアルゴリズムを教えて欲しいです

year = 2011;
month = 3;
lastday = new Date(year, month+1, 0).getDate();
for (var i=lastday; 1<lastday; lastday--) {
if (0 == lastday.getDay()) break;
}
alert("最終日曜日は"+lastday+"日です");
898 : Name_Not - 2011/03/29(火) 23:58:11.91 ID:??? (+3,-30,-26)
var year = 2011;
var month = 3;
var _D = new Date(year, month, 0);
//"最終日曜日は"+(_D.getDate() - _D.getDay())+"日です"
899 : Name_Not - 2011/03/30(水) 00:03:34.74 ID:??? (+121,-30,-90)
function getDays(year, month){
    if (month == 2){
        if (year % 400)
            return 29;
        if (year % 100)
            return 28;
        if (year % 4)
            return 29;
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
        return 30;
    } else {
        return 31;
    }
}
万年カレンダーでググれば公式があるから
900 : Name_Not - 2011/03/30(水) 00:08:52.65 ID:??? (+4,-30,+0)
>>897
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head>
<title>sample</title>
<script type="text/javascript">
function calc() {
var y = parseInt(document.getElementById('t0').value, 10);
var m = parseInt(document.getElementById('t1').value, 10);
var d = (m<12) ? new Date(y, m, 1) : new Date(y+1, 0, 1);
var x = d.getDay(); if(x == 0) { x = 7; }
var s = new Date(d.getTime()-x*86400000);
document.getElementById('t2').value = String(s.getDate());
}
</script>
</head>
<body>
<div>Year:<input type="text" id="t0"> Month:<input type="text" id="t1">
<button type="button" onclick="calc()">Calc</button>
Last Sunday:<input type="text" id="t2" readonly></div>
</body>
</html>
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について