練炭ブログ

萌え壁紙、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

DMonkey: ===、!== 演算子の不具合

コメントなし»

number 型は内部で整数型と浮動小数点型に分かれているのですが、=== 演算子はそれぞれを別の型と見なしてしまい、数値として等価であっても false になります。

alert (1 === 1.0);  // false
alert (parseInt ('1') === parseFloat ('1'));  // false

!== 演算子は左辺と右辺の型が違うと false になる不具合が内部型にも該当し、数値として等価でなくてもfalse になります。

alert (1 !== 2.0);  // false
alert (parseInt ('1') !== parseFloat ('2'));  // false

DMonkey: !== 演算子の不具合

コメントなし»

厳密な比較を行う ===!== 演算子ですが、!== の方は左辺と右辺の型が違うと false になってしまいます。

alert (1 === 1); // true
alert (1 === 2); // false
alert (1 === '1');  // false

alert (1 !== 1); // false
alert (1 !== 2); // true
alert (1 !== '1');  // false

DMonkey: 名前付き関数式からの参照

コメントなし»

過去に書いた名前付き関数式で定義されたグローバル関数からはクロージャが使えないからの関連で。

参照先オブジェクトが属するスコープから抜ける前なら(クロージャとしての定義時の環境ではなく実行時の環境として)、名前付き関数式のブロック内から参照することは出来ます。

(function () {
  (function () {
    function common_load () {
      void function x () { alert (typeof common_load); };
    };
    common_load ();

    x ();  // function (まだ生きている)
  }) ();

  x ();  // undefined (スコープを抜けたので消失)
}) ();

Dorothy2 の Dorothy2A.dms では OnHttpRequest() 内で common_load() が定義されていて、実行終了まで OnHttpRequest() を抜けないので、common_load() で実行したスクリプトで名前付き関数式によって定義された関数内からも common_load() を呼び出せる、という挙動のようです。

あと名前付き関数式でなくて無名の関数式(を変数に代入したもの)でもスコープ抜けたら参照できなくなります。

DMonkey: 変数経由のnew演算子

コメントなし»
function Foo () {
  alert ('Foo constructor');
}
Foo.prototype.p = function () {
  alert ("this is Foo\nnameOf = " + nameOf (this));
};

function Baz () {
  alert ('Baz constructor');
}
Baz.prototype.p = function () {
  alert ("this is Baz\nnameOf = " + nameOf (this));
};

function test () {
  var f = new Foo ();  // Foo constructor
  f.p ();  // this is Foo, nameOf = Foo

  var Bar = Foo;
  var f2 = new Bar ();  // Foo constructor
  try { f2.p (); } catch (e) { alert (e); }  // ENameError

  var Baz = Foo;
  var f3 = new Baz ();  // Foo constructor
  f3.p ();  // this is Baz, nameOf = Baz
}
test ();

変数に関数を代入してその変数名で new すると、参照している関数がコンストラクタとして呼び出されますが、prototype として使われるのはその変数名と同名の関数の prototype になってしまいます。

名前付き関数式はグローバルスコープに対する関数宣言として動作する の末尾のエラー例も、これと同じことだと思います。

DMonkey: StringBuffer.indexOf() の不具合

コメントなし»
var sb = new StringBuffer ('aZ');
alert (sb.indexOf ('Z', 0));  // 1 
alert (sb.indexOf ('Z', 1));  // 1
alert (sb.indexOf ('Z', 2));  // 1 ※本来は -1
alert (sb.indexOf ('Z', 3));  // 1 〃
alert (sb.indexOf ('Z', 4));  // 1 〃

StringBuffer.indexOf()

  • 1バイトの文字列を検索。
  • 検索開始位置に length 以上の値を指定。
  • 末尾の文字が検索する文字と同じ。

という条件の時、-1 ではなく末尾の文字の位置を返してしまいます。

検索する文字列が2バイト以上なら問題ないようですが確証はありません。

Irvine: DOA インストールメモ

コメントなし»

●アーカイブからファイルをコピー

http://u1.getuploader.com/irvn/download/549/DOA.tx-.zip

Dorothy2\document\プログラミング\DOA.txt を
%Irvine%\Dorothy2\document\プログラミング\ にコピー。

http://u1.getuploader.com/irvn/download/376/DOA0.17.zip

xor100813_2.dms を
%Irvine%\scripts\ にコピー。

http://u1.getuploader.com/irvn/download/388/DOA018.zip

DOA.txt を
%Irvine%\Dorothy2\document\使い方\ にコピー。

xor100813.dms を
%Irvine%\scripts にコピー。

http://u1.getuploader.com/irvn/download/1112/DOA.zip (ver0.22)

DOA.dfm と DOA.dms を
%Irvine%\scripts にコピー。

●Irvine のオプション設定

ツール→オプション設定→スクリプトを開く。
OnListMenuClick の DOA にチェックを入れる。
OnTreeMenuClick の DOA にチェックを入れる。

●DOA スクリプトのコピー

使用したい DOA スクリプトのファイルを
%Irvine%\Dorothy2\DOA にコピー。

※Dorothy2 のパッケージインストール機能で出来る。

●その他

openQfolder 関係は省略。
使う場合は DOA018.zip と xor100914.zip(修正版) からコピーする。

YouTube URL サンプル

コメントなし»

増えてきたのでこっちに保存。

RTMP
http://www.youtube.com/watch?v=bEPO400pwgE

日本語投稿者名
http://www.youtube.com/watch?v=WUjnBoIjZL0

有料 この動画はお住まいの地域ではご利用いただけません。
http://www.youtube.com/watch?v=AtzsWDbFzps

4K2K
http://www.youtube.com/watch?v=N0m1XmvBey8

3D
http://www.youtube.com/watch?v=Ya5eQ_QfAog

3D変換有効
http://www.youtube.com/watch?v=9jGvCdthQso

VP9
http://www.youtube.com/watch?v=aPkyPdubqDs

itag 264
http://www.youtube.com/watch?v=huxJKlMSu0k

関連:
YouTube でタイトルに結合文字が使われている例

DMonkey: void 演算子、++ 演算子、-- 演算子

コメントなし»

void 演算子は JavaScript では undefined を返しますが、DMonkey は null を返します。

alert (void 1);   // null

++ 演算子、-- 演算子は小数部を最近接偶数への丸め(round half to even)で整数化したあとに +1、-1 します。

var a = 1.2;
alert (++a);   // 2

var b = -2.5;
alert (--b);   // -3

おまけ。

alert (nameOf ({ }.prototype));   // Prototype

DMonkey: 数値リテラル

コメントなし»

数値リテラルの表記に誤りがあると通常は SyntaxError が発生しますが、一部のパターンではエラーにならず NaN として解釈されます。

alert (1e2x);   // NaN
alert (1e2.0);   // NaN

16進数リテラル 0x80000000 ~ 0xffffffff、0x8000000000000000 ~ 0xffffffffffffffff は負数になります。

0x0 ~ 0xffffffff は32ビット値を符号付き整数として、0x100000000 ~ 0xffffffffffffffff は64ビット値を符号付き整数として解釈しているのかもしれません。

alert (0x7fffffff);   // 2147483647
alert (0x80000000);   // -2147483648
alert (0xffffffff);   // -1
alert (0x100000000);   // 4294967296
alert (0x7fffffffffffffff);   // 9.22337203685478E18
alert (0x8000000000000000);   // -9.22337203685478E18
alert (0xffffffff00000000);   // -4294967296
alert (0xffffffffffffffff);   // -1

DMonkey: if/else ブロック内での関数定義

コメントなし»
(function () {
  alert (typeof foo + (typeof foo == 'undefined' ? '' : foo ()));
  if (true) {
    function foo () { return '#1'; }
  }
  else {
    function foo () { return '#2'; }
  }
  alert (typeof foo + (typeof foo == 'undefined' ? '' : foo ()));
}) ();
ブラウザ 1回目の alert 2回目の alert
IE function#2 function#2
Chrome function#2 function#2
Firefox undefined function#1
DMonkey undefined function#1

truefalse に変更した場合。

ブラウザ 1回目の alert 2回目の alert
IE function#2 function#2
Chrome function#2 function#2
Firefox undefined function#2
DMonkey undefined function#2

IE と Google Chrome は if/else ブロックのなかにあっても関数本体での定義として解釈され、後から記述した方(#2)が関数内全域で有効となります。

Firefox と DMonkey では、関数文が実行された時点でその関数(#1 または #2)が定義されます。