問題1: JavaScript 中 undefined 和 not defined 的區別
JavaScript 未宣告變數直接使用會拋出例外:var name is not defined,如果沒有處理例外,代碼就停止運行了,但是,使用typeof undeclared_variable并不會產生例外,會直接回傳 undefined,
var x; // 宣告 x
console.log(x); //output: undefined
console.log(typeof y); //output: undefined
console.log(z); // 拋出例外: ReferenceError: z is not defined
問題2: 下面的代碼輸出什么?
var y = 1;
if (function f(){}) {
y += typeof f;
}
console.log(y);
正確的答案應該是 1undefined,
JavaScript中if陳述句求值其實使用eval函式,eval(function f(){}) 回傳 function f(){} 也就是 true,
下面我們可以把代碼改造下,變成其等效代碼,
var k = 1;
if (1) {
eval(function foo(){});
k += typeof foo;
}
console.log(k);
上面的代碼輸出其實就是 1undefined,為什么那?我們查看下 eval() 說明檔案即可獲得答案
該方法只接受原始字串作為引數,如果 string 引數不是原始字串,那么該方法將不作任何改變地回傳,
恰恰 function f(){} 陳述句的回傳值是 undefined,所以一切都說通了,
注意上面代碼和以下代碼不同,
var k = 1;
if (1) {
function foo(){};
k += typeof foo;
}
console.log(k); // output 1function
問題3: JavaScript怎么清空陣列?
如
var arrayList = ['a','b','c','d','e','f'];
怎么清空 arrayList
方法1
arrayList = [];
直接改變arrayList所指向的物件,原物件并不改變,
方法2
arrayList.length = 0;
這種方法通過設定length=0 使原陣列清除元素,
方法3
arrayList.splice(0, arrayList.length);
和方法2相似
問題4: 怎么判斷一個object是否是陣列(array)?
方法1
使用 Object.prototype.toString 來判斷是否是陣列
function isArray(obj){
return Object.prototype.toString.call( obj ) === '[object Array]';
}
這里使用call來使 toString 中 this 指向 obj,進而完成判斷
方法2
使用 原型鏈 來完成判斷
function isArray(obj){
return obj.__proto__ === Array.prototype;
}
基本思想是利用 實體如果是某個建構式構造出來的那么 它的 __proto__是指向建構式的 prototype屬性,
方法3
利用JQuery
function isArray(obj){
return $.isArray(obj)
}
JQuery isArray 的實作其實就是方法1
問題5: 下面代碼輸出什么?
var output = (function(x){
delete x;
return x;
})(0);
console.log(output);
輸出是 0, delete 運算子是將object的屬性刪去的操作,但是這里的 x 是并不是物件的屬性, delete 運算子并不能作用,
問題6: 下面代碼輸出什么?
var x = { foo : 1};
var output = (function(){
delete x.foo;
return x.foo;
})();
console.log(output);
輸出是 undefined,x雖然是全域變數,但是它是一個object,delete作用在x.foo上,成功的將x.foo刪去,所以回傳undefined
問題7: 兩種函式宣告有什么區別?
var foo = function(){
// Some code
};
function bar(){
// Some code
};
foo的定義是在運行時,想系統說明這個問題,我們要引入變數提升的這一概念,
我們可以運行下如下代碼看看結果,
console.log(foo)
console.log(bar)
var foo = function(){
// Some code
};
function bar(){
// Some code
};
輸出為
undefined
function bar(){
// Some code
};
為什么那?為什么 foo 列印出來是 undefined,而 bar列印出來卻是函式?
JavaScript在執行時,會將變數提升,
所以上面代碼JavaScript 引擎在實際執行時按這個順序執行,
// foo bar的定義位置被提升
function bar(){
// Some code
};
var foo;
console.log(foo)
console.log(bar)
foo = function(){
// Some code
};
原代碼的輸出合理解釋了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/291657.html
標籤:其他
上一篇:前端進階學習之路
下一篇:如何得到當前瀏覽器是什么
