js易錯小題整理

2021-08-28 10:07:45 字數 3798 閱讀 5608

var a = (function f() 

return f();

function f()

})();

console.log(a); //2

函式宣告提公升,同一作用域下 用 函式宣告 建立的同名函式,後面的會覆蓋前面的,所以輸出為:2

var f = function g() ;

console.log(typeof g()); //報錯

console.log(typeof g); //undefined

建立乙個函式有三種方式:(1)函式宣告 (2)函式表示式 (3)new function()

var a = (function (x) )(1);

console.log(a); //1

console.log(delete aaaa); //true

delete用來刪除物件的屬性,刪除成功或刪除的屬性不存在都返回true;

當刪除的 是 函式 或 用var宣告的變數 或 壓根不是物件的屬性時返回false.

所以上面把 1 傳給了 匿名函式,而delete x並沒卵用,返回false;而a函式最終返回的還是1,因而console.log(a); //1, 由於全域性window物件裡並沒有aaaa這個變數,所以console.log(delete aaaa); //true

var a = (function f(f) )(function () );

console.log(a); //「number」

執行匿名函式function f(f) ,其中其引數f為 function () ,因而f()得 1, 所以typeof f()得number

var a = (function f(f) )(function () );

console.log(a); //undefined

當函式沒有寫return語句,或只寫了return;函式預設返回undefined

var foo = ,

baz: 1

};var a = (function () )(foo.bar);

console.log(a); //undefined

首先將 foo.bar(即function () )傳給匿名函式,此時arguments[0]即foo.bar,而在普通函式中執行foo.bar(),this會指向為window物件,而全域性物件中並未宣告baz,所以foo.bar()(即arguments[0] ())輸出undefined,所以匿名函式的return值也為undefined

var a = (1,2,3,4);

var f = (function f() , function g() )();

console.log(typeof f); //"number"

console.log(a); //4

此處是乙個立即執行函式,但是在前面的包含函式的圓括號(命名空間)中出現了2個函式,並用逗號分隔。這種形式,最終圓括號返回的是最後的乙個值,變數也是一樣。

var x = 1;

if (function f() {})

console.log(x); //1undefined

首先在if判定中,函式f的布林值是true;所以判定條件成立,可以執行if中的語句;但這裡由於 f函式只是if的判定條件,只會當作表示式處理,因而f函式並沒有經過宣告;所以typeof f返回"undefined"。

最後結果為:1undefined

var x = 1;

if (f = function f() {})

console.log(x); //1function

道理同上,但這回if裡的函式雖然還是表示式,但它賦給了變數f,所以此時typeof f值為function

最後結果為:1function

var a = (function (foo) )(

});console.log(a); //"undefined"

沒啥說頭兒,理清思路,就是undefined了

function old(num)

function old2(num)

function issame(num)

var val = [7,4,'13',-9,infinity];

console.log(val.map(issame)); //[true, true, true, false, false]

console.log(-9%2) //-1

console.log(infinity%2) //nan

沒啥說的,不解釋了

var a = 5;

(function())();

console.log(a,b) //5 3

var a = b =3;相當於執行了這兩句話 b = 3;var a = b,所以執行後全域性變數b為3,而由於此a和全域性a不在同一作用域,所以全域性a仍未5

輸出:5 3

//首先沒有返回值,沒有問題

function a(){}

console.log(new a()); //a {}

console.log(new a() instanceof a); //true

//這是返回非引用型別,也是true

function a()

console.log(new a()) //a {}

console.log(new a() instanceof a) //true

//這是返回引用型別,這個就是false了,因為new出來的東西被返回值覆蓋

function a()}

console.log(new a()) //object

console.log(new a() instanceof a) //false

//類似的,這種也是引用的型別

function f()

console.log(new f()) //function f()

//new出來的東西被返回值強行指向原本的函式本身,而不是其實例化物件,當然原型也無從談起

console.log(new f() instanceof f); //false

//這裡的this指向了new f()的例項物件,所以最後返回true

function f()

console.log(new f() instanceof f); //true

這題很經典~ 務必搞會

function foo() ;

return this;

}foo.getname = function () ;

foo.prototype.getname = function () ;

var getname = function () ;

function getname()

foo.getname();//2

getname();//4

foo().getname();//1

getname();//1

new foo.getname();//2

new foo().getname();//3

new new foo().getname();//3

參考:

面試題系列 易錯易忽略小題

題1 trace 1 0 會報錯嗎?解 不會,提示 infinity 無窮大 題2 trace nan is number 解 true,nan是number資料型別的乙個特殊成員,用以表示 非數字 值 題3 分別計算int 0.9 math.floor 0.9 math.round 0.9 mat...

js易錯總結

1.addeventlistener 新增的匿名函式將無法移除 var btn document.getelementbyid mybtn btn.addeventlistener click function false 繫結事件 btn.removeeventlistener click fun...

js易錯筆記

目錄 1.underfiend null 2.number parseint parsefloat 3.運算子 4js作用域 實際上,undefined值是派生自null值的,ecmascript標準規定對二者進行相等性測試要返回true,parseint parsefloat 專門用於把字串轉換成...