前言
前后端采用不同的开发语言,作为后端开发为主的开发人员,了解两种语言的不同点更有助于快速了解和熟悉前端的开发;
本编主要是做后端linq和前端es6的对比,了解linq在后端的操作,如何在前端也实现同样的操作;
详细内容:以下方法,首字母大写是后端方法,首字母是小写是前端方法
1)后端 Where().Select() VS 前端 map()
map方法可以实现Where().Select()
比如:xxx.map(m => {
if(m.a == '1') return { c = m.b }
})
map方法可以单独实现.Select()
比如:xxx.map(m => { return m.a })
map方法可以单独实现.Where()
比如:xxx.map(m => { if(m.a == '1') return m })
map方法可以单独实现.Foreach()
比如:xxx.map(m => { if(m.a == '1') { //todo } })
ps:map的功能很多,但是它的主要功能是生成一个新的数组,所以它在单独实现.Where() 时性能不如filter(), 在单独实现.Foreach() 时性能不如foreach(),所以最好是在Where().Select() 和 .Select() 时用就好了,进一步来说有.Select()的需求才会用到map(),其他时候用对应的更适合的方法;
2)后端 Where() VS 前端 filter()
filter方法可以实现Where()
比如:let items = xxx.filter(m => m.a == '123'); // items is Array
3)后端 FirstOrDefault() VS 前端 find()
find方法可以实现FirstOrDefault()
比如:let item = xxx.find(m => m.a == '123'); // item is Object
4)后端 Any() VS 前端 some()
some方法可以实现Any()
比如:if(xxx.some(m => m.a == '123')) {
// todo
}
5)后端 All() VS 前端 every()
every方法可以实现All()
比如:if(xxx.every(m => m.a == '123')) {
// todo
}
6)后端没有的indexOf,findIndex
如果你已经有了一个数组中的一个对象,indexOf方法可以查找到这个对象在数据中的下标
比如:let index = items.indexOf(item) // items is Array, item is Object
如果你已经有了一个数组中的一个对象,findIndex方法可以查找到这个对象的id(某个元素)在数据中的下标,从而还可以判断这个对象是否在数组中存在
比如:let index = items.findIndex(m => m.a === '123') // index is int, not found is return -1;
if(index < 0) {
//todo not found thing
}
ps:我们系统中有很多把findIndex当做返回bool来用,导致返回值是0时,判断结果是相反的;如果想判断对象是否存在,更应该用find()方法,当然用filter(), some(), map()也都能实现;
7)后端Lambda VS 前端箭头函数
以上方法我们都有用到箭头函数 => ,类似于后端的lambda函数,
相对于前端的function定义来说,避免了this作用域被修改的问题,也就是箭头函数内的this与箭头函数外的作用域是一样的,总而言之就是让你放心的使用this,而不用担心this会被修改;
ps:有个瑕疵的地方是,运行状态下箭头函数的书写和运用都挺好,但是debugger下的this在箭头函数里鼠标放在this上却显示未定义之类的报错,这个时候还是在最外层声明let that = this来调试吧;
8)后端数组的判断、可空类型的判断
数组 items.HasElement() 替换 items != null && item.Any() 或者 items != null && items.Count > 0,理由是输入太长
字符串 str.HasValue() 替换 !string.IsNullOrEmpty(str) , 理由是不光太长,很多时候都是输入了str,想起要判断非空,又得从头开始写怪异的 !string.
可空布尔 flag.IsTrue() flag.IsFalse() 替换 !(flag ?? false) ,理由乍看之下,语义不明,就算大概了解也得想一下这是判断'非'还是'是'
ps: 多用扩展方法去实现简洁的功能,这样大家去写代码的时候会很容易发现有这些好用的方法;敲不出来的用alt+enter快捷键提示,前提是有人帮你写好扩展了,HasValue()是官方的扩展;
9)前端对象非空判断
== 与 === 是不同的方法,==涉及类型转换,===不涉及类型转换;
判断一下以下条件: F12中试一下
if(0)
if('0')
if('0' == false)
if('1' == 1)
if('0' == 0)
if('' == false)
如何判断一个变量是否为'非空'值
如何判断一个数组是否为'非空'值
分割线:
如何判断一个数组是否为'非空'值: if(items && items.length > 0)
如何判断一个变量非数组是否为'非空'值: 当v不能是int且为0值时,if(v) ;当v可能是int且为0值时,if(v && v !== 0)
if(v) 到底涵盖哪些判断:'', null, undefined...
==的类型转换有哪些特殊情况:
1. 比较的两边中有bool,会把 bool 先转换为对应的 number,即 0 和 1 ;
2. 比较的双边中有一边为number, 一边为string,会把string转换为number ;
3. string直接转换为bool的时候,空字符串‘'转换为 false,除此外的一切字符串转换为 true ;
标签:es6,map,items,前端,xxx,LINQ,Where,NET,方法 From: https://www.cnblogs.com/willardzmh/p/16636970.html