argumentsをArrayに変換する

id:amachangさんのエントリに
argumentsをArrayに変換する3つの方法が載っていたので
僕も一つ見つけてみました。

function test(){

    var args = [].slice.apply(arguments);

}

とりあえず僕の環境がMac OSXなのでIEでは未確認ですが
firefoxsafarioperaで動く事を確認しました。
明日出社したらIEで試してみます。


document.getElemets〜の戻り値にも適用できるんじゃないかと思い、

    var elements = [].slice.apply(document.getElementsByTagName('*'));

とやってみたのですが、firefoxOperaではOKでsafariではelementsが空っぽになってしまいました。


alert(!!elements.concat)  //trueと表示


となったので、Arrayのオブジェクトになってるようなのですが。
むしろこちらの変換方法を知りたくなりました。きっと便利だと思う。

最近、

javascriptを書いてて、配列の各要素を一つ一つ変数に代入するのがめんどくさかったので、

var [a,b,c] = "こんにちは,世界中,javascript".split(',')
alert(a)//こんにちは
alert(b)//世界中
alert(c)//javascript

こう書いたら、すんなり、希望通りの挙動!
と、おもったら
mozilla javascript1.7 複数の値を返す
に記述されてました。(今まで読んだ事無かった。。)だからIEでは動かない。
GMスクリプトとか書いた事無いですが、こんな書き方使いまくりでしょうか?
これを機にGMスクリプト書いてみようかな

undefined

var test;
alert(test);

"undefined"と表示されます。
だから、変数の値をリフレッシュしたいときは
undefinedってのを代入すればいいんだべー、と思って

var test = "hoge";
test = undefined;

って書いてました。


最近気づいたのですが、
この場合のundefinedは未定義の特別な値ではなく
undefiendという宣言も初期化もされていないundefinedという変数を
testに代入しているらしいのです。
(結果、未割当な値が代入されるのでtestはundefinedになる)
undefinedという概念は存在するんだけど、特別なキーワードではないので

undefinedという上書き可能なプロパティのようです。
id:sawatさんからご指摘いただき修正しました。2007/8/22)

undefined = "hogehoge";
alert(undefined);  //hogehogeと表示

普通にこういう事になります。


常識臭い?
ってか、そもそもそんな事しない?
明示的にundefinedにリフレッシュする場合は、

var test = 10;
alert(test);   //10と表示
test = void(0);
alert(test);    //undefinedと表示

とかすれば良いみたいです。

tvをみてたら

デトロイトテクノとかいう音楽の偉い人のインタビューをしてた。
「日本の若者たちに何かメッセージを」という質問に対して、


"No message, Just fuckin' do it "


そうだよな。
やるしかねぇよな。

Class::Insideout

なるCPANモジュールがあるそうで。
同じInsideout実装のClass::Stdとのベンチをとってみる。

#!/usr/bin/perl

package MyClass;
use Class::Std;
{
    my %name : ATTR( :get<name> :set<name> :init_arg<name>);
    my %age  : ATTR( :get<age> :set<age> :init_arg<age>);
    my %height : ATTR( :get<height> :set<height> :init_arg<height>);
}

package MyClass2;
use Class::InsideOut qw( public register );

public name => my %name;
public age => my %age;
public height => my %height;
sub new{ register(shift) }

package Main;
use strict;
use warnings;
use Benchmark;
my $name="hoge";
my $age=18;
my $height=165;
sub std {
    my $a = MyClass->new({
           name=>"okuhara",
           age=>27,
           height=>173,
       });
    $a->get_name();
    $a->get_age();
    $a->get_height();
    $a->set_name($name);
    $a->set_age($age);
    $a->set_height($height);
}
sub insideout {
    my $a = MyClass2->new({
            name=>"okuhara",
            age=>27,
            height=>173,
       });
    $a->name();
    $a->age();
    $a->height();
    $a->name($name);
    $a->age($age);
    $a->height($height);
}

timethese( 5000,{
    'std'=>\&std,
    'ins'=>\&insideout,
});

で、結果。

ins:  1 wallclock secs ( 0.41 usr +  0.00 sys =  0.41 CPU) @ 12195.12/s (n=5000)
std:  2 wallclock secs ( 0.73 usr +  0.01 sys =  0.74 CPU) @ 6756.76/s (n=5000)

2〜3年前のibookG4でやりました。
Class::Insideoutの方が2倍くらい速い。
環境によっては気にならないくらい差が縮まった。
でもClass::Stdのの方が遅め。
でも、Class::Stdで書いた方が3倍くらいカッコいい。

事故りました。



いや、今年は始まったばかりなのについてない事が多すぎる。
1月の末に財布を落とし、
その三日後に結構ガチンコで車にはねられました。
朝から体がフワフワ、頭がボーとしていたのですが、
そんな状態で会社に向かう途中、
誰かが横断歩道をわたった気がしたのでつられて自転車で横断歩道に
入ったらまんまと赤信号だったという。(はっきりとは覚えてませんが)
ガチンコではねられたわりには、恥骨・せん骨の骨折と打撲・擦り傷
という奇跡的な軽傷ですみ、
2週間ちょっと入院して、本日退院。
マジ運が良いよ。俺。


交通事故って保険が効かないんですね。
労災おりてなかったら、ホント破産ですよ。
しかし、この事故結構な割合で僕が悪いので賠償諸々などスゴく心配です。
ま、生きてるだけでもホント神に感謝ですよ、何とかなるさー。