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每一个新的实例。

 

NodeJs入门之事件驱动