JavaScript语言教程
Javascript程序员常见面试题
1.在Javascript中如何声明一个类?
在javascript中没有像Java中类class,我们调用一个函数实际上是在模拟类的行为。在JavaScript中有很多灵活的方法可以创建一个类,下面3种方式:
(1)使用函数作为类:
function Person(name) {
this.name = name;
}
// Creating an object
var person = new Person("Rafael");
person.name; // "Rafael"
这是非常重要的要注意,你必须使用关键字new创建一个类的新实例,否则将会有this是引用window对象这样的逻辑问题。
(2)类文字符号 Literal notation
var person = {
name: "",
setName: function(name) {
this.name = name;
}
}
person.setName("Rafael");
person.name; // "Rafael"
在这个例子中我们不能用函数来定义我们的类,我们创建一个单例对象Person,只有一个属性和一个方法,你可以直接使用这个对象,无需像上例中初始化。
当你无需参加类的多个实例或你只是使用一次,这种notation方式对你有用。
(3)通过函数实现的单例
var person = new function() {
this.setName = function(name) {
this.name = name;
}
this.sayHi = function() {
return "Hi, my name is " + this.name;
}
}
person.setName("Rafael");
alert(person.sayHi()); // Hi, my name is Rafael
这里在函数function前面我们加了一个new关键字,这意味着我们在申明它之时同时创建了这个类的一个实例。
2.如何组织你的Javascript代码?
“模块模式”可以将我们javascript划分成多个逻辑模块命名空间:
// Declaring my main namespace定义主命名空间
var myapplication = myapplication || {};
// Declaring modules usermodule 定义模块usermodule
myapplication.usermodule = (function() {
// createMessage: only accessible inside this module
var createMessage = function(message) {
return "Hello! " + message;
}
return {
// sayHello is a public method
sayHello: function(message) {
return createMessage(message);
}
}
})();
// Declaring another module 定义另外一个模块
myapplication.adminmodule = (function(){
// your code here
})()
// This is how we call sayHello
myapplication.usermodule.sayHello("This is my module");
注意上面代码中是如何使用notation创建模块usermodule的,
...
myapplication.usermodule = (function() {
// code to be executed immediately
})();
这能够使得函数立即执行,因为在这个命令尾部有插入语,这个执行的结果将是一个对象,赋值给变量myapplication.usermodule。
使用这个模式,你可以有多个模块,你能够控制那些是公开public,哪些是保持私有private,这样你的代码组织得更易于维护。
3. ==和===的区别?
两个等于号==是用来比较两个操作数的值:
"2" == 2; //true
2 == 2; // true
三重等于号===是用来比较两个操作符类型的AND值
"2" === 2; //false
2 === 2; // true
4. null和undefined的区别是什么?
null是代表一个对象没有值,而undefned是一种类型。
typeof null; // "object"
typeof undefined; // "undefined"
var a;
var b = null;
a == b; // "true" because their values are the same
a === b; // "false". they have different types
5.你以前使用过MVC吗?你喜欢或不喜欢它的哪些方面?
由于用户界面变得越来越复杂,我们需要一些好的方法来保持它越来越多的可维护性和重用性,如今一些JavaScript的MVC框架已被广泛采用,最著名的MVC框架是 backbone.js 和 angular.js
使用这些框架的优点是:
- 组织架构: 能够强迫你的web应用服从一个好的架构模式;
- 可维护性: 因为好的架构组织性带来了易于维护性;
- UI绑定性: 一些框架允许你这样做,当每次你的模型改变时,视图将自动映射改变。
- 解耦客户端: 类似 backbone.js这样的MVC框架能激励你使用REST API,通过他们模型中的urlRoot属性;
- 可重用的组件: 能够创建可重用的可视化组件
- 单页应用Single-page apps: 能够使用Ajax 请求构建单页应用;
- URL友好型: 原生支持客户端url映射
6. 如何增加一个方法到一个已经定义的类中?
使用prototype可以实现:
function Person(name) {
this.name = name;
}
Person.prototype.walk = function() {
console.debug(this.name + " is walking.");
}
// Calling the new method
var person = new Person("Rafael");
person.walk(); // "Rafael is walking."
值得注意的是,通过原型prototypr增加方法在性能上也是廉价的,因为这个方法被绑定到类的prototype上,对于类Person每一个新实例,你都能访问prototype的walk()方法,如果你在Person类中定义walk()方法,你最终会重新创建方法,为Person每一个新的实例。