【面试】web前端面试指南与高频考题解析

题目:类型判断用到哪些方法?

答案: typeof 和 instanceof 两种方法。

值类型和引用类型的区别?

答案:根据JavaScript中的变量类型传递方式,又分为值类型和引用类型。值类型包括Boolean、String、Number、Undefined、Null;引用类型包括了Object类的所有,如Date,Array,Function等。在参数传递方式上,值类型是按值传递,引用类型是按共享传递。

下面通过一个小题目,来看下两者的主要区别,以及实际开发中需要注意的地方。

// 值类型
var a = 10
var b = a
b = 20
console.log(a)  // 10
console.log(b)  // 20


上述代码中,a b都是值类型,两者分别修改赋值,相互之间没有任何影响。再看引用类型的例子:
 

// 引用类型 
var a = {x: 10, y: 20} 
var b = a 
b.x = 100 
b.y = 200 
console.log(a) // {x: 100, y: 200} 
console.log(b) // {x: 100, y: 200}

上述代码中,a b都是引用类型。在执行了b = a之后,修改b的属性值,a的也跟着变化。因为ab都是引用类型,指向了同一个内存地址,即两者引用的是同一个值,因此b修改属性时,a的值随之改动。

再借助题目进一步讲解一下。说出下面代码的执行结果,并分析其原因。
 

function foo(a) {
    a = a *10
}
function bar(b) {
    b.value="new"
}
var a = 1;
var b = {value: 'old'};
foo(a);
bar(b);
console.log(a);  // 1
console.log(b); // {value: "new"}

通过代码执行,会发现:

a的值没有发生改变

b的值发生了改变

这就是因为Number类型的a是按值传递的,而Object类型的b是按共享传递的。

JS 中这种设计的原因是:按值传递的类型,复制一份存入栈内存,这类类型一般不占用太多内存,而且按值传递保证了其访问速度。按共享传递的类型,是复制其引用,而不是整个复制其值(C 语言中的指针),保证过大的对象等不会因为不停复制内容而造成内存的浪费。

如何理解JavaScript中的原型?

答案:1.所有的引用类型(对象,数组,函数),都具有对象特性,即可自由扩展属性(null除外)。2.所有的引用类型(对象,数组,函数),都具有一个__proto__属性,它的属性值是一个普通的对象。3.所有的引用类型(对象,数组,函数),__proto__指向它的构造函数的prototype属性值。4.所有的函数,都具有一个prototype属性,属性值是一个普通的对象。

当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的__proto__中寻找。那么如何判断这个属性是不是对象本身的属性呢?使用hasOwnProperty。

如何理解js的原型链?

当试图得到一个对象的某个属性时,如果对象本身没有这个属性,那么就会去它的__proto__中寻找,这样一直往上找,你会发现这是一个‘链式结构’,所以叫做原型链。如果一直找到最上层都没有找到,就宣告失败,返回undefined。那么最上层是什么——Object.prototype.__proto__ === null

执行上下文

范围:一段<script>、js文件或者一段函数

全局执行上下文: 变量定义,函数声明

函数执行上下文: 变量定义,函数声明,this, arguments

先弄清楚一个重要的概念——this的值是在执行的时候才能确认,定义的时候不能确认!因为this是执行上下文的一部分,而执行上下文是在代码执行之前确定,而不是定义的时候。

this执行不同,会集中在这几个场景中:

1.作为构造函数执行,构造函数中

2.作为对象属性执行

3.作为普通函数执行

4.用于 call、apply、bind

当前作用域没有定义的变量,被称为自由变量。自由变量如何得到——向父级作用域去寻找。如果父级也没呢?再一层一层向上寻找。直至找到全局作用域还是没找到,宣告失败。这种一层一层的关系就是作用域链。

闭包是自由变量从作用域中去寻找,但是依据的是函数定义时的作用域链,而不是函数执行时。

Es6箭头函数中的this和普通函数中的有什么不同?

箭头函数存在的意义,第一写起来更加简洁,第二可以解决Es6之前函数执行中this是全局变量的问题。
 

Es6模块化如何使用?

如果只是输出一个唯一的对象,那么使用export default即可。如果要输出很多个对象,就不能用default了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:/ganhuo/81.html