码迷,mamicode.com
首页 > 编程语言 > 详细

Javascript的循环中的k-v、v-k

时间:2015-09-10 13:19:39      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

jQuery中有一个 map方法,循环时候是 k-v:

$(‘:checkbox[checked]‘).map( (k, v) => $(v).val() ).get();

到了js这里的map,就变成了 v - k

[‘a‘, ‘b‘, ‘c‘].map( (v, k) => v) ;

js这样设计其实是为了方便省略 k,因为很多时候只需要v就够了,比如:

[‘2‘, ‘3‘, ‘4‘].map( v => parseInt(v) );

但过度的省略可能会带来歧义,比如 :

[‘2‘, ‘3‘, ‘4‘].map(parseInt);

=> [2, NaN, NaN]

这是一个非常著名的js大坑。

原因是 parseInt 的原型其实是 parseInt(string, base), 第二个参数其实是转换的进制,等价成了这样:

[‘2‘, ‘3‘, ‘4‘].map( (v, k) => parseInt(v, k) );

循环调用分别为:parseInt(‘2‘, 0);  parseInt(‘3‘, 1);  parseInt(‘4‘, 2);

所以最好写成:

[‘2‘, ‘3‘, ‘4‘].map( v => parseInt(v) ) ;

因为经常会忘记第一个到底是k,还是v,最好写成这样:

[‘2‘, ‘3‘, ‘4‘].map( (v, k) => parseInt(v) ) ;

鉴于jQuery和原生js的map函数都是非常常用的,k,v 还是 v,k,经常容易混淆,这样的不一样设计非常不好。

再看看其他语言的 GO的,go没有map,但range也差不多,go使用的是 k, v:

for k, v := range []byte{‘a‘, ‘b‘, ‘c‘} {
    fmt.Printf("%d %c\n", k, v)
}

=> 
0 a
1 b
2 c

考虑到go不允许出现未使用的参数,所以很多时候需要这样:

for _, v := range []byte{‘a‘, ‘b‘, ‘c‘} {
    fmt.Printf("%c\n", v)
}

虽然是麻烦了,但依然遵循 k, v 这样熟悉的排列方式。

Ruby中的循环,可选带上Index,但是确是js这样的 v - k 方式:

2.2.2 :005 > (‘a‘..‘c‘).each_with_index{|v, k| puts "#{v} #{k}" }
a 0
b 1
c 2

ruby好记住,主要是因为each_with_index 和 each,既然是带了index,那index在后面就刚刚好。

到底应该k-v还是,v-k,不能统一一下嘛。一会儿k-v,一会儿v-k,真是够了。

Javascript的循环中的k-v、v-k

标签:

原文地址:http://my.oschina.net/jsk/blog/504291

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!