.Net 面试

1. js 的闭包概念

闭包的定义:当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。

例子:

function A(){
    function B(){
       console.log('Hello Closure!');
    }
    return B;
}
var C = A();
C();// Hello Closure!

分析一下:

  • 定义普通函数 A
  • 在 A 中定义普通函数 B
  • 在 A 中返回 B
  • 执行 A,并把 A 的返回结果赋值给变量 C
  • 执行 C 

用途

先了解一下 Javascript 中的 GC 机制:

在 Javascript 中,如果一个对象不再被引用,那么这个对象就会被 GC 回收,否则这个对象一直会保存在内存中。

在上述例子中,B 定义在 A 中,因此 B 依赖于 A ,而外部变量 C 又引用了 B , 所以A间接的被 C 引用。

也就是说,A 不会被 GC 回收,会一直保存在内存中。

原文链接:https://www.cnblogs.com/onepixel/p/5062456.html

2.Jquery 如何实现动态事件绑定?

语法:

$(selector).on(event,childSelector,data,function,map) 

event:必需。规定要从被选元素移除的一个或多个事件或命名空间。

childSelector:可选。规定只能添加到指定的子元素上的事件处理程序(且不是选择器本身,比如已废弃的 delegate() 方法)。

data:可选。规定传递到函数的额外数据。

function:可选。规定当事件发生时运行的函数。

注意:使用 on() 方法添加的事件处理程序适用于当前及未来的元素(比如由脚本创建的新元素)。

$('.class').on("click",function(){……});相当于$('.class').bind("click",function(){……});

3.了解SQL注入?怎么样避免?

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

如何防止SQL注入

  归纳一下,主要有以下几点:

  1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双引号进行转换等。

  2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

  3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

  4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

  5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

可参考此文https://www.cnblogs.com/sdya/p/4568548.html

4.redis 和cache 的区别?

1、 Redis和cache都是将数据存放在内存中,都是内存数据库。不过cache还可用于缓存其他东西,例如图片、视频等等。 

2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。 

3、虚拟内存-Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘 

4、过期策略–cache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如业务配置进行设定

5、分布式–设定cache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从 

6、存储数据安全–cache挂掉后,数据没了;redis可以定期保存到磁盘(持久化) 

7、灾难恢复–cache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复 

8、Redis支持数据的备份,即master-slave模式的数据备份。

5.C#中,const 和 readonly 的区别?

1.常量必须在声明时就被初始化,指定了值后就不能修改了.只读字段可以在声明时被初始化,也可以在构造函数中指定初始化的值,在构造以后值就不能修改.

2.常量是静态的,而只读字段可以是静态和动态的

3.Const可以用在字段和局部变量,readonly只可以修饰字段

6.怎么建索引,注意点在哪?好处?

创建索引的好处
①通过创建索引,可以在查询的过程中,提高系统的性能

②通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

③在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间

创建索引的坏处
①创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增大

②索引需要占用物理空间,如果要建立聚簇索引,所需要的空间会更大

③在对表中的数据进行增加删除和修改时需要耗费较多的时间,因为索引也要动态地维护

应该在哪些列上创建索引呢
①经常需要搜索的列上

②作为主键的列上

③经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度

④经常需要根据范围进行搜索的列上

⑤经常需要排序的列上

⑥经常使用在where子句上面的列上

不应该在哪些列上创建索引
①查询中很少用到的列

②对于那些具有很少数据值的列.比如人事表的性别列,bit数据类型的列

③对于那些定义为text,image的列.因为这些列的数据量相当大

④当对修改性能的要求远远大于搜索性能时.因为当增加索引时,会提高搜索性能,但是会降低修改性能

详细请看此文https://blog.csdn.net/qq_36071795/article/details/83956068

7.如何避免事务死锁?

先介绍死锁的四个必要条件(只要破坏了其中任何一个条件,死锁就不可能发生):

  1. 互斥(Mutual exclusion):存在这样一种资源,它在某个时刻只能被分配给一个执行者(也称为线程)使用;
  2. 持有(Hold and wait):当请求的资源已被占用从而导致执行者阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源;
  3. 不可剥夺(No preemption):执行者获得到的互斥资源不可被强行剥夺,换句话说,只有资源占用者自己才能释放资源;
  4. 环形等待(Circular wait):若干执行者以不同的次序获取互斥资源,从而形成环形等待的局面,想象在由多个执行者组成的环形链中,每个执行者都在等待下一个执行者释放它持有的资源。

解决方法:

1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务; (细化处理逻辑,执行一段逻辑后便回滚或者提交,然后再执行其它逻辑,直到事物执行完毕提交)
2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
3 优化程序,检查并避免死锁现象出现;
4 .对所有的脚本和SP都要仔细测试,在正是版本之前。
5 所有的SP都要有错误处理(通过@error)
6 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁

8. session的实现原理

A、什么是Session?

  Session字面含义就是会话。由于HTTP是无状态协议,为了保持浏览器与服务器之间的联系,才有了Session。Session就是用于在服务器端保存用户状态的协议。通常用来保存用户的登录状态。

B、Session是如何实现的?

  Session内容保存在服务器端的,通常是保存在内存中,当然也可以保存在文件、数据库等等。客户端跟服务器端通过SessionId来关联, SessionId通常以Cookie的形式存储在客户端。每次HTTP请求, SessionId都会随着Cookie被传递到服务器端,这行就可以通过SessionId取到对应的信息,来判断这个请求来自于哪个客户端/用户。

使用建议/经验

1、建议&经验

  • Session中保存的数据的大小要考虑到存储上线不论是内存还是数据库
  • Session中不要存储不可恢复的内容
  • 依赖Session的关键业务一定要确保客户端开启了Cookie
  • 注意Session的过期时间
  • 负载均衡的情况下,由于存在Web服务器内存中的Session无法共享,通常需要重写Session的实现。

2、常见的Session丢失的问题

  • Session内容的丢失都是有原因的,通常都是由于Web服务器的重启造成的,比如IIS、Tomcat的重启

猜你喜欢

转载自www.cnblogs.com/GuDuYing/p/11031479.html