基础知识 - C#
一、.Net基础
1.Finalize()和Dispose() 的异同.
参考答案:http://blog.sina.com.cn/s/blog_4b4cf2af0100t1i0.html
https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-4.0/b1yfkh5e(v=vs.100)
答:(1)释放非托管资源服务的函数我们知道有Finalize 和Dispose(bool disposing)和 Dispose()三种方式,但是为什么还需要一个Dispose()方法?难道只有一个Dispose(bool disposing)或者只有一个Dispose()不可以吗?
不可以. 为什么呢?因为如果只有一个Dispose()而没有Dispose(bool disposing)方法.那么在处理实现非托管资源释放的代码中无法判断该方法是客户调用的还是垃圾回收器通过Finalize调用的.无法实现判断如果是客户手动调用,那么就不希望垃圾回收器再调用Finalize()(调用GC.SupperFinalize方法).另一个可能的原因(:我们知道如果是垃圾回收器通过Finalize调用的,那么在释放代码中我们可能还会引用其他一些托管对象,而此时这些托管对象可能已经被垃圾回收了, 这样会导致无法预知的执行结果(千万不要在Finalize中引用其他的托管对象).
所以确实需要一个bool disposing参数, 但是如果只有一个Dispose(bool disposing),那么对于客户来说,就有一个很滑稽要求,Dispose(false)已经被Finalize使用了,必须要求客户以Dispose(true)方式调用,但是谁又能保证客户不会以Dispose(false)方式调用呢?所以这里采用了一中设计模式:重载 把Dispose(bool disposing)实现为 protected, 而Dispose()实现为Public,那么这样就保证了客户只能调用Dispose()(内部调用Dispose(true)//说明是客户的直接调用),客户无法调用Dispose(bool disposing)。
(2)Finalize 和Dispose(bool disposing)和 Dispose() 的相同点:
这三者都是为了释放非托管资源服务的.
(3)Finalize 和 Dispose() 、Dispose(bool disposing)的不同点:
Finalize是CLR提供的一个机制, 它保证如果一个类实现了Finalize方法,那么当该类对象被垃圾回收时,垃圾回收器会调用Finalize方法,而该类的开发者就必须在Finalize方法中处理非托管资源的释放。但是什么时候会调用Finalize由垃圾回收器决定,该类对象的使用者(客户)无法控制。从而无法及时释放掉宝贵的非托管资源.由于非托管资源是比较宝贵了,所以这样会降低性能。
Dispose(bool disposing)不是CRL提供的一个机制, 而仅仅是一个设计模式(作为一个IDisposable接口的方法),它的目的是让供类对象的使用者(客户)在使用完类对象后,可以及时手动调用非托管资源的释放,无需等到该类对象被垃圾回收那个时间点.这样类的开发者就只需把原先写在Finalize的释放非托管资源的代码,移植到Dispose(bool disposing)中. 而在Finalize中只要简单的调用 "Dispose(false)"(为什么传递false前面已经解释)就可以了.
2.方法声明中的params 关键字之后不允许任何其他参数,这一说法正确吗?
答:params 是C#开发语言中关键字, params主要的用处是在给函数传参数的时候用,就是当函数的参数不固定的时候。 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。 关于参数数组,需掌握以下几点。
a)、若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后。
b)、不允许将params修饰符与ref和out修饰符组合起来使用。
c)、参数数组必须是一维数组。
d)、与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量。
e)、若实参是数组则按引用传递,若实参是变量或表达式则按值传递。
3. C#中双问号(??)的作用
参考答案:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/
答:?? 运算符是 null合并运算符,
如果左操作数的值不为 null,则 null 合并运算符 ?? 返回该值;否则,它会计算右操作数并返回其结果。
如果左操作数的计算结果为非 null,则 ?? 运算符不会计算其右操作数。
DateTime? createDate = null; DateTime? defaultDate= null; DateTime secondDate = DateTime.Now; createDate = createDate ??defaultDate??secondDate; // 如果createDate 为空,则对defaultDate求值,如果defaultDate不为空,则将defaultDate赋值给createDate 。
// 否则继续计算secondDate,是不是null都赋值给createDate ,因为是最后一个表达式
4.可访问性级别包括哪几种?请具体描述所列级别。
答:private,私有访问是允许的最低访问级别。私有成员只有在声明它们的类和结构体中才是可访问的
protected,受保护成员在其所在的类中可由派生类实例访问。
public,公共访问是允许的最高访问级别。对访问公共成员没有限制
internal只有在同一程序集的文件中,内部类型或成员才是可访问的
5.using 三种使用方式
参考答案:https://www.cnblogs.com/dachengxiaomeng/p/7452021.html
答:using 三种使用方式
1.using指令。
using 命名空间名字。
这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到。
2.using别名。
using 别名 = 包括详细命名空间信息的具体的类型。
这种做法有个好处就是当同一个cs引用了两个不同的命名空间,但两个命名空间都包括了一个相同名字的类型的时候。当需要用到这个类型的时候,就每个地方都要用详细命名空间的办法来区分这些相同名字的类型。而用别名的方法会更简洁,用到哪个类就给哪个类做别名声明就可以了。注意:并不是说两个名字重复,给其中一个用了别名,另外一个就不需要用别名了,如果两个都要使用,则两个都需要用using来定义别名的。
3.using语句。
定义一个范围,在范围结束时处理对象。
当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。
6. 异常处理代码段catch(InvalidOperationException ex){}中,使用throw ex和throw有什么区别
参考答案:https://www.cnblogs.com/OpenCoder/p/6208284.html
答:throw ex这种写法会让C#重置异常的抛出点,使用throw和throw ex唯一的不同就是throw并不会让C#重置异常的抛出点
7.Equals和==的区别
参考答案:https://www.cnblogs.com/codersun/p/6828277.html
答:1.1值类型
在值类型中,Equals都是通过==来实现的,所以在值类型中,Equals和==其实是完全一样的东西。
1.2引用类型
本质上来说,Equals都是集成自Object的Equals方法,通过反编译,可以看到Equals内部的逻辑,
即:引用相同返回true,或者两个对象都不为空的情况下,内部值相同,也返回true。
所以在值类型中,==是判断引用是否相同,而Equals判断内部值是否相同,当然如果引用相同内部值肯定也相同。
1.3 String字符串类型
字符串类型比较特殊,是因为在string类的内部对Equals和==两个方法都进行了重写。
在string里面,Equals和==的意义是相同的,全都是表示判断string的内部内容是否相同。
8.IEnumerable<T>和IQueryable<T>区分
参考答案:https://www.cnblogs.com/zgqys1980/p/4047315.html
答:接口IQueryable<T>实际也是继承了IEnumerable<T>接口的,
针对LINQ to OBJECTS 时,使用Enumerable中的扩展方法对本地集合进行排序和查询操作,查询参数接受的是Func<>,Func<>叫做谓语表达式,相当于一个委托。
针对LINQ to SQL时,则使用Queryable中的扩展方法,它接受的是Expression<>。
原因在于Func<>直接会被编译器编译成IL代码,但是Expression<>只是存储了一个表达式树,在运行期作处理,LINQ to SQL最终会将表达式树转为相应的SQL语句,然后在数据库中执行。
IQueryable与IEnumerable的区别在于前者的filter逻辑在DB端执行,后者的filter逻辑在Client端执行。
如果数据集合均为内存数据,建议使用IEnumerable。
如果数据是从数据库中获取,建议使用IQueryable,这样可以降低网络流量和充分利用SQL Server的处理能力。
9.C#是否可以对内存直接操作?
答:可以,在unsafe(非安全代码)关键字包裹下使用指针。
10.C#多线程数据如何同步?
答:使用监视器(Monitor),读写锁(ReadWriteLockSlim),互斥锁lock (obj),Volatile和Interlocked的方法,可使用任务(Task)
11.简述Socket通信建立和断开链接过程。
答:第一次握手,客户端发送SYN包到服务器,等待服务器确认。
第二次握手,服务器收到SYN包后,确认SYN包,同时也发送一个SYN包,即SYN+ACK包。
第三次握手,客户端收到服务器SYN+ACK包,向服务器发送确认包ACK。
第一次挥手,客户端发送一个FIN包,表示关闭客户端到服务器的数据传送。
第二次挥手,服务端收到FIN包,发送一个ACK确认。
第三次挥手,服务端发送一个FIN包,表示关闭服务端到客户端的数据传送。
第四次挥手,客户端发回报文ACK,确认关闭。
为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这 是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一 个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文 和FIN报文多数情况下都是分开发送的。
12. C#中string str= null 与 string str=”" 有什么区别?
答:string str = null不会为str分配内存空间,而string str = “”则分配长度为空字符串的内存空间.
13.ASP.Net中<%#%>和<%%>有什么区别?
答:asp.net中<%%>的意思是在页面上运行c#或者vb代码
asp.net中<%#%>出现在repeater gridview等控件中。用以绑定控件的datasource
14.String类可以继承吗?
答:String类是sealed类故不可以继承。
15.后台更新,通知前端的方式
答:Ajax定时轮询;websocket;signalr;socket.io(node.js);
16.代码片段Class Base{};Public class My:Base{}; 会导致什么样的情况?
答:Inconsistent(不一致; 相矛盾;) accessibility: base class 'ExerciseLibrary.Base' is less accessible than class 'ExerciseLibrary.My'
17.string和stringbulider 类的区别
答:string本身是不可改变的,它只能赋值一次,每一次内容发生改变,都会生成一个新的对象,然后原有的对象引用新的对象,而每一次生成新对象都会对系统性能产生影响,这会降低.NET编译器的工作效率。
而StringBuilder类则不同,每次操作都是对自身对象进行操作,而不是生成新的对象,其所占空间会随着内容的增加而扩充,这样,在做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。
18.C# 中new关键字有哪些用法?
答:1)new 运算符:用于创建对象和调用构造函数。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。
19.请列举出你知道C#中的集合类型。
答:ArrayList,List,HashTable,Directonary,ImmutableList
20.嵌套类型可以访问外部包含类型的所有的private成员,这一说法正确吗?
答:正确
21.event的本质是特殊类型的 _____委托_______.
22.C#中对象要实现复制功能,则必须实现 __ ICloneable___ 接口
23. 以下关于ref和out的描述哪些项是正确的?(多选)(ACD)
A. 使用ref参数,传递到ref参数的参数必须最优先初始化。
B. 使用out参数,传递到out参数的参数必须最优先初始化。
C. 使用ref参数,必须将参数作为ref参数显式传递到方法
D. 使用out参数,必须将参数作为out参数显式传递到方法
答:out、ref都是引用传递,传递后使用都会改变原有的值,引用传递都需要显示传递到方法。
ref 是有进有出,即能将参数传进去,函数里对变量的改变在函数结束时会改变值,因此需要在传递进去前初始化。
out 是只出不进,即将参数传进去时值是无效的,out会把参数清空,所以无法将一个值从 out 传递进去。
26.CLR的回收机制
多线程
1.线程池中的线程是前台线程还是后台线程? 前台线程和后台线程的区别是什么?
答:托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。
应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
2. 请解释进程与线程的区别?进程与程序的区别
答:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和调度的基本单位。
进程与程序的区别在于,程序是静态的,进程是动态的。程序只是一个静态的指令集合,而进程是一个正在系统中运行的指令集合。有了时间的概念,如生命周期;
27.多线程熟悉吗?平时是怎么使用
概念
1.反射的概念
反射提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
一般使用:工厂类,通过反射创建类的实例,实现层与层之间的解耦: 数据层→数据会话层→业务逻辑层。 其中,数据会话层通过反射创建数据层的实例,业务逻辑层调用。
2.单例和多例的区别
答:所谓单例就是所有的请求都用一个对象来处理,比如常用的service和dao (Data Access Object)层的对象通常都是单例的。它有两个主要的特点:构造函数私有,它的唯一实例必须由自身创建。如果我们要使用单例对象,不能通过new去创建,要通过该对象的getInstance()方法获取这个唯一的实例。
而多例则指每个请求用一个新的对象来处理,比如action,通过new创建。
之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
用单例和多例的标准只有一个:
当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例;
多线程编程在这两种模式下的使用特点:
(1)如果一个对象含有静态变量或者静态方法(且方法内部使用了静态变量),不管该对象是单例模式还是多例模式,都存在线程不安全的问题,需要使用synchronized同步锁。
(2)单例模式下,如果对象含有公共成员变量,存在线程不安全。在调用对象的方法时,每个线程都会在自己的栈内存中开辟一段空间来复制并执行该方法,因此,如果该方法不涉及公共成员变量,就是线程安全的,否则就是线程不安全。
(3)多例模式下,如果没有静态属性,线程安全。
3.什么是可空值类型,它主要解决什么问题。
答:先来看一下C#1中还没有可空值类型的时候是如何解决这些需求的。
方法1:使用一个默值。确切的来说,是使用一个特定值来表示一个空值,比如DateTime.MinValue,但是这个办法很牵强,没有很好的说服力,它只是一个实现可控值类型的权宜之计。
方法2:引用类型的包装,值类型的优点之一是不需要GC去回收,把一个值类型包装成一个引用类型,GC的开销问题没有很好的解决。同时,值类型同引用类型的转换会造成装箱和拆箱,虽然C#2的泛型能够解决这个问题,但是开头说的垃圾回收没有解决。
方法3:用一个全新的值类型来表示可空值类型,这个值类型中包含一个bool值来表示是否包含一个真正的值,并包含一个表示这个值的属性。方法3正是C#2中做出的最终的决定:Nullable<T>,可空值类型。
4.匿名类型对象是可变对象还是不可变对象。
答:不可变(immutable): 即对象一旦被创建初始化后,它们的值就不能被改变,之后的每次改变都会产生一个新对象。
Net提供的不可变集合ImmutableStack/ImmutableQueue/ImmutableList 等等。
在C#中,您可以使用readonly语句强制实现类的字段的不变性。通过强制所有字段不可变,您将获得不可变类型。
5.静态类、静态字段和静态方法
参考答案:https://www.cnblogs.com/aimi/p/5499711.html
答:1.静态类
永远也不需要实例化的类,这种类唯一的作用就是将一组相关的成员组合到一起。static 关键字只能用于类,不能用于结构,因为CLR 总是允许值类型实例化,没办法阻止(By 《CLR via C#》)。静态类有如下特点:
(1)不能实现任何接口(因为只有类的实例才可以调用类的接口方法);
(2)内部只能定义静态的字段、方法、属性和事件;
(3)静态类是密封的,因此不可被继承。(使用关键字static定义的类,编译器将该类同时标记为abstract 和sealed)
2.静态字段
静态字段被类的所以实例共享,所有实例都访问同一内存位置。如果该内存位置的值被一个实例改变了,则这种改变对所有的实例都可见。
注意:在创建某个类型的实例之前,就应该初始化该类型的所有静态成员变量。
3.静态方法
(1)静态构造函数
静态构造函数是一个特殊的函数,将在其他所有方法执行之前以及变量或属性被第一次访问之前执行。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。可以使用该函数来初始化静态变量,不应该使用实例构造函数初始化静态变量。
请看下面例子:

例子1中输出为:ERP,B类中的构造函数并没有执行。这是因为B类继承了A类的静态字段,静态字段只在调用之前执行一次;例子2中输出为OA,因为调用的是B类的实例构造函数,在B类的实例构造函数之前会执行父类的静态构造函数,在执行父类的静态构造函数之前初始化父类的静态字段。执行顺序如上图标注。
(2)其它静态方法
C#静态方法是一种特殊的成员方法 它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。C#静态方法调用时无法判断非静态变量使用的内存地址,所以静态方法只能访问类中的静态成员,也只能调用类中的静态方法。静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。
6.什么是委托?
答:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,
这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
using System; using System.Collections.Generic; using System.Text; namespace Delegate { //定义委托,它定义了可以代表的方法的类型 public delegate void GreetingDelegate(string name); class Program { private static void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } private static void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); } //注意此方法,它接受一个GreetingDelegate类型的方法作为参数 private static void GreetPeople(string name, GreetingDelegate MakeGreeting) { MakeGreeting(name); } static void Main(string[] args) { GreetPeople("Jimmy Zhang", EnglishGreeting); GreetPeople("张子阳", ChineseGreeting); Console.ReadKey(); } } }
7.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
答:不是。可以用任意类型。
索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写。
C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作。
定义索引器的方式与定义属性有些类似,其一般形式如下:
[修饰符] 数据类型 this[索引类型 index] { get{//获得属性的代码} set{ //设置属性的代码} }
8.栈(Stack)和堆(Heap)的区别
答:堆栈(stack):是计算机科学中一种特殊的串列形式的抽象数据类型,其特殊之处在于只能允许在链表或数组的一端(称为堆栈顶端指针,top)进行加入数据(push)和输出数据(pop)的运算。
堆(Heap)是计算机科学中的一种特别的树状数据结构。若是满足以下特性,即可称为堆:“给定堆中任意节点 P 和 C,若 P 是 C 的父节点,那么 P 的值会小于等于(或大于等于) C 的值”。若父节点的值恒小于等于子节点的值,此堆称为最小堆(min heap);反之,若父节点的值恒大于等于子节点的值,此堆称为最大堆(max heap)。在堆中最顶端的那一个节点,称作根节点(root node),根节点本身没有父节点(parent node)。
MVC部分
1.MVC中的ViewData/ViewBag和TempData的区别和各适用情况
ViewData:ViewData是一个字典集合,通过key值读取对应的value使用方法:ViewData["myname"]="张三"
ViewBag:是动态类型,作用和ViewData一样,都是用来存储信息,有一些不同的是ViewData是object类型,ViewBag是动态类型,从运行效率上来讲,ViewBag 高于ViewData。在实际开发中,通不只用其中一种。使用方法:ViewBag.data="张三"
TempData:跨请求数据传递,它的机制类似于Session对象,不同的页面之间可以传递参数,但TempData只保存上一次的数据,当页面再次刷新,数据消失。使用方法:TempData["myname"]="张三"
区别总结
a). ViewData和TempData是字典类型,赋值方式用字典方式, ViewData["myName"] = MyName
b). ViewBag是动态类型,使用时直接添加属性赋值即可 ViewBag.myName = MyName
c). ViewBag和ViewData只在当前Action中有效,等同于View
d). TempData可以通过转向继续使用,因为它的值保存在Session中。但TempData只能经过一次传递,之后会被系统自动清除
e). ViewData和ViewBag 中的值可以互相访问,因为ViewBag的实现中包含了ViewData
2.ASP.NET MVC提供几种类型的过滤器,分别作用是什么?
|
过滤器类型 |
接口 |
默认实现 |
描述 |
|
Action |
IActionFliter |
ActionFliterAttribute |
在动作方法之前或之后运行 |
|
Result |
IResultFliter |
ActionFliterAttribute |
在动作结果被执行之前和之后运行 |
|
AuthorizationFliter |
IAuthorizationFliter |
AuthorizeAttribute |
首先运行,在任何其他过滤器或动作之前 |
|
Exception |
IexceptionFliter |
HandleErrorAttribute |
只在另一个过滤器,动作方法,动作结果弹出异常时运行 |
3.MVC中如何限定请求只允许Get或者Post请求方式访问
答:[HttpGet]、[HttpPost]
4.MVC如何进行Model验证,提示:使用ModelState
if (!ModelState.IsValid) { foreach (var key in ModelState.Keys) { var modelstate = ModelState[key]; if (modelstate.Errors.Any()) { return modelstate.Errors.FirstOrDefault().ErrorMessage; } } }
5.MVC属性有哪些?
答: [HttpGet]:该特性用于限制操作方法,以便该方法仅处理 HTTP GET 请求。
[HttpPost]:该特性用于限制操作方法,以便该方法仅处理 HTTP POST 请求。
[NonAction]:该特性用于指示控制器方法不是操作方法。
[ValidateInput]:该特性用于标记必须验证其输入的操作方法。
EF部分
1.EF中判断是否存在使用哪个方法好(First,FirstOrDefaut,Count),为什么?
答:First:取序列中满足条件的第一个元素,如果没有元素满足条件,则抛出异常。FirstOrDefault:取序列中满足条件的第一个元素,如果没有元素满足条件,则返回默认值(对于可以为null的对象,默认值为null,对于不能为null的对象,如int,默认值为0
2.EF即时加载与延时加载的区别,简要说明各适合使用场景
答:延迟加载(Lazy Loading)当实体第一次被读取时,相关数据不会被获取。延迟加载就是数据不会一次性查出来,而是一条一条的查询,这样就会多次请求数据库进行查询,增加了数据库的负担。
3.EF Linq查询左连接实现,连接条件:Db.A.Id=Db.B.Id
from a in Db.A join b in Db.B on a.id equals b.A select new {a.id,b.id}
4.EF NoTracking
答:在使用Entity Framework做查询的时候,如果只需要显示,而不用保存实体,那么可以用AsNoTracking()来获取数据。这样可以提高查询的性能。即便有做模型数据的更改,SaveChange()也不会改变。
二、前端基础
1. 在Javascript中,==与===的不同是?
答:=== 表示恒等,首先比较两边的变量数据类型是否相等,其次比较两边的变量的数值是否相等;== 表示相等即仅仅比较两边变量的数值是否相等。
2.Jquery each循环里面return false 和 return true有什么区别
答:在jquery中each循环中,要用return false代替break,return true代替continue。
3.Jquery serialize方法和serializeArray方法有什么区别
答:serialize() 方法通过序列化表单值,创建 URL 编码文本字符串。
serializeArray() 方法通过序列化表单值来创建对象数组(名称和值)。
4.获取DIV方式
答:#id、.class、element、[attribute]
5.打开一个窗口的方式
答:window.location.href(在同当前窗口中打开窗口),window.open(在另外新建窗口中打开窗口)
6.解释JavaScript for-in 循环?并描述与.net foreach in 的区别。
答:js里的for in循环定义如下:for(var variable in obj) { ... }
obj可以是一个普通的js对象或者一个数组。
如果obj是js对象,那么variable在遍历中得到的是对象的属性的名字,而不是属性对应的值。如果obj是数组,那么variable在遍历中得到的是数组的下标(第几个元素的意思)。
拿java的foreach循环来做对比,有两大差别。
首先java的foreach循环不会去枚举一个java对象的属性。
其次,java的foreach循环枚举一个数组或者任何实现了Iterable接口的对象的时候,
for(Object o : list), 对象o得到的是list一个元素,而非在列表中的下标。
浙公网安备 33010602011771号