看了几道变量提升的小题想分享给大家,都很简单,我这里就不解释原因了。我们先说一下预编译的过程创建AO对象找形参和变量声明,放入AO中,值为undefined形参实参相统一找函数声明,给AO中相应的的对象赋函数体下面我们来看几个题:1.console.log(bar());//11 打印的是函数的返回值function bar(){ foo = 100; function foo(){} var foo = 11; return foo;}1. AO {}2. AO { foo: undefined //变量声明}3. AO { foo: undefined //无形参}4. AO { foo: function foo(){}}2.function bar(){ return foo; foo = 100; function foo(){} var foo = 11;}console.log(bar());//fun1. AO {}2. AO { foo: undefined //变量声明}3. AO { foo: undefined //无形参}4. AO { foo: function foo(){}}3.function test(){ console.log(b);//unde if(a){ var b = 100; } c = 234; console.log(c);//234}var a;test();a = 10;console.log(c);//234console.log(global);//undeglobal = 100;console.log(global);//100function fn(){ console.log(global);//unde global = 200; console.log(global);//200 var global = 300; console.log(global) //300}fn();var global;console.log(test);//fun4. function test(test){ console.log(test);//fun var test = 234; console.log(test);//234 function test(){}}test(1);var test = 123;console.log(test);//1235.function test(a,b){ console.log(a);//fun console.log(b);//unde var b = 234; console.log(b);//234 a = 123; console.log(a);//123 function a(){} var a; b = 28; var b = function(){} console.log(a);//123 console.log(b);//fn}test(1);6.function test(a,b){ console.log(a);//1 c = 0; var c; a = 3; b = 2; console.log(b);//2 function b(){} function d(){} console.log(b);//2}test(1);7.function fn(a){ console.log(a);//fun var a = 123; console.log(a);//123 function a(){} console.log(a);//123 var b = function(){} console.log(b);//fun function d(){};}fn(1);8.console.log(a);//funa();//funvar a = 3;function a(){ console.log(a);}console.log(a);//3a = 6;a();//error a 不是一个函数 a = 69.a(3);var a = 1;function a(a) { console.log(a); //3 console.log(b); //fun b = 1; c = 2; console.log(b); //1 var b = 5; console.log(d); //fun function b(){}; var a = 6; console.log(c); // 2 if(false){ var d = 1; c = 5; } console.log(c); //2 function d(){}; console.log(d); //fun arguments[0] = 7; console.log(a); //7}console.log(a); // 1console.log(c); // 210.function Foo(){ getName = function(){ alert(1); }; return this;}Foo.getName = function(){alert(2);};Foo.prototype.getName = function(){alert(3);};var getName = function(){alert(4);};function getName(){alert(5);};Foo.getName();//2getName();//4Foo().getName();//1new Foo.getName();//2new Foo().getName();//3new new Foo().getName();//3其实上面一道题有关于变量提升但是不是重点因为还有原型、继承、运算符优先级等知识点。闲扯parseIntconsole.log(parseInt(‘a’, 16)); //10console.log(parseInt(function(){}, 16)); //15 ‘f’console.log(parseInt(parseInt, 16)); //15 ‘f’console.log(parseInt(0.000002)); //0console.log(parseInt(0.0000002)); //2 ‘2e-7’ 大于等于7位才会用科学计数法表示console.log(parseInt(false, 16)); //250 ‘fa’console.log(parseInt(“113”, 2)); //3 ‘11’立即执行函数的写法(function a() { console.log(1);})();(function a() { console.log(1);}());+function a() { console.log(1);}();-function a() { console.log(1);}();!function a() { console.log(1);}();false || function a() { console.log(1);}();true && function a() { console.log(1);}();var a = function a() { console.log(1);}();上面的代码都相当于是立即执行函数,其实主要是你把它变成一个表达式它就能立即执行。也就是只有表达式才能被执行符号执行。+ 两个数组相加let a = [1, 2], b = [5, 3];console.log(a + b); //1,25,3 相当于调用了toString()
+ ==相等比较我们都知道+0、-0、false、null、undefined、""、NaN
都是假值。我们来看几个例子:console.log(a + b); //1,25,3console.log(false == ""); //trueconsole.log(false == []); //trueconsole.log(false == 0); //trueconsole.log(false == null); //falseconsole.log(false == undefined); //falseconsole.log(false == NaN); //falseconsole.log(false == {}); //false``````console.log("" == []); //trueconsole.log("" == 0); //trueconsole.log("" == null); //falseconsole.log("" == undefined); //falseconsole.log("" == NaN); //falseconsole.log("" == {}); //false``````console.log(0 == ""); //trueconsole.log(0 == []); //trueconsole.log(0 == null); //falseconsole.log(0 == undefined); //falseconsole.log(0 == NaN); //falseconsole.log(0 == {}); //false
还有几个比较难以理解的例子:console.log([] == ![]); //true 因为![] = false, false == []是成立的。2 == [1] //true"" == [null] //true0 == "/n" //true 因为'/n'被转换为0
+ [] + {}的问题console.log([] + {}); // "[object Object]" [] = "", "" + {} 调用{}的toString()console.log({} + []); // 0 只不过是转换的前后顺序不同