JS面试题
for(var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }); } for(var i = 0; i < 5; i++) { (function(i) { setTimeout(function() { console.log(i); }); })(i); }
结果:
5
5
5
5
5
0
1
2
3
4
setTimeOut()会在所有可执行函数执行后在执行。
匿名函数会立即执行。
function foo1() { var value = 1 + 1 return value; } //JS中如果一个语句以[(/+-开头,就有可能和上一句加在一起解析 function foo2() { return { bar: 'hello' }; } //return 后会自动添加分号,不管下一条语句是什么 console.log(foo1()); console.log(foo2());
结果:
2
undefined
(function() { var a=b= 3 ; })(); //a是局部变量,匿名函数运行完毕直接销毁,b声明为全局变量,会一直存在。 console.log("a defined? " + (typeof a !== 'undefined')); console.log("b defined? " + (typeof b !== 'undefined')); console.log(b); console.log(typeof a);
结果:
a defined? false
b defined? true
3
undefined
var object = { foo: "bar", func: function() { var self = this; console.log(this); console.log("outer func: this.foo = " + this.foo); console.log("outer func: this.foo = " + self.foo); (function() { console.log("inner func: this.foo = " + global.foo); console.log("inner func: this.foo = " + self.foo); })(); } }; //global 是 javascript 运行时所在宿主环境提供的全局对象,是一个 Object。目前来说最常见的宿主环境是浏览器和 nodejs,浏览器暴露了一系列操作 DOM, Location, History 等 Api 供 Js 调用(即 window 对象)而 nodejs 里则没有浏览器里的 DOM 等,可以运行 for (var i in global){console.log(i)} 查看这个全局对象提供的方法,如 process, buffer 这些 nodejs 的资源。 //匿名函数的this指的是global对象(nodejs环境下)浏览器环境下就是window对象 object.func();
结果:
{ foo: 'bar', func: [Function: func] }
outer func: this.foo = bar
outer func: this.foo = bar
inner func: this.foo = undefined
inner func: this.foo = bar
var scope = "global"; function func() { console.log(scope); var scope = "local"; } //变量提升 undefined func();
console.log((function f(n) { return ((n > 1) ? n * f(n-1) : n); })(10)); //阶乘 匿名函数 //结果是10的阶乘的结果 console.log((function (n) { return n; })(8)) //匿名函数 第二个括号是函数参数
console.log("1" + 1); //字符前加+ -会把它变成number类型 console.log(1 + "2" + "2"); //122 console.log(1 + +"2" + "2"); //32 console.log(1 + -"1" + "2"); //02 console.log(+"1" + "1" + "2"); //112 console.log("A" - "B" + "2"); //NaN2 console.log("A" - "B" + 2); //NaN +2 还是NaN console.log("A" - "B"); //NaN //JS在进行这种运算时 仅仅会在2个值相加时优先推断为string类型 其它情况下(比如“-”。“*”。“/”)都默觉得number型运算。
//判断一个方法是不是数组 //方法一 function isArray(obj) { return Object.prototype.toString.call(obj) === "[object Array]"; } //方法二 function isArray(obj) { return obj.__proto__ === Array.prototype; } //方法三(ES5) Array.isArray(obj);
function Example() { getName = function() { console.log(1); }; return this; } Example.getName = function() { console.log(2); }; Example.prototype.getName = function() { console.log(3); }; console.log(typeof Example); //function console.log(typeof Example()); //object Example.getName(); //函数的方法 Example().getName(); //对象的方法 new Example.getName(); //new 一个函数的方法 结果还是2 new Example().getName(); //原型对象方法,实例共享时使用
结果:
function
object
2
1
2
3