有意思的面试题汇总----持续更新
1 .考验基本功,基本数据的运算
console.log([]== ![]) //输出true
!的运算优先级比= 高;
=> console.log([]==false)
[] 转化成数字 是 0
false 转化成数字也是 0;
至于为什么要转化成数字在进行比较,这个我只能说你es运算规则是这样的
2 . 1000个苹果分别状态10个箱子里面,如何分配才能取任意数字的苹果
1, 2,4,8,16........
这题考的是二进制
3.js中所有的变量都可以当作对象使用,除了两个列外null和undefined
var d = 2.toString();
console.log(d) //报错 这里报错了,是因为js解析器的问题,试图将 点操作符 解析成 浮点数的一部分
var s = 2..toString();
console.log(s) //2
var a = 2 .toString();
console.log(a); //2
var b = (2).toString();
console.log(b) //2
- 对象的应用,当对象被赋值另一个对象时,对象原来的引用断开
function setname(obj){
obj.name = "js";
obj = { name : "node"}
}
var newobj = {name : 'jq'}
setname(newobj);
console.log(newobj.name) //js
- 构造函数里面 显示的return 基本数据和引用数据类型的坑爹处
function Bar() {
return 2;
}
new Bar(); // 返回新创建的对象
function Test() {
this.value = 2;
return {
foo: 1
};
}
new Test(); // 返回的对象 // 当构造函数中显示的return 一个值得时候;这个是数字,则返回新创建的对象
这个值是对象,则覆盖新创建的对象
6.考验基本功,基本数据的运算 和1是类似
console.log({}==!{}) //false // 这里是不解释了 还是运算的规则
- 基本遵循以下规则
- 如何访问以下数组的值
var obj = [];
obj[{}] = "博主" // 怎么访问到博主
8.原生js实现深拷贝
function deepClone(obj){
var obj1 = {};
for (var attr in obj) {
if(typeof obj[attr] != 'object'){
obj1[attr] = obj[attr]
}else{
var temp = obj[attr];
obj1[attr] = deepClone(obj[attr]) //主要这里巧妙 利用递归
}
}
return obj1;
}
9.原型与参数的障碍
//创建一个构造函数
function Person(name,age){
this.name = name ;
this.age = age || 18;
}
//给构造函数的原型添加方法和属性
Person.prototype.sex = "你叫什么名字"
var p1 = new Person('网吧')
var p2 = new Person();
console.log(p1.name) //网吧
//undefine //name是参数,参数被声明,却未传递参数,所以是undefine
console.log(p2.name)
console.log(p2.sex) // 实例化对象自身世没有的;就去原型链上寻找
- {}.toString() 为什么会报错,console.log({}.toSting())是正常的
在解析的时候{},有两种意义,===代码块 ===对象
{}单独出现时,默认被理解为 代码块
如果想 {} 作为对象被解释,需要将 {} 转换成表达式
11 . console.log(3==ture) 和 if(3){console.log(true)
}
//上述两种情况为什么会输出结果不同
==================================
很遗憾,如果你纠结这个问题,你只能去布兰登艾奇了,这货创造了这样的js
12.return 返回至的问题
//构造函数的作用
约定, 构造函数默认是初始化对象的, 因此返回的就是对象本身, 不用写 return.
但是如果在构造函数中写了 return, 那么 return 后如果是 值类型或 空 则无效,
如果是引用类型则返回该引用类型. 那么由 new 创建的这个对象就被丢弃.==========================注意这里是返回,而不是覆盖,this是不能被赋值的
当构造函数非常复杂的时候, 需要根据传入的参数创建不同结构的对象的时候,
可以考虑将代码的逻辑分组, 然后每一组都单独返回数据 则使用 return this.
其目的是为了更好的维护代码
13.es5中新增数组遍历方法forEach
forEach(function(){ //this }) //这里面的this指向谁
$.each 中回掉函数this 又是指向 谁
14.运算优先级的问题
function Foo() {
getName = function () { alert (1); }; //当函数被调用的时候,会产生一个隐式全局变量
console.log(this)
return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
//请写出以下输出结果:
Foo.getName(); //2
getName(); //4
Foo().getName(); //1
getName(); //1
new Foo.getName(); //2
new Foo().getName(); // 3
new new Foo().getName(); //3 //这最后几个完全是运算优先级的问题
- 当函数名和参数名重名的时候,参数传值值无效
function a(b){
alert(b); //函数体
function b(){
alert(b)
b() //函数体
}
}
a(1)
- 闭包的引用问题
var f1 = (function(){
var i =0;
return function(){
console.log(i++)
}
})();
var f2 = (function(){
var i =0;
return function(){
console.log(i++)
}
})()
f1();
f1 = null; //断开引用
f1(); //报错
f2();
17 . 有点意思,这个靠大家都没注意过的问题---arguments的类型
(function(){
return typeof arguments;
})();
- 答案是,到目前为止我还不知道 为什么
100['toString']['length']
19,表示式对函数的影响
var x = 10;
var foo = {
x: 20,
bar: function () {
var x = 30;
return this.x;
}
};
console.log(
foo.bar(), //20
(foo.bar)(), //20
(foo.bar = foo.bar)(), //10
(foo.bar, foo.bar)() //10
);
欢迎各位大虾指正