这两行代码的执行结果咋不一样(一个打开新窗口,一个在当前窗口打开新标签页)? this 不同?
`https://baidu.com https://163.com`.split(/\r|\n/ig).map(window.open) `https://baidu.com https://163.com`.split(/\r|\n/ig).map((one)=>window.open(one)) 
这两行代码的执行结果咋不一样(一个打开新窗口,一个在当前窗口打开新标签页)? this 不同?
`https://baidu.com https://163.com`.split(/\r|\n/ig).map(window.open) `https://baidu.com https://163.com`.split(/\r|\n/ig).map((one)=>window.open(one)) 1 wiluxy Apr 6, 2022 map 的回调函数会传入三个值 item,index,arr ,window.open 的参数也不止一个,第一种写法相当于是把他们三个值都传到了 window.open 里面,第二种是显式指定了只传第一个参数 |
3 SorcererXW Apr 6, 2022 后者更保险 |
4 noe132 Apr 6, 2022 interface Array<T> { map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; } interface Window { open(url?: string | URL, target?: string, features?: string): WindowProxy | null; } 这种问题还有另外一个常见的地方就是 map to parseInt ["20", "20", "20", "20", "20", "20", "20"].map(parseInt) // [20, NaN, NaN, 6, 8, 10, 12] FP 中完美的 Functor.map 只需要一个参数 v 就可以了,所以很多 fp 的轮子会专门有只有一个参数版本的 map 。 |
5 noe132 Apr 6, 2022 还有一个概念在 FP 中很常见叫做 Partial Application ,其实就是让多参数函数固定住几个参数。但通常是从左边开始。像这里这种我们也可以称作 Partial Application ,只不过没那么 FP 了。 const open = v => window.open(v) arr.map(open) 就类似于把后 2 个参数固定成了 undefined |
6 sudoy Apr 6, 2022 via iPhone 一楼正解 |
7 YuTengjing Apr 6, 2022 第二种方式完全是多余操作 |
8 autoxbc Apr 6, 2022 个人踩坑经验,除非 map 里的函数是你自己创建的,不然永远不要用第一种写法 |
9 SoloCompany Apr 6, 2022 |
10 mxT52CRuqR6o5 Apr 6, 2022 @YuTengjing 1#说的那么清楚还多余,执行结果都不符合预期了 |
11 YuTengjing Apr 6, 2022 @mxT52CRuqR6o5 #10 你真的看懂了吗?还结果不符合预期,你拷到 chrome 里面跑一下都不会吗? |
12 YuTengjing Apr 6, 2022 @mxT52CRuqR6o5 #10 Sorry, 逻辑确实不一样,不过我这边跑了一下,效果都是直接打开一个百度的窗口 |
13 shintendo Apr 7, 2022 常见的两个坑: 1 .map(parseInt) parseInt 有可选的第二个参数(进制) 2 Vue 写事件绑定 @click="getList" getList 如果有可选参数(页码),这个参数会接收到$event |
14 iqoo Apr 7, 2022 用 typescript 第一种写法根本就过不了编译 |
15 ragnaroks Apr 7, 2022 我想到 dotnet framework 的大坑了,以前因为这个导致过几个订单数据对不上的生产事故 method (Enumerable<T> list) method (T[] list) method (T v1,T v2) |
16 LeegoYih Apr 8, 2022 map 的参数是方法的引用,简单的说就是 map 需要传入一个方法。 map((one)=>window.open(one)),实际上是传了个匿名函数,匿名函数也称 lambda 表达式。 第一种方法等价于 map((a,b,c)=>window.open(a,b,c)),TS 编译不通过因为 map 需要函数的出入参类型与 window.open 提供的不匹配,实际上静态语言都如此。JS 中这 2 种都能用是因为它不校验出入参类型和参数数量。 PS:这里应该用 forEach ,map 不太合适 |