近年来,随着前端职位的供不应求,从事JavaScript的程序员越来越多,JavaScript的曝光率也越来越高,如果你想转行试试JavaScript,不妨收下这份面试题及答案,没准用得上。当然,如果针对这些问题,你有更棒的答案,欢迎留言。
为了避免收藏不看,让大家更有耐心看下去,印象更深刻些,况且30道题写下来真的很多,小编将分3次发布这30道题,本文是其中的第1篇。
问题1:什么是JavaScript对象?如何创建JavaScript对象?
答:
JavaScript对象是一个具有状态和行为(属性和方法)的实体。由于JavaScript是一种基于对象的语言,所以JavaScript中,一切皆对象。
JavaScript是一种基于模板的语言,而不是基于类的。它支持直接创建对象,不需要为此定义一个类。
JavaScript支持以下三种创建对象的方法。
1、用大括号创建对象
使用大括号创建对象的语法如下所示:
object={property1:value1, property2:value2.....propertyN:valueN}
属性和值用":"分隔
让我们举一个使用大括号创建对象的例子:
<script>
var std={id:1114, name:"Ram Bajaj", subject:"Physics"}
document.write(std.id+" "+std.name+" "+std.subject);
</script>
2、使用new关键字创建对象实例
直接创建对象的语法如下所示:
var objectname=new Object();
让我们举一个用new关键字创建对象的例子:
<script>
var std=new Object();
std.id=1114;
std.name="Ram Bajaj";
std.subject="Physics";
document.write(std.id+" "+std.name+" "+std.subject);
</script>
3、通过构造函数创建对象
创建一个带参数的方法,通过这个方法可以将这些参数中的每一个值分配给当前对象。
让我们举一个使用构造函数创建对象的例子:
<script>
function std(id,name,subject){
this.id=id;
this.name=name;
this.subject=subject;
s=new std(1114,"Ram Bajaj","Physics");
document.write(s.id+" "+s.name+" "+s.subject);
</script>
问题2:什么是JavaScript作用域?
答:
作用域决定代码中特定部分的变量、对象和函数的可访问性。
在JavaScript中,作用域有两种类型。
1、全局作用域
定义在函数外部的变量位于全局范围内。在全局范围内定义的变量可以从代码的任何部分访问。让我们看一个例子:
var name = 'TechBeamers';
console.log(name); // logs 'TechBeamers'
function logName() {
console.log(name); // 'name' is accessible here and everywhere else
logName(); // logs 'TechBeamers'
2、局部作用域
函数中定义的变量在局部范围内。不同的函数可以使用同名的变量。这是因为这些变量严格地绑定到定义它的函数(每个变量都有不同的作用域),并且在其他函数中不可访问。让我们看一个例子:
// Global Scope
function sampleFunction() {
// Local Scope #1
function sample2Function() {
// Local Scope #2
// Global Scope
function sample3Function() {
// Local Scope #3
// Global Scope
问题3:JavaScript中this代表什么?
答:
所有的主要语言都使用这个关键字来引用当前由类实例化的对象。然而,在JavaScript中,this指的是一个拥有“方法”的对象。函数的调用场景不同,this指向的内容也不同。
全局作用域
如果当前没有对象可用,则this表示全局对象。在Web浏览器中,window是表示document、location、history和其他一些有用的属性和方法的顶级对象。让我们来做一个示例代码:
window.Obj= "I represent the window object";
alert(window.Obj);
alert(this.Obj); // I'm the window object
alert(window === this); // true
函数调用的场景:
在函数调用的情况下,this指的是全局对象。
window.Obj = "I represent the window object";
function TestFunction() {
alert(this.Obj); // I'm the window object
alert(window === this); // true
TestFunction();
调用对象方法:
当一个对象构造函数或它的任何一个方法被调用时,this是指对象的一个实例。它类似于任何基于类的语言。
All the prime languages use ‘this’ keyword to refer to an object that is currently instantiated by the class. However, in JavaScript, ‘this’ refers to an object which ‘owns’ the method. Though this varies, with how a function call happens.
Global Scope.
If no object is currently available, then ‘this’ represents the global object. In a web browser, ‘window’ is the top-level object which represents the document, location, history and a few other useful properties and methods. Let’s take a sample code.
window.Obj= "I represent the window object";
alert(window.Obj);
alert(this.Obj); // I'm the window object
alert(window === this); // true
The Scenario Of A Function Call.
In the case of a function call, ‘this’ refers to the global object.
window.Obj = "I represent the window object";
function TestFunction() {
alert(this.Obj); // I'm the window object
alert(window === this); // true
TestFunction();
Call Object Methods.
When an object constructor or any of its methods gets called, ‘this’ refers to an instance of an object. It is similar to any class-based language.
window.Obj = "I'm the window object";
function TestFunction() {
this.Obj = "I'm the Test object";
this.Verify1 = function() {
alert(this.Obj); // I'm the Test object
TestFunction.prototype.Verify2 = function() {
alert(this.Obj); // I'm the Test object
var tf= new TestFunction();
tf.Verify1();
tf.Verify2();
问题4:JavaScript中Prototype代表什么?
答:
每一个JavaScript函数都有一个prototype属性(默认情况下,此属性为空),主要是用来实现继承。我们添加方法和属性给一个函数的prototype,使函数实例可以使用这些方法和属性。让我们举个例子来计算一个矩形的周长。
function Rectangle(x, y) {
this.x = x;
this.y = y;
Rectangle.prototype.perimeter = function() {
return 2 * (this.x + this.y);
var rect = new Rectangle(4, 2);
console.log(rect.perimeter()); // outputs '12'
问题5:什么是JavaScript闭包?
答:
闭包是在另一个函数中定义的JavaScript函数。这就是为什么它可以访问三种类型的作用域的特殊权限,如下所示:
内部作用域:即在其括号之间定义的变量。
外部函数作用域:闭包函数的变量。
全局作用域:即变量定义为全局变量。
注意:闭包不仅可以访问外部函数变量,还可以查看其参数。但它不能调用外部函数的参数对象。但是,它可以直接调用外部函数的参数。
下面是一个代码示例,通过在另一个函数中添加函数来描述闭包。
function outerFunc(arg1, arg2) {
var param = "I'm closure. ";
// Inner function accessing outer function variables and parameters
function innerFunc() {
return arg1 + arg2 + " " + param;
return innerFunc();
outerFunc("arg1", "arg2");
问题6:JavaScript中为什么有时要使用self而不是this?
答:
JavaScript中的内部函数可以访问外部函数中定义的所有变量。但是,this变量是一个例外。由于嵌套函数只是一个常规函数,而不是对象方法,所以它的this是指全局命名空间。让我们看看下面的例子。
var aProperty = 'global';
var myObject = {
outerFun: function() {
this.aProperty = 'local';
setTimeout(function() {
console.log(this.aProperty); // outputs 'global'
}, 1);
因此,我们看到setTimeout函数里面,this指的是全局对象。我们需要在嵌套函数中来获得对象的引用,这就是self关键字的作用。它不是一个特殊的变量,因此不能被其他函数重写。因此,在内部函数中使用self,我们可以引用局部对象。以下是示例代码。
var myObject = {
outerFun: function() {
var self = this;
this.aProperty = 'local';
setTimeout(function() {
console.log(self.aProperty); // outputs 'local'
}, 1);
问题7:什么是匿名函数,什么时候应该使用?
答:
匿名函数是在运行时动态声明的函数。它们被称为匿名函数,因为它们没有像正常函数一样的名称。
我们使用函数操作符来声明一个匿名函数,而不是函数声明。另外,函数操作符可以用来创建一个新函数,在任何表达式中都可以。
下面是一个命名函数的典型例子。
function testFunction()
alert("Welcome!!");
testFunction();
用匿名函数实现的相同的例子。
var testFunction= function()
alert("Zoom! Zoom! Zoom!");
flyToTheMoon();
匿名函数的主要用于回调函数,事件注册,创建临时的或私有的作用域,闭包和递归。
问题8:“==”和“===”的区别?
这些都是JavaScript提供的操作符——严格的等式和类型转换的等式。
如果要比较的值具有相同的数据类型,则严格相等===返回true。举个例子,“2”不等于2,即(2″===2)将返回false。
其次,类型转换相等(==),自动将变量转换为值,而不管数据类型如何。举个例子,这里的“2”将等于2即(“2″===2)将返回true。
总结双等于(==),是一种自动转换类型的相等运算符,(===)是一个严格的相等运算符,即它不会自动转换值。
问题9:JavaScript数据类型都有哪些?
答:
JavaScript支持三个原始的、两个复合的和两个特殊的数据类型。接下来,我们列出每个类别中的数据类型。
原始数据类型。
String
Number
Boolean
复合数据类型。
Object
Array
特殊数据类型。
Null
Undefined
问题10:什么是JavaScript的原型继承?
答:
大多数面向对象语言的支持类和对象,一个类可以继承另外一个类。
而JavaScript的继承一般是通过原型(prototype)实现。prototype的本质是一个Object实例,它是在同一类型的多个实例之间共享的,它里面包含的是需要共享的方法(也可以有字段)。
JavaScript提供了三种不同类型的原型继承。
1、代理(即原型链)。
代理原型是指一个对象可以作为另一个对象的基类。新对象通过继承代理原型引用基类。
当我们试图访问一个对象的属性时,首先检查对象本身是否存在这个属性,如果该属性不存在,则在原型中检查是否存在属性,以此类推,逐渐深入到原型链,直到最终的基类。
2、链接继承(即Mixins, Object.Assign())。
它是一个对象从另一个源对象复制属性的过程。JavaScript中有个名字叫mixins。这个过程利用了JavaScript方法Object.assign()。在ES6之前使用的是.extend()函数。
3、函数(不要与函数式编程混淆)。
在JavaScript中,一个函数可以创建一个对象。不必是一个构造函数(或类)。它被称为工厂函数。定义一个对象,继承一个工厂函数,并增加属性和方法。
感谢您阅读全文,希望本文能够对您的开发或面试有些帮助。