Javascript的循环中的k-v、v-k 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}" }
原生js和js的区别a 0
b 1
c 2
ruby好记住,主要是因为each_with_index 和 each,既然是带了index,那index在后⾯就刚刚好。到底应该k-v还是,v-k,不能统⼀⼀下嘛。⼀会⼉k-v,⼀会⼉v-k,真是够了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论