JavaScript 4©2ch.net (398レス)
1-

1
(1): 転載ダメ©2ch.net [sageteoff] 2014/12/05(金)12:19 ID:fmzBASgG(1/3) AAS
( ^ω^) 初学者・迷子・ロリ幼女はこちらで
  _、_
( ,_ノ` ) プロフェッショナルはECMAScript デス 4へ

【前スレ】
JavaScript 3
2chスレ:tech

【関連スレ】
ECMAScript デス 4
2chスレ:tech
+ JavaScript の質問用スレッド vol.117 +
省13
2
(2): 転載ダメ©2ch.net [sageteoff] 2014/12/05(金)12:20 ID:fmzBASgG(2/3) AAS
【前スレ-2】

JavaScript ライブラリ総合質問所 vol.4
2chスレ:hp
Node.js + Express
2chスレ:php
【MVW】AngularJS {{2}}【Google】 [転載禁止]©2ch.net
2chスレ:php
enchant.js
2chスレ:gamedev
むしろjavascriptでゲーム作ろうぜ
省1
3: 2014/12/05(金)12:22 ID:fmzBASgG(3/3) AAS
ああ、間違った。
>>2 は関連スレ-2です。

次スレは>>980あたりでお願いします。
4: 2014/12/05(金)12:28 ID:S74tDLHo(1) AAS
板毎の整理までして戴いて超GJでござる
5: 2014/12/05(金)14:51 ID:v8ZX4BwT(1) AAS
AA省
6
(1): 2014/12/05(金)20:23 ID:JcHTtYO/(1) AAS
画像リンク[jpg]:i.imgur.com
画像リンク[jpg]:i.imgur.com
画像リンク[jpg]:i.imgur.com
画像リンク[png]:i.imgur.com
画像リンク[jpg]:i.imgur.com
画像リンク[jpg]:cisburger.com
画像リンク[jpg]:up.pangya.tv
7: 2014/12/05(金)20:48 ID:+TXyzC2W(1) AAS
ここはJavaScript4のスレです

外部リンク:ja.wikipedia.org

ECMAScript 4

「JavaScript#JavaScript 2.0」も参照
ECMAScript 4 は過去2回仕様作成が挑戦されたが、仕様がまとまらず、失敗に終わっている。
1回目[編集]
2000年〜2003年ごろ行われた。主に、旧Netscape社とMicrosoft社によって行われたが、意見がまとまらずに、打ち切りとなった。この時の案は ActionScript へと引き継がれた。
外部リンク:www.mozilla.org - 昔のNetscape草案
2回目[編集]
2007年〜2008年ごろ、2回目の仕様作成が行われた。大きく機能を追加される予定であったが、意見がまとまらず、2008年8月13日に、小規模の改善にとどまる、ECMAScript 3.1 を進めることとなった[3]。仕様は、外部リンク[php]:www.ecmascript.org にて公開されている。
省6
8: 2014/12/06(土)00:47 ID:katyEhxk(1/2) AAS
いやいやいやいやいやいやいやいやいやいや、

ただのPart 4ですからー残念!
9: 2014/12/06(土)00:52 ID:katyEhxk(2/2) AAS
>>2
そういやWeb制作板の方にも質問スレがあったんだった。

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

そして>>6は一体どこの誤爆?
10: 2014/12/06(土)13:37 ID:ERRenF6X(1) AAS
ろ・ろ・ろりようじょちゃうわっ!
11: [age] 2015/01/22(木)21:05 ID:lh8u5jbd(1) AAS
lodash 3.0 リリース間近!

外部リンク:github.com
3.0-preから-preが外れました!

スレが多すぎてどこに書けばいいかわからないので
関連スレすべてにマルチポストしています。m(__)m
12: 2015/01/23(金)04:56 ID:Hr76SqrY(1) AAS
せっかく貼ってもらって恐縮だが
ここは関連してない
13: 2015/01/28(水)16:27 ID:8HD8W7Zv(1) AAS
フェラチオ
14: 2015/02/11(水)21:37 ID:z1YCt8TB(1/5) AAS
外部リンク[pdf]:www.mpi-sws.org

GoogleはJSに「新モードを追加する」という方向性に舵をきり始めた。
GoogleはSaneScript、SaneModeをV8上に今年上半期に実装する。
これはJSの機能を一部制限し、動作を変えることで強力な最適化を可能にする。
語弊を恐れずに言うと、asm.jsの発展版であり、
asm.jsがJSの10%の機能、ユースケースをターゲットにしたものなら、Saneは90%程度だ。

そして今年下半期にはSaneとシンクロする型システムを導入し、SoundScriptとなってharmonyの次の音色をJSにもたらす。
JSは静的&動的型付け、クラス&プロトタイプベース言語となってあらゆる人々の要求に答える言語へと成長する。
それは遠い未来の話ではない。1年の間にその変化が起こるのだ。
15: [age] 2015/02/11(水)21:46 ID:fVfIbgvg(1) AAS
つまり標準化をやめてオレオレ拡張するってことか
16: 2015/02/11(水)21:51 ID:nRKk5Oa4(1) AAS
よくわかんないけどウェブプログラマがIEを恨む時代からChromeを恨む時代になる?
17: 2015/02/11(水)21:54 ID:z1YCt8TB(2/5) AAS
違う。これを発表したのはまさにTC39Meetingでだ。
だからGoogleはこれがES7あたりで標準になることを望んでいる。
O.oのときと同じく先行実験をするということ。

しかしJSが徐々に「Living Standerd」化していってるのは否定しない。
これは良い悪いではなく抗えない時代の流れなのだと思う。
そういえばこれと同じようにMozilla陣営が実験を進めていたParallelsは、
共感が少ないということで白紙に戻ったそうだ。

この取り組みが成功し、標準になるかどうかは結局は我々開発者の評判次第ということだ。
18: 2015/02/11(水)22:07 ID:z1YCt8TB(3/5) AAS
皆はasm.jsを手書きで書こうとして詰まったり、思ったよりパフォーマンスが上がらなかったことはないだろうか。
Saneなら違う。SaneはほぼJSの感覚で手で楽にかけるし、パフォーマンスだけでなくリーディングの面でも素晴らしい効果をもたらす。
問題はこのJSにモードを増やすという考え方が、開発者たちにとって歓迎されるかどうかだ。

このasm.jsについてのissueを見てほしい。
外部リンク:code.google.com
10でも多いレス数は80。100で大人気のスター数は630。
当初Googleはasm.js向けの最適化はしないと言っていたのが徐々に主張が変わり、
今では新最適化エンジンで"use asm"を認識し、最適化モードを切り替えられるようにしたほどである。
今回の"use sane"アイディアはこういったことから開発者の受けがいいと判断してのことだろう。
19: 2015/02/11(水)22:19 ID:TfFe/slw(1/2) AAS
asm.jsで目的は達成してるし他にはいらん
しかもasm.jsはソースがグチャグチャになるからアセンブラ並の難読化の役割も果たしてる
分かりやすくして欲しくない
20: 2015/02/11(水)23:07 ID:z1YCt8TB(4/5) AAS
asm.jsはネイティブのコードをJS化するときに活用できるものであって、
"use strict"の強化版的なSaneModeとはユースケースが違う。
特にvarの使用位置にこだわる人やLint勢、クラスベース言語経験者からは喜ばれると思う。
21: 2015/02/11(水)23:21 ID:z1YCt8TB(5/5) AAS
Sane/Soundで一番JSらしくなくなるのはオブジェクトが拡張できなくなる点だが、
sealedされて型のついたオブジェクトというのは、ES7で前々から提案されていたTypedObjectと同じだ。
コンストラクタがデフォルトでTypedObjectを返すようになるモードと考えれば、違和感も薄れるかもしれない。
22: 2015/02/11(水)23:31 ID:TfFe/slw(2/2) AAS
pdf読んだが、ただのstrict modeの拡張レベルの話しだな
SoundScriptの方にいたってはTypeScriptのパクリだし
TypeScriptパクる奴は後を絶たないな
23: 2015/02/11(水)23:38 ID:sJPqGjE7(1) AAS
パクってもらうのが目的な気がしてならない
24
(1): 2015/02/12(木)04:27 ID:vBHOZlzG(1/3) AAS
パクリも何もTypedScriptは元々ES6に向けたharmonyの機能を先行して実装し、
それに加えてES4の頃からアイディアがあってES7辺りでの実現が見込まれていた型注釈を組み込んだものだよ。
そしてTypeScriptの目標は自身(型注釈)がES7で取り入れられて最終的に用無しになることだからね。
CoffeeScriptなんかとよく並べられるが、どちらかと言うとtraceurや6to5みたいなトランスレーターの仲間と考えた方がいい。
とは言えTSの型注釈はコンパイル時の整合性チェックのためのもので、実行時に活用するSSとは少し有り様が違う。
25
(1): 2015/02/12(木)13:51 ID:sZL3z8VT(1/2) AAS
>>24
JavaScriptに型注釈が取り入れられるわけないし必要ない
それにブラウザ内蔵オブジェクトに正しく型を付けられるようにしたのはTypedScriptが最初だ
アイディアレベルのものと実際に実用的に動くものにしたのでは天と地ほどの差がある
実行時に活用するのは同じGoogleのAtScriptがあるだろ
26
(1): 2015/02/12(木)15:31 ID:vBHOZlzG(2/3) AAS
>>25
>>型注釈が取り入れられるわけない
そんなことはない
ただし、ESでの型注釈は現状無難なguardの方向になる可能性が一番高い
SSはもっと踏み込んでる

>>ブラウザ内蔵オブジェクトに正しく型を付けられるようにしたの〜
DefinitelyTypedについて言っているのならそれは完全にTSの功績
だがそれはTSの型注釈がコンパイル時の検証のためのものだから必要なのであって
ランタイムのチェックには必要ないもの

>>アイディアレベルのものと実際に実用的に動くものにしたのでは天と地ほどの差がある
省5
27
(1): 2015/02/12(木)16:52 ID:sZL3z8VT(2/2) AAS
>>26
> ただし、ESでの型注釈は現状無難なguardの方向になる可能性が一番高い
guardはブレンダン・アイクにいらねー言われてたよ

> DefinitelyTypedについて言っているのならそれは完全にTSの功績
ブラウザ内蔵オブジェクトは単純なclassの定義だけじゃ型付け出来ないものがある
TypeScriptは若干独特な仕様のinterfaceを導入して正しく型付けしている
28: 2015/02/12(木)18:47 ID:vBHOZlzG(3/3) AAS
>>27
guardそのものではないが、実行時の型チェック→エラー機能に留まる≒guardということ。

それと別に型が正しく型付けできない云々はあくまでTSの問題。TSが型をどのように定義し利用してるかの問題であって、一般的な話ではない。
そもそもTSにおける型とは架空のものだから。架空のものなのはJSが曖昧だから。

その点SSはそもそもクラスベースの世界だからインスタンスに紐付けられているクラス情報で判断できる。
で、ビルドインコンストラクタについてはどうやって外部の(プロトタイプベースの)世界と折り合いをつけるのかが示されていないから、
ランタイムチェックについては問題ないがAOT最適化をどうやるのかはなんとも言えない。
29: 2015/02/13(金)21:09 ID:WDmbay81(1) AAS
jsonの日
30: 2015/02/14(土)03:59 ID:TJAnvvXO(1) AAS
リア充の日
31: 2015/02/16(月)00:41 ID:/X+NPUTO(1) AAS
Effective JavaScript読むとJSのきもさに眩暈がするな
元々ガチ向けじゃなかったものをガチ向けにした気持ち悪さ
まるで遊戯王
32: 2015/02/16(月)02:39 ID:4iM7fmBu(1) AAS
どんな言語でもプログラムした事無い素人の典型的なレスだな(笑)
33
(1): 2015/02/16(月)08:14 ID:1Y+K6fCR(1) AAS
キモイだろ。普通に。
ここまで捏ね繰り回されたコードが普通に使われる言語は珍しい。
他の言語だとそういうキモイコードは、面白いけどさあ、で大体終わる。
34
(1): 2015/02/16(月)09:39 ID:o9E9nO+7(1) AAS
まあ皆キモイと思ってるから各種altJSが出てくるんだろうし
35: 2015/02/16(月)09:40 ID:JcJgKv2l(1) AAS
>>34
そんなこと思ってる奴は全体でも1割もいない
36
(2): 2015/02/16(月)11:42 ID:8Z58kFg+(1/6) AAS
>>33
キモいってのは
(function() {
}());
ぐらいで他は特にないけど何がある?
37: 2015/02/16(月)12:09 ID:G25umMgZ(1) AAS
やべえ、そのくらいじゃ全然キモいって思えねえ
まだobjectiveCのがキモい
38
(1): 2015/02/16(月)12:57 ID:AmwLqaSG(1/4) AAS
>>36
外部リンク:bonsaiden.github.io
特に巻き上げとか意味不明
あと、自動セミコロン挿入関連の書き方の宗教とか
39
(1): 2015/02/16(月)13:36 ID:8Z58kFg+(2/6) AAS
>>38
巻き上げの説明でよく出てくる例
var myname = "global";
function func() {
console.log(myname); //出力内容は?
var myname = "local";
console.log(myname); //出力内容は?
}
グローバルと同じ名前のローカル変数を定義してる時点で問題があるが、別の言語だと
"global"
省11
40
(2): 2015/02/16(月)15:23 ID:AmwLqaSG(2/4) AAS
>>39
C#とかPythonだと上位スコープと同じ名前が後でローカル変数として宣言されるときは、宣言前に使うと構文エラーになって100倍わかりやすいんだが

あと
b = 10
(function(){})()
とかくと10が関数でないってエラーが出るし、関数返したりするとエラーすら出なくなるんだけど、セミコロン省略派の人はjshintで問題を見つけられるの?
41: 2015/02/16(月)15:59 ID:8Z58kFg+(3/6) AAS
>>40
根本的に仕様が違う言語を持ち出すなよ
巻き上げの話しをしてんだから、せめて同名ローカル変数を許す仕様じゃないと比較する意味無いだろ
そんな事言ったら
同名ローカル変数を許す言語<許さない言語という結論で終わる(それには同意する)

jshintのデフォ設定ではセミコロン省略すると大量に警告が出る(>>40で2つ警告が出てる)
> とかくと10が関数でないってエラーが出るし、
エラーになるならそれでいいだろ
> 関数返したりするとエラーすら出なくなるんだけど
どういうコードか分からんかったが、それはエラーじゃないんだろ
42
(1): 2015/02/16(月)16:30 ID:8Z58kFg+(4/6) AAS
>>40
外部リンク:github.com
ちなみに↑このライブラリの人はセミコロンを一切書いてない(lib内のソースとか)
それだけで使う気は失せたが一応ちゃんと綺麗に書けてる
43
(1): 2015/02/16(月)17:23 ID:AmwLqaSG(3/4) AAS
同名ローカル変数は許すよ。javascriptで巻き上げてundefinedになる状況がエラーになる。
外部リンク:ideone.com

セミコロンで挙動が変わるのは極端だけどこういうの
function test()
{
・・console.log("A")
・・return function(){
・・・・console.log("B")
・・・・return function(){ console.log("C") }
・・}
省15
44
(2): 2015/02/16(月)17:32 ID:8Z58kFg+(5/6) AAS
>>43
> 同名ローカル変数は許すよ。
お前何様だよ

> test() //無=>ABC 有=>AD
残念大間違いw
test() //無=>ABC 有=>ABC
45: 2015/02/16(月)17:38 ID:8Z58kFg+(6/6) AAS
>>44
違ったあってた
そもそも
(function(){console.log("D")})()
↑この書き方がイレギュラーな書き方なんだよ、それは最初に言っている

どんな言語だってコーディングスタイルの違いで変な書き方なんてあって当たり前だ
JavaScriptだけが特別じゃない
46
(1): 2015/02/16(月)22:06 ID:AmwLqaSG(4/4) AAS
>>44
>お前何様だよ
いや、お前が同名ローカル変数を許す言語にしろって言ったんだろ
念のためだが、俺が許すんじゃなくて、(C#やPythonの文法が)許すだからな?

>どんな言語だってコーディングスタイルの違いで変な書き方なんてあって当たり前だ
>JavaScriptだけが特別じゃない
設計じゃなくて文法と仕様が奇怪なのがjavascript
しかも、ときどき理解せずに踏んでしまう可能性がある

どの言語もしない変数の巻き上げ、使い物にならないtypeof、未定義値と限らないundefined、なぜかスコープを作らないブロック、オブジェクトなどに演算子を適用してしまうとエラーも出さずする不可解な挙動
配列は連想配列のように使えるけどfor inが安全に使えない、lengthが要素数を返さないなどなど、歴史上しょうがないのはわかるが、きもい
省2
47: 2015/02/16(月)23:08 ID:UGQzThdk(1) AAS
>>46
変数の巻き上げは実際には問題にならないって言ってる(そもそもそのコードがバグってるから)
神経質なやつが騒いでるだけ
> 未定義値と限らないundefined
これは意味が分からん
undefineを代入出来る事が気に入らないのか?
> なぜかスコープを作らないブロック
これは
(function() {
}())
省9
48
(2): 2015/02/17(火)00:44 ID:jqPQ5aJG(1/5) AAS
>変数の巻き上げは実際には問題にならない
エラーになったほうがバグがすぐわかるじゃん
巻き上げる利点が何もない

>未定義値と限らないundefined
かなり最近まで「undefined = 1;」とかできた。「undefined 判定」とか検索すると苦労の跡が見える。
最近は変更できなくなったが、古いブラウザへの対応と残されたコードを理解するために知る必要がある。
でも、予約語ではないので変数名には使えて
function(){
var undefined = 1;
console.log(0[0] === undefined);
省10
49
(1): 2015/02/17(火)00:46 ID:jqPQ5aJG(2/5) AAS
以下長いが、これ全部結果の型と値わかる?これ全部結果の型と値わかる?
10*[5]
10*["5"]
10+[5]
10*[null]
10*[undefined]
10*[true]
10*[]
10*{}
10*[5,6]
省20
50: 2015/02/17(火)00:52 ID:jqPQ5aJG(3/5) AAS
>>49
一番上の行はコピペミスです
51: 2015/02/17(火)01:09 ID:ihqME62s(1) AAS
>>48
> エラーになったほうがバグがすぐわかるじゃん
だからundefinedになるからエラーになるって言ってんじゃん

> かなり最近まで「undefined = 1;」とかできた。「undefined 判定」とか検索すると苦労の跡が見える。
せめて"use strict"での話しをしろよ

> それはさっきあげたJavaScript Gardenより
> 外部リンク:bonsaiden.github.io
糞記事
"foo" String string
1.2 Number number
省6
52: 2015/02/17(火)01:40 ID:jqPQ5aJG(4/5) AAS
>だからundefinedになるからエラーになるって言ってんじゃん
その場ですぐエラーになるとは限らない
グローバル変数を使ったつもりで全く別のタイミングで問題が出るかもしれない

>せめて"use strict"での話しをしろよ
してるじゃん。use strictでも予約語にはならないし、古いコード読むときに謎のundefined判定に対する知識が必要
その書き方さえ何パターンもあり、少なくとも美しくはない

>使い道はある
使い道があるかどうかじゃなくて、きもいかどうかのお話をしてる
もっと使い勝手の良くて、Object.prototype.toStringとか不自然なことしなくてすめばいいのに
擬似的なオーバーロードみたいに使い道はあるのに、型よってころころ判定法を変える言語なんてそうないよ
53: 2015/02/17(火)02:17 ID:52Ru56el(1/2) AAS
古いコードでもundefinedに代入するなら代入するなりの理由が無いとやらんと思うぞ
そんなコードはそもそも要注意コードだと思うの
54: 2015/02/17(火)08:36 ID:T8d9Ogf5(1/2) AAS
全体的には ID:jqPQ5aJG に同意

>>48
> var undefined = 1;
これは本当に何とかして欲しい
スコープチェーン上で汚染されるのは ES5 仕様では回避しようがない
現状ではtypeof 演算子なり void 演算子を利用するしか選択肢がないわけだが、ES6 で Keywords に入れてもらえないものかね…
55
(1): 2015/02/17(火)08:51 ID:T8d9Ogf5(2/2) AAS
typeof 演算子の極悪さは Null 型、Object 型の判定にあると思う

typeof null === 'object'; // true
typeof new Function === 'function'; // true
typeof ActiveXObject('Excel.Sheet') === 'unknown'; // true

これらは全て ES5 に準拠しているわけだが、全く信じられない挙動だ
Null 型の判定は === で可能だからまだマシだが、Object 型の判定に Object() を利用しなくちゃならんのが面倒くさい
"type" の名を関する演算子なのに「型」以外の文字列が返すなと問い詰めたい
56
(1): 2015/02/17(火)13:47 ID:9i2JMVg5(1/3) AAS
> var undefined = 1;
そんな事するわけ無いだろ、誰も困ってねーよ
57
(1): 2015/02/17(火)13:50 ID:9i2JMVg5(2/3) AAS
>>55
なぜtypeofを使うかをちゃんと考えれば困ることはない
お前プログラム組んだこと無いだろ
58
(1): 2015/02/17(火)14:14 ID:MalAvpsB(1) AAS
>>56
「する」「しない」の問題じゃない
良いブログラムならそれ以前に「出来ない」
59
(1): 2015/02/17(火)18:54 ID:DEFQP+nD(1/4) AAS
>>57
君は仕様を読んで型の厳密判定をする方法について考えたことがなさそうだな
Object 型に限定した判定法が必要になるケースもある
ES の Native method がそういう設計だし、それに似せると必然的に型判定を厳密にするようになる
60
(2): 2015/02/17(火)19:17 ID:9i2JMVg5(3/3) AAS
>>58
出来ないから何?
やらないものを出来る出来ないなんてどうでもいいし気にもならない
当然キモいなんて全く思わない

>>59
> Object 型に限定した判定法が必要になるケースもある
取り合えず例をあげてよ
61
(3): 2015/02/17(火)19:50 ID:jqPQ5aJG(5/5) AAS
>>60
ローカル変数名にundefinedを使ったコードを読むときに仕様を知らないといけない
var undefined;
とすると、上のスコープと無関係にundefinedを未定義にできる
古いブラウザへの対応も含めてこれを利用したコードが残っている

だから、書き換え可能だった頃の対策コードを含めて、害しかない仕様を詳細に理解せざるを得ない

お前が熟知してても、勉強途中の理解がたりない人に優しい仕様ではないね。エラーにする言語なら間違えようがないところ
62: 2015/02/17(火)21:23 ID:DEFQP+nD(2/4) AAS
var undefined; については他の定数と比較すれば違いがよくわかる

(function () {
var true = 1; // SyntaxError: Unexpected token true
var false = 1; // SyntaxError: Unexpected token false
var null = 1; // SyntaxError: Unexpected token null
var undefined = 1;
}());

true, false, null で変数宣言が出来るケースを考えてみるといい
ちなみに、null が書き換えられた場合は undefined の比でなく面倒になる
null は typeof 演算子の仕様バグがあるから固定値を取り出すには必ず、null を返すが決まっている関数or演算子を使うしかない
省3
63: 2015/02/17(火)21:33 ID:igbT8vqk(1) AAS
prototypeのおいしい使い方ってないかな
継承とか考えずにデコレータやアダプタとしてラップする方が便利かも
64
(1): 2015/02/17(火)22:08 ID:52Ru56el(2/2) AAS
>>61
それを利用してるんなら、その謎物体をundefinedとして扱って欲しいのでは?
65
(3): 2015/02/17(火)22:35 ID:DEFQP+nD(3/4) AAS
>>60
・{hoge: true, foo: false} のように Object 型でオプションを指定したい場合
・配列のようなオブジェクト(NodeList等)を判定したい場合
66
(2): 2015/02/17(火)23:45 ID:DEFQP+nD(4/4) AAS
>>64
var undefined; を宣言した場合、ES5 で書き換え不可能になった window.undefined をスコープチェーン上で参照不可能になり、書き換え可能なローカル変数として扱われる
書き換え不可能だった定数が書き換え可能な変数に置き換わるのは良いコードとはいえない
67
(1): 2015/02/18(水)06:15 ID:VrkW+sKk(1) AAS
>>66
もちろん悪いコードだと思う
でも敢えてそんな記述をする以上は、そいつをundefinedとして扱えってコードなのだろう
そんなコードを意識してわざわざ変な判定をするのは却っておかしなことになるんじゃ?と言いたい
68: 66 2015/02/18(水)08:03 ID:fF9sUQWk(1) AAS
>>67
それは確かにそうだな
もっと他によい方法があると思う
- written: true の時だけ defineProperty を使う
- typeof undefined !== 'undefined' の時だけ this.undefined = void 0;
- undefined を使わず、typeof 演算子を使う
自分は>>61ではないので>>61の回答待ち
69
(1): 61 2015/02/18(水)09:30 ID:86t2mSil(1/3) AAS
これから書くときはほとんど気にする必要はない
不便なのは、初心者が人のコードを読むとき
・undefinedがキーワードでないこと
・過去にグローバルオブジェクトが書き換え可能だったこと
・「未定義値であることを保証する」というパターン(イディオム)数種類
を知らないと、そのパターンを見た時にすぐには理解できなくて手が止まってしまう
当然調べてundefinedの仕様を学べばいいんだけど、undefinedが最初から予約語ならそもそもこんなこと考える必要も、知る必要もなかったのにね、ということ

実際、jQueryとかでもほんの最近まで
(function(window,undefined){ 中身 })(window)
としてundefinedを上書きしてたし、プラグインとかではまだこの書き方が残ってるやつはかなりある
70: 2015/02/18(水)14:03 ID:SiK8hGV0(1) AAS
>>69
> これから書くときはほとんど気にする必要はない
IE7 はまだサポート期間が残っているので「気にする必要はない」は語弊があるのでは?
71: 2015/02/18(水)15:06 ID:9ZeaK8N0(1) AAS
文盲
72
(2): 2015/02/18(水)17:28 ID:yNLF/Zre(1/2) AAS
>>65
> ・{hoge: true, foo: false} のように Object 型でオプションを指定したい場合
直感的に思いついた通りに実装すればいいだろ
function test(hoge, foo) {
'use strict';
if (typeof hoge === 'boolean') {
console.log('hoge is', hoge);
} else if (typeof hoge === 'object') {
if (hoge.hasOwnProperty('hoge') && typeof hoge.hoge === 'boolean') {
console.log('hoge is', hoge.hoge);
省16
73
(1): 2015/02/18(水)19:17 ID:lIxPY8wl(1/2) AAS
>>72
それは Object 型の一部しか判定できてない
74
(1): 2015/02/18(水)20:55 ID:yNLF/Zre(2/2) AAS
>>73
変なコーディングをしてる訳でもなく目的は達しているんで問題無い
75
(2): 2015/02/18(水)21:00 ID:lIxPY8wl(2/2) AAS
>>74
特定の Object 型に制限する理由は全くない
それから Null 型が考慮されてない
配列も型判定がないからプロパティアクセス演算子でTypeErrorになる場合がある
ECMAScript でコードを書いた経験が少ないとしか思えないレベルだ
76
(2): 2015/02/18(水)22:43 ID:M4E75IrS(1/3) AAS
>>75
null(undefined)チェックを忘れた…
function test(hoge, foo) {
'use strict';
if (!hoge) return;
if (typeof hoge === 'boolean') {
console.log('hoge is', hoge);
} else if (typeof hoge === 'object') {
if (hoge.hasOwnProperty('hoge') && typeof hoge.hoge === 'boolean') {
console.log('hoge is', hoge.hoge);
省16
77: 2015/02/18(水)22:53 ID:M4E75IrS(2/3) AAS
>>75
こっちもだった
if (hoge && hoge.length > 0) {
console.log('配列の「ような」オブジェクト', hoge[0]);
}
↓これらで問題無し
var hoge = null;
var hoge = undefined;
var hoge = [];
var hoge = {};
省3
78
(2): 2015/02/18(水)23:37 ID:86t2mSil(2/3) AAS
>>65 はそもそも何を持って配列のようなオブジェクトといいたいのだろう
さすがに{length:10}を配列のようなものとは呼びたくないけど
79
(1): 2015/02/18(水)23:52 ID:86t2mSil(3/3) AAS
>>76
これそもそも第2引数は一度も使ってないけど、何のためにあんの?

あと、
if (!hoge) return;
追加したら
test(false,false);
の時の挙動変わってんじゃん
80
(1): 2015/02/18(水)23:55 ID:M4E75IrS(3/3) AAS
>>78
いや{length:10}de配列ライクと言えると思われる
var hoge = {length: 10};
for (var i = 0; i < hoge.length; ++i) {
console.log(hoge[i]);
}
で全部undefinedが出力されるけど、それは普通の配列でも有り得る事だし
var hogeArray = Array.prototype.slice.call(hoge);
で配列に変換も出来る
81: 2015/02/19(木)00:01 ID:4zgsUurY(1/2) AAS
>>79
直した…スマソ
function test(hoge, foo) {
'use strict';
if (typeof hoge === 'boolean') {
console.log('hoge is', hoge);
} else if (hoge && typeof hoge === 'object') {
if (hoge.hasOwnProperty('hoge') && typeof hoge.hoge === 'boolean') {
console.log('hoge is', hoge.hoge);
}
省5
82
(1): 2015/02/19(木)00:46 ID:+Jg4S+WS(1/2) AAS
>>80
JavaScript難しいなぁ
Array.prototype.slice.call(hoge);
ってするときに
hoge = {length:4.5} => 4コ
hoge = {length:Infinity} => 0コ
hoge = {length:99999999999 } => フリーズ
hoge = {length:-0.1} => 0コ
hoge = {length:-1} => フリーズ
hoge = {length:NaN} => 0コ
省3
83
(1): 2015/02/19(木)01:00 ID:4zgsUurY(2/2) AAS
>>82
sliceがマイナスの値は最後から処理するからな気がする
lengthがマイナスなのは配列とは言えないから
やっぱり
if (hoge && hoge.length > 0) {
var hogeArray = Array.prototype.slice.call(hoge);
}
ってのは必要だね
84: [age] 2015/02/19(木)01:35 ID:iPujbk1h(1) AAS
>>83
必要かどうかは仕様による。

>>83のコードが必要な理由は、lengthにマイナスが入ることが
プログラムの仕様的にありえるから、必要なのだろう?

lengthにマイナスが入った時どうするか?
例外を出すか、永遠と処理するか、hogeArrayをundefinedにするか。
それは仕様で決めること。

そのコードはhoge.lengthがマイナスの場合、hogeArrayは
undefinedになるという仕様のコード。
それの仕様でいいのかどうかを考える必要がある。
85
(2): 2015/02/19(木)08:45 ID:ACeVxkIV(1) AAS
>>76
> 単にnullチェック抜けてるって言えば済む問題を○型が考慮されてないとか
> お前の方が素人丸出しだ
そのコードは typeof 演算子の "Object (native and does not implement [[Call]])" しか対応できてないだろう?
外部リンク[3]:es5.github.io
前方互換性をふまえれば、ES6 でも正しく判定出来ることが望ましい
外部リンク[html]:people.mozilla.org
Null 型を誤検知するだけなら「Object 型の一部」とはいわない
あなたは ECMAScript 仕様書をまともに読んだことがないだろう?
ES 仕様に言及している意見に反論するなら仕様書ぐらい読んで欲しい
省5
86
(1): 2015/02/19(木)12:11 ID:k55gX30E(1) AAS
>>85
> そのコードは typeof 演算子の "Object (native and does not implement [[Call]])" しか対応できてないだろう?
それで事足りてるという事は仕様的に問題ないという事だ
対応できてない事で実用的に問題があるコード例を挙げて説明してくれ

そもそもJavaScriptは
var obj0 = {hoge:true, foo:false};
var obj1 = {foo:false, bar:1, hoge:true};
function Hoge() {this.hoge = true; this.foo = false;}
var obj2 = new Hoge();
のどれを渡されても同じように機能する事が期待されている
省1
87: 2015/02/19(木)13:17 ID:VHEGaKii(1) AAS
実際、>>72が直感的にコードを書いて多数間違えたぐらいだからなあ
rypeof演算子に関しては良い仕様とは言い難い
88
(1): 2015/02/19(木)15:27 ID:/+bx2aTM(1/2) AAS
なにがArrayLikeかは難しいよ。どういう目的で区別するかで変わると思う。なぜなら何を配列と見立てられるかは用途によって変わるから。
例えば配列に変換したいという場合なら、ES6のArray.fromを参考にすると、
lengthを持っているか(オブジェクトでなくともラッパーのプロトタイプにあればいい)、イテラブルならOK。
これが広義のArrayLikeだろう。

またはArray.prototype.concatで、引数をSpreadすべきかどうかなら、実は配列かどうかというチェックだと問題がある。
だからES6からは@@isConcatSpreadableのチェックに変わった。
要するに「一般的なArrayLikeの判定」を定義するのは無理というか、しても役に立つものにならないと思う。
89: 2015/02/19(木)16:24 ID:+Jg4S+WS(2/2) AAS
>>86
プロトタイプチェインはたどらないの?
90: 2015/02/19(木)19:11 ID:FI1nksg/(1) AAS
>>88
> ES6のArray.fromを参考にすると、lengthを持っているか(オブジェクトでなくともラッパーのプロトタイプにあればいい)、イテラブルならOK。
Array.from は配列に変換する、つまり Object 型に変換するから変換元が Object 型であることを求めないだけな気がする
ierator を除くと Array.from は ToObject, ToLength(Int32への変換)をしている
外部リンク[html]:people.mozilla.org
変換後のオブジェクトが ArrayLike と考えられるので ArrayLike は「Object 型」「Int32のlengthプロパティを持つ」になる
Array.from の挙動は>>85で説明されている Array.prototype.forEach の挙動と一致する
Array.prototype 系メソッドを一通り読めばわかると思うけど、全てそういう挙動になってるよ
対象を isArrayLike で判定して例外を返すか、ArrayLike に変換するか、は意見が別れる(ポリシーに依る)だろうけどね
ES6 の挙動に合わせるなら変換する方になる
91
(1): 2015/02/19(木)21:45 ID:/+bx2aTM(2/2) AAS
ToObjectがかかっているのは、null/undefinedはじきや、Getやらもろもろの処理がObjectであることを期待しているためだからであって、処理の本質とはあまり関係ないけどね。
あとToLengthはInt32でなく2^53-1までの整数。
長さを拡張すべきという問題が出て、Arrayに関しては互換性問題で見送られたけど、型付配列は長さ2^53-1までになったから、ここに関しても絶対基準はないと思う。
別にこの範囲でなくともエラーになるわけではなくて、範囲に収まるように強制されるだけだし。
92: 2015/02/19(木)22:21 ID:cTS5FQ8e(1) AAS
>>91
なるほど
ES6 の Array.prototype.forEach の length も 2^53-1 に拡張されてるんだな
外部リンク[html]:people.mozilla.org
今後、更に拡張される可能性を考えると、length に関しては Number.isInteger の判定ぐらいでいいのかもしれないな
外部リンク[html]:people.mozilla.org
93: 2015/02/23(月)05:03 ID:m2dP1v8u(1) AAS
別に整数かどうかの判定は要らないだろう。
「"5"」だったら「5」、「true」だったら「1」になるのがJS流だし。
整数の長さが欲しければ「len = obj.length|0」とするのがJS流。
94
(3): 2015/02/24(火)00:54 ID:XD7S4Fuq(1) AAS
try catchって頻繁に呼び出す関数では最適化できなくて遅くなるから使っちゃいけないのか?

知らなかった…Chromeのプロファイラに出ていた警告を見て初めて知った
95: 2015/02/24(火)11:35 ID:SsySdaPd(1) AAS
>>94
ループで、独自につくったルーチンなどを頻繁にそれつかって回すと激遅になる
ので、なるべく、どこかで検証用の別ルーチンで対処させるようにしてる。
96: 2015/02/24(火)12:16 ID:lFZ8d0+y(1) AAS
関数全体を覆わなければ問題ない。
一番ベストな使い方は関数呼び出しの部分だけに使用する。
try{ func() }
そうでなくても全体で使用しなければ、tryの掛かっていない部分はfor文等一定のブロックごとに最適化が働く。
97: 2015/02/24(火)12:32 ID:6vv1mCHr(1) AAS
>>94
try catchの使い方を間違えてるんでしょ。

try catchを正しく使うということは
try catchを使わないことを意味するw

何を行っているかわからないと思うが、
基本的に、windowのerrorイベントを使えばいいんだよ。
errorイベントは、誰もcatchしない時に呼ばれる所。
ここでまとめて処理すればいいし、普通はここで処理するもの。

例外的に途中でcatchしなくちゃいけない時だけcatchをする。
だからtry catchを正しく使う = try catchを使わないということになる。
省2
98: 2015/02/24(火)12:48 ID:wY5F80Ar(1) AAS
>>94
try-catch は例外を捕捉しなければエラー処理出来ない場合に使うもの
例外が発生する条件は確定しているのだから、 try-catch を使わなくても対応出来る場合が大半を占める
try-catch を使うのは new ActiveXObject() で対応する引数に応じて処理を分ける等の例外的なケースに限られる
99
(1): 2015/02/24(火)16:54 ID:gLNZIunY(1) AAS
netbeansを使ってるんだけど最初にテンプレが出ますよね?あれを編集する方法ないですか?
100: 2015/02/25(水)22:58 ID:JtIRtORE(1) AAS
現行スレ

+ JavaScript の質問用スレッド vol.123 + [転載禁止](c)2ch.net
2chスレ:hp
1-
あと 298 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.645s*