高效前端:JS高级技巧

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43624878/article/details/102325522

柯里化

柯里化就是函数和参数值结合产生一个新的函数。(说的这么高大上,其实就是把常用的东西整成一个函数,随时调用…)

假设有一个curry的函数:

function add(a,b){
	return a+b;
}
let add1=add.curry(1);
console.log(add1(5));   //6
console.log(add1(2));   //3

是不是感觉很简洁?
怎样实现这样一个curry的函数?
它的重点是要返回一个函数,这个函数有一些闭包的变量记录了创建时的默认参数,然后执行这个返回函数的时候,把新传进来的参数和默认参数拼一下变成完整参数列表去调用原本的函数:
这个函数很重要,具有“重定向指向”的功能,实在是居家旅行…的不二之选。

Function.prototype.current=function(){
	let slice=Array.prototype.slice;
	let defaultArgs=slice.call(arguments);   //指向Function的arguments(参数),把它slice(分割)——其实这句是为了防止“伪数组”
	let that=this;
	return function(){
		return that.reply(this,defaultArgs.concat(slice.call(arguments)));   //指向‘分割后再连接(concat)起来’的数据,然后作为返回值-》返回函数-》返回 被调用
	}
};

这里,我们用Array的属性slice把可能的“伪数组”转变成一个数组!

上面的东西,,,好像不大过瘾。
我们来看一个有用的例子:数组降序排序

let data=[1,5,2,3,10];
data.sort((a,b)=>b-a);   //[10,5,3,2,1]

这样给sort传一个函数的参数。但是如果你的降序操作比较多,每次这样做还是有点烦的。因此我们可以用柯里化把这个参数固化起来:

Array.prototype.sortDesc=Array.prototype.sort.curry((a,b)=>b-a);

这样用起来就方便多了:

let data=[1,5,2,3,10];
data.sortDesc();
console.log(data);   //[10,5,3,2,1]

(好吧,这样看其实好像更麻烦了…)

防止篡改对象

我们有时需要把对象保护起来,防止被无意中改动了…

Object.seal防止新增和删除属性

let person={
	name:"yin"
};
Object.seal(person);
//不能删(下面这句错误)
delete person.name;
console.log(person.name);   //还是会输出 yin

//不能添加
person.age=18;
console.log(person.age);   //输出undefined

上面两句console.log()在严格模式( strict )下会抛出异常。

当然,还有 Object.freeze——冻结对象 (这样做后对象的属性值将不能被改变)(注意:上面针对的是属性,这里是属性值) 和 defineProperty——冻结单个属性 (可设置 enumable/weitable 为 false,这个属性将不可遍历/改动 ,如下:)

var person={
	name:"yin"
};
Object.defineProperty(person,'grade',{
	enumable:false,
	value:3
});

猜你喜欢

转载自blog.csdn.net/qq_43624878/article/details/102325522