金利0無利息キャッシング – キャッシングできます

 | 

2008-06-27

JavaScriptのparseIntとmapを組み合わせる際の注意

18:04 | JavaScriptのparseIntとmapを組み合わせる際の注意  - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - JavaScriptのparseIntとmapを組み合わせる際の注意  - 金利0無利息キャッシング – キャッシングできます

小ネタ。WEB+DBの高林さんの連載を読んでちょっと思い出した。ちょっとまえにtwitterでそんなやりとりを見たのでメモ。

先頭が0の文字列をparseIntしてはまる例

http://ajaxian.com/archives/the-parseint-gotcha

parseInt("08") // => 0

parseIntは第二引数で基数を受け取る。2進数とみなしたり16進数と見なしたり36進数と見なしたり。先頭が0だと8進数だと見なされる。

map使うときにはまる例

// http://twitter.com/ku/statuses/841558573
["1","2"].map(parseInt) // [1, NaN] こうなるのってなんで? 

// http://twitter.com/33/statuses/841567018
'1234567890'.split('').map(parseInt) // 1,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0 

// http://twitter.com/33/statuses/841567333
'333333333'.split('').map(parseInt) // 3,NaN,NaN,NaN,3,3,3,3,3

// http://twitter.com/33/statuses/841567474
'1111111111111'.split('').map(parseInt) // 1,NaN,1,1,1,1,1,1,1,1,1,1,1 

// http://twitter.com/nanto_vi/statuses/841565832
["1", "2"].map(parseInt) -> [parseInt("1", 0, ["1", "2"]), parseInt("2", 1, ["1", "2"])]

mapに渡した関数には、引数としてvalue, index, selfが渡される。配列の要素の値、0からのインデックス配列自身のオブジェクト。それぞれ0進数,1進数,2進数 ... 9進数に変換しようとして、NaNが出てきてしまう。

なので

// こうしたり
'333333333'.split('').map(function(v){return parseInt(v, 10)}); // 3,3,3,3,3,3,3,3,3

// こんなのも可
Function.prototype.bind2nd = function(arg2){
	var self = this;
	return function(arg1){
		return self.apply(this, [arg1, arg2])
	}
};
'333333333'.split('').map(parseInt.bind2nd(10));  // 3,3,3,3,3,3,3,3,3

こんな感じで10進数と明示的に指定してparseIntしないとだめ。

brazilbrazil2008/06/27 22:17'1234567890'.split('').map(parseFloat)

トラックバック - http://subtech.g.hatena.ne.jp/mala/20080627
 |