20个必会的JavaScript面试题 < 7 8 17 18>- https://segmentfault.com/a/1190000008785931
10个流行的JavaScript面试题<1 2 8道> - https://segmentfault.com/a/1190000019379599
JavaScript篇 js经典前端面试题
------------------理论
10 谈谈this的理解
- this总是指向函数的直接调用者(而非间接调用者)
- 如果有new关键字,this指向new出来的那个对象
46 JS垃圾回收机制?
-
标记清除:
这个算法把“对象是否不再需要”简化定义为“对象是否可以获得”。
这个算法假定设置一个叫做根(root)的对象(在Javascript里,根是全局对象)。定期的,垃圾回收器将从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象。从根开始,垃圾回收器将找到所有可以获得的对象和所有不能获得的对象。 -
引用计数:
这是最简单的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。
该算法有个限制:无法处理循环引用。两个对象被创建,并互相引用,形成了一个循环。它们被调用之后不会离开函数作用域,所以它们已经没有用了,可以被回收了。然而,引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。
python也采用了垃圾收集机制,采用引用计数为主,标记—清除和分代收集两种机制为辅的策略。
18 javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?
除了正常模式运行外,ECMAscript添加了第二种运行模式:“严格模式”。
作用:
- 消除js不合理,不严谨地方,减少怪异行为
- 消除代码运行的不安全之处,
- 提高编译器的效率,增加运行速度
10 说说对 prototype和 __proto __ 的理解
【参考答案】prototype是函数才有的属性 ;__proto __是所有对象都有的属性,__proto __指向构造它的对象的对象的prototype。例如:
> var o = new Object()
o.__proto__ == Object.prototype
< true
o是Object构造出的对象,o的__proto __指向Object的prototype,这样o可以使用Object.prototype里面的方法。原型链:当js查找对象的属性时,先查找对象自身是否具有该属性,如果没有,就会去__proto __指向的prototype对象上查找,直到找到或者__proto __为null
13 let和const区别(今日头条)
二者都是块级作用域
都不能和它所在作用域内的其他变量或函数拥有相同的名称
两者还有以下两点区别:
const声明的常量必须初始化,而let声明的变量不用
const 定义常量的值不能通过再赋值修改,也不能再次声明。而 let定义的变量值可以修改
--------------------------题目
1 this指向
第一个例子很简单。 调用 test对象中的 func(),因此func() 中的’this’指向的是 test 对象,所以打印的 prop 是 test 中的 prop,即 42。
var test = {
prop: 42,
func: function(){
return this.prop;
},
};
console.log (test.func()); // 42
如果我们直接调用getFullname函数,第二个例子将打印出’David Jones’,因为此时 this 找不到调用者,所以默认就为 window 对象,打印的 fullname 即是全局的。
var fullname = ‘David Jones’
var obj ={
fullname: ‘Colin Brown’,
prop:{
fullname:’Aurelio Deftch’,
getFullname: function(){
return this.fullname;
}
}
}
var test = obj.prop.getFullname
console.log(test()) // David Jones
obj.prop.getFullname() // ‘Aurelio Deftch’
2
如何区分声明函数和表达式函数
console.log(foo)
console.log(bar)
// 声明函数
function bar(){
// Some code
};
// 表达式函数
var foo = function(){
// Some code
};
输出为
undefined
function bar(){
// Some code
};
两个函数将在不同的时期定义。在解析期间定义声明,在运行时定义表达式;
3
方法二 怎么判断一个object是否是数组(array)?
使用 原型链 来完成判断
function isArray(obj){
return obj.__proto__ === Array.prototype;
}
基本思想是利用 实例如果是某个构造函数构造出来的那么 它的 __proto__是指向构造函数的 prototype属性。
方法二:
使用Object.prototype.toString.call(obj) =="[object Array]"
typeof运算符缺陷: 对null返回是’object’
4
下面代码输出什么?
var output = (function(x){
delete x;
return x;
})(0);
console.log(output);
输出是 0。 delete 操作符是将object的属性删去的操作。但是这里的 x 是并不是对象的属性, delete 操作符并不能作用。
5
.Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?
hasOwnProperty <面试说:prototype是函数一个属性 能让你new出来对象共享原型链上的属性和方法>
javaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。此方法无法检查该对象的原型链中是否具有该属性;该属性必须是对象本身的一个成员。
6
立即执行函数.
此类函数没有声明,再一次执行过后即释放。适合做初始化工作
//立即执行函数 也会有预编译的过程
var num = (function(a,b,c){
var d= a+b+c*2-2;
return d;
}(1,2,3))
立即执行函数的两种写法
(function(){}()); W3C 建议第一种
(function(){})();
7
parseInt('1.9'); parseInt('1.9hello');
Number('1.9'); isNaN('1.9hello');
1(不四舍五入) NaN 1.9 true
8
JSON.stringify深拷贝的缺点
9 const:值类型不可变 , 引用类型可变
10 JS Context上下文
对于JavaScript的简单理解
ES6一些内容的简单理解