面试时被问到的问题
JavaScript调试工具 ----- JSLint (http://www.jslint.com/)
1. JavaScript中使用use strict有什么作用
在MSDN上有关于JavaScript严格模式的使用 (https://msdn.microsoft.com/zh-cn/library/br230269(v=vs.94).aspx)
严格模式(Use Strict)是一种更好的错误检查引入代码中的方法。 在使用严格模式下,你无法使用隐式声明的变量,将值赋给只读属性或将属性添加到不可扩展的对象等.
严格模式(Use strict)是ECMAScript 5中的一个部分. ECMAScript 5中对此有如下解释
Strict Mode is a new feature in ECMAScript 5 that allows you to place a program, or a function, in a “strict” operating context. This strict context prevents certain actions from being taken and throws more exceptions.
Strict mode helps out in a couple ways: 1. It catches some common coding bloopers, throwing exceptions. 2.It prevents, or throws errors, when relatively “unsafe” actions are taken (such as gaining access to the global object). 3.It disables features that are confusing or poorly thought out.
建议是,在你编写JavaScript代码时,使用严格模式。严格模式可以合法地帮助我们避免错误,有些甚至是我们自己都不知道存在的错误。一般建议如下:
1) 在新的javascript程序编写时,绝对建议使用严格模式。严格模式相当于充当了你错误代码的举报人
2) 在之前已经写好的JavaScript代码中,可能就不是这样。如果你现有的JavaScript代码中具有严格模式禁止的语句,则应用程序会中断。所以,在已有的javascript代码中,使用严格模式,你应该准备调试和更正现有的代码.
调用Use strict
a) 针对整个脚本文件,将"use strict"放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。如果该语句不在第一行,则无效,整个脚本以正常模式运行。
(严格地说,只要前面不是产生实际运行结果的语句,"use strict"可以不在第一行,比如直接跟在一个空的分号后面。)
<script> "use strict"; console.log("这是严格模式。"); </script> <script> console.log("这是正常模式。"); </script>
b) 针对单个函数
将"use strict"放在函数体的第一行,则整个函数以"严格方式"运行
function strict(){ "use strict"; return "这是严格模式。"; } function notStrict() { return "这是正常模式。"; }
c) 脚本文件的变通写法
因为第一种调用方法不利于文件合并,所以更好的方法是,借用第二种方法,将整个脚本文件放在一个立即执行的匿名函数中
(function(){ "use strict"; // some code here })();
JavaScript代码在严格模式下的一些限制(部分,非详尽):
a1. 使用变量但不声明
Javascript
testvar = 4;
在正常模式下,这个变量testvar没有声明就赋值,默认就是全局变量。但是,在严格模式下,这种用法是禁止的,全局变量必须显式声明。
"use strict"; v = 1; //报错,v未声明 for(i = 0; i < 2; i++) { //报错, i未声明 }
a2. 静态绑定
JavaScript语言的一个特点,就是允许"动态绑定".即某些属性和方法到底属于哪一个对象,不是在编译时确定的,而是在运行时(runtime)确定的.
JavaScript严格模式对这种动态绑定做了一些限制。某些情况下,只允许静态绑定。也就是说,属性和方法到底归属哪个对象,在编译阶段就确定。这样做有利于编译效率的提高,也使得代码更容易阅读,更少出现意外。
a2)-1 禁止使用with语句
JavaScript中的with语句如下
with(object) { statements } object -- 默认对象 statements - object作为默认对象的一个或多个语句
with 语句的主要作用,是用来减少特定情形下必须写入的代码数量. 比如MSDN上面的如下例子:
在下面的例子中,Math对象重复使用 x = Math.cos(3 * Math.PI) + Math.sin(Math.LN10) y = Math.tan(14 * Math.E) 如果重写该示例以使用with语句,你的代码将变得更加简洁 with (Math){ x = cos(3 * PI) + sin (LN10) y = tan(14 * E) }
但是在JavaScript的严格模式(use strict)下,with语句是禁止使用的.
a2)-2 创设eval作用域
在正常模式下,JavaScript有两种变量作用域(scope): 全局作用域和函数作用域。 严格模式创设了第三种作用域: eval作用域
正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域.
在严格模式下,eval语句本身就是一个作用域,它生成的变量就只能用于eval内部
"use strict"; var x = 10; console.info(eval("var x = 6; x")); // 6 console.info(x); // 10
a3. this 不再指向全局对象
在正常模式下,javascript中的this指向全局对象。但在严格模式下,this不再指向全局对象,它的值为undefined
function f(){ return !this; } // 返回false,因为"this"指向全局对象,"!this"就是false function f(){ "use strict"; return !this; } // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
除了上面写的一些限制外,还有其他一些限制,具体可以参考MSDN https://msdn.microsoft.com/zh-cn/library/br230269(v=vs.94).aspx
2. JavaScript中的==和===的区别
关于JavaScript中的==和===. 最简单的解释就是:
== 相等运算符 两边值类型不同的时候,要先进行类型转换,再比较
相等运算符在比较相同类型的数据时,与严格相等运算符完全一样
相等运算符在比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较
=== 严格相等运算符 不做类型转换,类型不同的一定不等
(1) 不同类型值 如果两个值类型不同,直接返回false
(2) 同一类的原始类型值
同一类的原始类型的值(数值,字符串,布尔值)比较时,值相同就返回true,值不同就返回false
(3) 同一类的复合类型值
两个复合类型(对象,数组,函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象
(4)undefined和null
他们都与自身严格相等
undefined === undefined // true
null === null //true
null === undefined //false
null == undefined //true
基本都是推荐看书 https://github.com/getify/You-Dont-Know-JS (You Don't know JS)
在这边书的第二章这样说: https://github.com/getify/You-Dont-Know-JS/blob/master/up%20&%20going/ch2.md#equality (YDKJS | Equality)
3. TCP/IP 协议解释
4.ip4地址中的四组数字,是多少位
5. C#中的抽象类abstract和interface区别 (2次被问到)
6. SQL中delete 和 truncate的区别
7. C#中的delegate
8. SQL中存储过程和函数的区别, 存储过程可以有返回值吗
9. SQL中 non-clustered index 和 clustered index 的区别
clustered index 聚集索引, 是指在物理上实现数据排序,并且在同一个表里面只有一个clustered index (聚集索引)
Clustered索引在数据表中按照物理顺序存储数据。因为在表中只有一个物理顺序,所以在每个表中只能有一个clustered索引。在查找某个范围内的数据时,Clustered索引是一种非常有效的索引,因为这些数据在存储的时候已经按照物理顺序排好序了。
而 non-clustered index 非聚集索引,是逻辑上的排序。
Non-clustered索引不会影响到下面的物理存储,但是它是由数据行指针构成的。如果已经存在一个clustered索引,在nonclustered中的索引指针将包含clustered索引的位置参考。这些索引比数据更紧促,而且对这些索引的扫描速度比对实际的数据表扫描要快得多。
PRIMARY KEY 约束默认为 CLUSTERED;UNIQUE 约束默认为 NONCLUSTERED。
我转载了一个博客来详细阐述两者的区别
10. MVC 中TempData 和 ViewBag的区别
12 C# 中ref参数 和 out参数的区别
13. SOLID 解释
14. override 和 overload的区别
15. 有一张表
Student ,包含以下字段
studentID
Mark
ClassID
要求写一个SQL语句,查找ClassID = 120的班级中,该班级考试分数Mark排在第二高分的学生记录