パスワードを忘れた? アカウント作成

こちらは、think49さんのユーザページですよ。 アナウンス:スラドとOSDNは受け入れ先を募集中です。

13507719 comment

think49のコメント: == と 型変換の関係性 (スコア 1) 60

JavaScriptで「(a ==1 && a== 2 && a==3)」という式の結果を真にするにはどうすればいいのか、StackOverflowで議論されている。

まず、`Object.prototpe.valueOf` を使う方法を考えました。


var a = {valueOf: (value => (() => value++))(1)};
console.log(a == 1 && a == 2 && a == 3); // true

このコードが気持ち悪いと思う原因は、`==` にあると考えます。
`==` は両辺の型が不一致の場合に可能な限り型を合わせようとする為、Object型をPremitive型に変換し、valueOf() による型変換を許してしまいます。
上記コードは下記の疑似コードとほぼ同じ動作になっています。


var a = {valueOf: (value => (() => value++))(1)};
console.log(Number(a) === 1 && Number(a) === 2 && Number(a) === 3); // true

ですので、両辺の型の不一致を `false` と評価する `===` に変更する事で、このテクニックは使えなくなります。


var a = {valueOf: (value => (() => value++))(1)};
console.log(a === 1 && a === 2 && a === 3); // false

「こんなJavaScriptは気持ち悪い」と評価されるきらいがありますが、本来、この機能は Primitive 型の機能を持ったオブジェクトをユーザが自由に生成できる意図があるように思います。
Number 型は `Number.prototype` にあるメソッドをプロトタイプチェーンの原則によって使えますが、Number 型の機能を拡張したい場合に `Number.prototype` を拡張するのは影響範囲が大きすぎる為、一般には使われません。
そこで、`CustomNumber.prototype` を拡張して、ユーザ定義の Number 型であるかのようなオブジェクトを生成したいとします。
valueOf, toString メソッドを使う事で、ある程度はそのようなオブジェクトを生成する事が出来ます。
JavaScriptの一部の演算子は Primitive 型に変換する事で役割を果たす為、Primitive 値をコントロールできるといろいろと都合が良いのです。
そのような「特別なオブジェクト」を生成したい、と考えたときに「JavaScriptは素晴らしい」と感じられるのかもしれません。

12504372 comment

think49のコメント: CSSと絵文字の相性問題 (スコア 1) 94

未検証ですが、例えば、下記スタイルシートが宣言されたとして絵文字は期待通りに表示されるのでしょうか。

.hoge {
    color: white;
    background-color: black;
}

もしくは、ユーザスタイルシートで文字色or背景色を変更しても期待通りに表示されるのでしょうか。
Webの世界では文字色(?)が固定の絵文字は微妙な気がしますね。

11574801 comment

think49のコメント: Re:砂糖摂取するよりはマシじゃね? (スコア 1) 77

チームはイスラエルの約380人を対象とした調査で、人工甘味料を多く摂取する人は摂取しない人に比べ、体重や腹囲の増加に加え、血糖値や糖尿病に関係する血液指標の上昇がみられるのを確認。

比較するなら「砂糖の摂取者」と「人工甘味料の摂取者」で統計を取って欲しいですね。
# 人工甘味料の摂取で血糖値が上がるのは当たり前な気がしますが、人工甘味料には「血糖値を上げずに糖分を摂取できる魔法の調味料」というセールス文句でもあったのでしょうか…。

11548108 comment

think49のコメント: Re:テキストの出来も非常によかったため (スコア 1) 65

そういう状況で
「おもしろかった! 職場のみんなで読んで笑わせてもらったよ。いい気分転換になった」
みたいな返しをして黙らせたってなんかの逸話があったな

どこかのニュースサイトで見た覚えがありますが、思い出せません。
プログラミング関連でしたっけ…?

11548059 comment

think49のコメント: Re:JavaScript (ECMAScript 5) の typeof 演算子 (スコア 1) 310

ES7でオーバーロード可能になるよ。
ES6ではObject.prototype.toStringされた時のクラス名の表示が自己申告(オーバーロード)できるようになった。

私の理解不足だと思うのですが、オーバーロードとtypeof演算子の関係性が分かりませんでした。
Object.prototype.toString は [[Class]] 判定であって型判定は別と認識しているのですが…。
もし、よろしければ解説頂けると有難いです。

あとnullが'object'になったり関数が'function'になったりするのも実用的には便利なことも多いよ。

おそらく、用途の違いだと思うのですが、私の場合、「Object 型に対して~したい」というケースがあります。
すると、厳密に Object 型を判定する必要があるので、typeof演算子で判定する際に [[Call]] の有無や Null 型の存在が邪魔になります。
そもそも、[[Call]] の有無は別機能で判定させるべきで typeof 演算子で判定する意味は全くないと思っています。
理想的には下記コードにようであって欲しい。

typeof null === 'null';           // true
typeof new Function === 'object'; // true
 
Function.hasCall(new Function); // true
new Function().hasCall()      ; // true

11548021 comment

think49のコメント: Re:JavaScript (ECMAScript 5) の typeof 演算子 (スコア 1) 310

null は !object で判別すれば特に困ることはないと思う。

Null 型に関しては仰るとおり、値で判定すれば良いので実質的には困っていないのですが、型を判定する演算子として用意された「typeof演算子」が「型」となる文字列以外を返している事から統一性がない現状を生み出しており、混乱の元となっている点は否めないと思います。

特に「Object 型として返す文字列値」の広範さは何なんですか、と軽く怒りを覚えます。
ES5 までは Object 型の判定として下記コードにようにしていました。
https://gist.github.com/think49/887049/38781c5081dd6845fe0d2169192ff4af6e123c9c

ところが、ES6 になって Symbol 型が増えて上記コードは Symbol 型の値を渡したときに期待通りに動作しません。
仕方なく、型が増えてもある程度は対応できるように下記コードに修正しました。
https://gist.github.com/think49/887049

このコードも ToObject で例外を返す型が増えれば破綻します。
いい加減、Object 型を判定するネイティブ機能が実装されて欲しいものです。
ES6 で実装予定だった Object.isObject はいつの間にか仕様から外されましたが、どうにかならないものですかね…。

undefined も同じだけど null と undefined を区別したい時は typeof 使えば undefined を区別出来るから問題ないよ。

私も Undefined 型には特に問題点は感じないですね。
var undefined で undefined が上書きできてしまう問題も ES5 で対策されましたし。

11548009 comment

think49のコメント: Re:JavaScript (ECMAScript 5) の typeof 演算子 (スコア 1) 310

typeof arg === 'hoge'             ; // Object 型なのに規定外の文字列

argって何?

arg は仮の変数なので意味はありません。
Object (non-standard exotic and does not implement [[Call]]) だと思ってください。
new ActiveXObject 辺りが該当したと思いましたが、具体的な値は忘れました。

11546223 comment

think49のコメント: JavaScript (ECMAScript 5) の typeof 演算子 (スコア 1) 310

ES5 の tyoeof 演算子 の仕様は心から何とかしてほしいですが、ES6 の typeof 演算子 でも手を入れられる様子がありません…。

typeof null === 'object'          ; // Null 型なのに "object"
typeof new Function === 'function'; // Object 型なのに "function"
typeof arg === 'hoge'             ; // Object 型なのに規定外の文字列

353001 comment

think49のコメント: Re:無断? (スコア 1) 64

> いいえ。Androidだと外部に送信するためにはインターネットへのアクセスという許可がいります。
インターネットのアクセスには「広告表示」「ライセンス認証」など様々な役目がありますが、ユーザがどんな目的でインターネットアクセスが行われるかを知る術があるでしょうか?

私は「i文庫 for Android - Android マーケットを購入しましたが、定期的にライセンス認証が走ることを知らなくてしばらくネット不通の環境に置いたら起動できなくなったことがあります。
i文庫はネットから青空文庫をダウンロードする機能があるのでそれを許可した認識でいました。
少なくともAndroidマーケットにはライセンス認証が走ることは書かれていないので多くの人は知らないと思います。

Windows なら Firewall で監視するんですがね…。Android でも同様の対策が必要になってくるのでしょうか。
294350 comment

think49のコメント: 発売は年末 (スコア 1) 135

確かに現時点では高スペックですが、発売は年末 なんですよね…。
その頃には Cortex-A9 を積んだ複数のタブレット端末が世に出ていると想像します。 Cortex-A10 も発表されているかもしれません。
typodupeerror

ハッカーとクラッカーの違い。大してないと思います -- あるアレゲ

読み込み中...