最近将持续翻译JavaScript面试题,希望对各位有所帮助。
(文章中斜体字部分为译者添加)
目录:Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)
Part 2 (null与undefined/闭包/foreach与map/匿名函数/代码组织)
Part 3 (宿主对象与原生对象/函数调用方式/call与apply/bind/document.write)
1、宿主对象与原生对象有何区别?
原生对象是指JavaScript中按照ECMAScript规范进行定义的对象,比如:String,Math,RegExp,Object,Function等等。
宿主对象是指由JavaScript的运行环境(浏览器或者是node)提供的对象,比如window,XMLHTTPRequest等等。
引用文档:
https://stackoverflow.com/questions/7614317/what-is-the-difference-between-native-objects-and-host-objects
2、以下函数调用方式有何不同:function Person(){},var person = Person(),以及var person = new Person()
这个问题让人相当困惑。我猜测这道题主要是要考JavaScript中的构造函数。从技术上讲,function Person(){} 只是一个普通的函数声明。通常我们使用帕斯卡命名法来给构造函数命名。
var person = Person() 这种只是把Person作为一个函数来调用,而不是一个构造器。想用这种方式来将函数作为构造器调用是一种非常常见的错误。一般来说,构造器没有任何返回值。因此,如果把一个构造器当成一个普通函数来调用,并且把返回值赋值给一个变量,那么值会是undefined。
var person = new Person() 通过new操作符来创建一个Person对象的实例,并且继承了Person.prototype属性。也可以通过Object.create来创建实例,比如 Obejct.create(Person.prototype).
1 function Person(name) { 2 this.name = name; 3 } 4 5 var person = Person('John'); 6 console.log(person); // undefined 7 console.log(person.name); // Uncaught TypeError: Cannot read property 'name' of undefined 8 9 var person = new Person('John'); 10 console.log(person); // Person { name: "John" } 11 console.log(person.name); // "john"