掘友等级
获得徽章 0
一直想当然的觉得箭头函数中的this是由定义时它所在的父作用域链
在严格模式下,全局环境下的this是undefined
这时如果在全局环境下定义箭头函数,想当然的以为这时候箭头函数的this应该也是undefind,事实上却是window
全局对象的箭头方法里面的this也是window
事实胜于雄辩
一行代码实现函数组合
const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args)));
或者下面这句也行
const compose = (...fns) => (arg) => fns.reduce((f, g) => g(f), arg)
再看redux中的函数组合,原来原理也不过如此
这应该是我见过函数柯里化源码最小又最容易理解的代码了
其实函数柯里化就是将多个参数的一个函数转换成一系列的函数
所以我们实现这个功能的核心在于只有最后收集到全部参数的时候才执行,否则一直返回函数且累加之前传过来的参数
数据的indexOf的第二个参数表示从哪个位置开始查起,我们暂且称这个参数叫fromIndex
fromIndex里面有一些比较有趣的特点,比方说我现在有一个这样的数组
var arr=[1,2,3,4,5,6,7,8,9]
1、arr.indexOf(3,10) // -1 索引值大于或等于数组长度,意味着不会在数组里查找,返回 -1
2、arr.indexOf(8,-1)// -1 索引值是负数,比方说是-1则表示从数组的倒数第一位开始找,数组的倒数第一位是9,后面也没有值了,所以就找不到8 函数返回有结果就是-1
3、arr.indexOf(8,-10) // 7 10已经比数组的长度还要大,-10会和数组的长度9抵消,抵消之后索引值还小于0,则整个数组都将会被查询,因为fromIndex的默认值为0



假设有一个数组是var arr = ['old', 1, true, null, undefined];浅拷贝数组的方式:
1、var new_arr = arr.concat();
2、var new_arr = arr.slice();
3、var [...new_arr]= arr;
4、var new_arr = Array.from(array)
还有更多么?可以一起讨论一下
数组去重一般有这样一种实现思路
先把数组进行排序,排序好之后只要比较相邻元素是否相等,如果不相等则表示唯一,相等则表示重复
但其实也会有坑,比方说我下面的这个例子
一般数组去重的方法里面总少不了会用Object的key唯一性来做,key可能会用typeof item + JSON.stringify(item)
但是同一个对象写法里,字面量属性顺序不同JSON.stringify的结果也不同
大家有发现这种方法往深了想确实不太可行么?
如果一眼就能看出以下这些值的返回结果,那类型转换应该就攻克了

类数组转数组有很多种方式
一图胜千言


但是在使用splice这种方式转换的时候,需要注意的是像HTMLCollection、NodeList等这类型的类数组时,因为它们的length 属性为只读,而splice 底层还是会修改 length 的长度,所以在转换的时候会报错,见下图示例
闭包经典面试题,原来还可以用arguments.callee来实现

下一页