.net LINQ和es6的对比

前言

前后端采用不同的开发语言,作为后端开发为主的开发人员,了解两种语言的不同点更有助于快速了解和熟悉前端的开发;

本编主要是做后端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 ;

 

posted @ 2022-08-29 20:30  willardzmh  阅读(157)  评论(0编辑  收藏  举报