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

原文地址:https://www.cnblogs.com/lilight/p/7800445.html