一鼠证、JavaScript 中 undefined 和 not defined 的區(qū)別
JavaScript 未聲明變量直接使用會(huì)拋出異常:var name is not defined谨娜,如果沒(méi)有處理異常,代碼就停止運(yùn)行了。 但是,使用typeof undeclared_variable并不會(huì)產(chǎn)生異常,會(huì)直接返回 undefined。
var x; // 聲明 x
console.log(x); // undefined
console.log(typeof y); // undefined
console.log(z); // 拋出異常: ReferenceError: z is not defined
二蚌成、 以下代碼輸出什么
var y = 1;
if (function f(){}) {
y += typeof f;
}
console.log(y);
-
JavaScript
中if
語(yǔ)句求值其實(shí)使用eval
函數(shù),該方法(eval()
)只接受原始字符串作為參數(shù)凛捏,如果string
參數(shù)不是原始字符串担忧,那么該方法將不作任何改變地返回。 -
eval(function f(){})
返回function f(){}
也就是true
坯癣。 - 結(jié)果為
1function
涵妥。
三、在JavaScript中創(chuàng)建一個(gè)真正的private方法有什么缺點(diǎn)
每一個(gè)對(duì)象都會(huì)創(chuàng)建一個(gè)private
方法的方法坡锡,這樣很耗費(fèi)內(nèi)存
var Employee = function (name, company, salary) {
this.name = name || "";
this.company = company || "";
this.salary = salary || 5000;
// Private method
var increaseSalary = function () {
this.salary = this.salary + 1000;
};
// Public method
this.dispalyIncreasedSalary = function() {
increaseSlary();
console.log(this.salary);
};
};
// Create Employee class object
var emp1 = new Employee("John","Pluto",3000);
// Create Employee class object
var emp2 = new Employee("Merry","Pluto",2000);
// Create Employee class object
var emp3 = new Employee("Ren","Pluto",2500);
在這里 emp1,emp2,emp3
都有一個(gè)increaseSalary
私有方法的副本蓬网。所以除非必要,非常不推薦使用私有方法鹉勒。
四帆锋、JavaScript中什么是閉包?寫出一個(gè)例子
- 閉包是在一個(gè)函數(shù)里聲明了另外一個(gè)函數(shù)禽额,并且這個(gè)函數(shù)訪問(wèn)了父函數(shù)作用域里的變量锯厢。
- 下面給出一個(gè)閉包例子,它訪問(wèn)了三個(gè)域的變量脯倒。
- 它自己作用域的變量
- 父函數(shù)作用域的變量
- 全局作用域的變量
var globalVar = "abc";
// Parent self invoking function
(function outerFunction (outerArg) { // begin of scope outerFunction
// Variable declared in outerFunction function scope
var outerFuncVar = 'x';
// Closure self-invoking function
(function innerFunction (innerArg) { // begin of scope innerFunction
// variable declared in innerFunction function scope
var innerFuncVar = "y";
console.log(
"outerArg = " + outerArg + "\n" +
"outerFuncVar = " + outerFuncVar + "\n" +
"innerArg = " + innerArg + "\n" +
"innerFuncVar = " + innerFuncVar + "\n" +
"globalVar = " + globalVar);
})(5); // end of scope innerFunction, Pass 5 as parameter
})(7); // end of scope outerFunction, Pass 7 as parameter
// innerFunction is closure that is defined inside outerFunc
輸出為
outerArg = 7
outerFuncVar = x
innerArg = 5
innerFuncVar = y
globalVar = abc
五实辑、寫一個(gè)mul函數(shù)
要求使用如下:
console.log(mul(2)(3)(4)); // output : 24
console.log(mul(4)(3)(4)); // output : 48
參考函數(shù)如下:
function mul (x) {
return function (y) { // anonymous function
return function (z) { // anonymous function
return x * y * z;
};
};
}
-
mul
返回一個(gè)匿名函數(shù),運(yùn)行這個(gè)匿名函數(shù)又返回一個(gè)匿名函數(shù)藻丢,最里面的匿名函數(shù)可以訪問(wèn)x,y,z
進(jìn)而算出乘積返回即可剪撬。 - 對(duì)于
JavaScript
中的函數(shù)一般可以考察如下知識(shí)點(diǎn)- 函數(shù)是一等公民
- 函數(shù)可以有屬性,并且能連接到它的構(gòu)造方法
- 函數(shù)可以像一個(gè)變量一樣存在內(nèi)存中
- 函數(shù)可以當(dāng)做參數(shù)傳給其他函數(shù)
- 函數(shù)可以返回其他函數(shù)
六悠反、JavaScript怎么清空數(shù)組
例:
var arrayList = ['a','b','c','d','e','f'];
- 直接改變arrayList所指向的對(duì)象残黑,原對(duì)象并不改變。
arrayList = []
- 這種方法通過(guò)設(shè)置length=0 使原數(shù)組清除元素斋否。
arrayList.length = 0
- 和方法2相似梨水。
arrayList.splice(0, arrayList.length)
七、怎么判斷一個(gè)object是否是數(shù)組(array)
- Object.prototype.toString
function isArray(obj){
return Object.prototype.toString.call( obj ) === '[object Array]';
}
- 使用 原型鏈 (實(shí)例如果是某個(gè)構(gòu)造函數(shù)構(gòu)造出來(lái)的那么 它的 proto是指向構(gòu)造函數(shù)的 prototype屬性)
function isArray(obj){
return obj.__proto__ === Array.prototype;
}
八茵臭、下面代碼輸出什么
var output = (function(x){
delete x;
return x;
})(0);
console.log(output);
輸出是 0疫诽。 delete
操作符是將object
的屬性刪去的操作。但是這里的 x
并不是對(duì)象的屬性, delete
操作符并不能作用奇徒。
九雏亚、下面代碼輸出什么
var x = 1;
var output = (function(){
delete x;
return x;
})();
console.log(output);
輸出是 1。delete
操作符是將object
的屬性刪去的操作逼龟。但是這里的x
是并不是對(duì)象的屬性评凝,delete
操作符并不能作用追葡。
十腺律、下面代碼輸出什么
var x = { foo : 1};
var output = (function(){
delete x.foo;
return x.foo;
})();
console.log(output);
輸出是 undefined
。x
雖然是全局變量宜肉,但是它是一個(gè)object
匀钧。delete
作用在x.foo
上,成功的將x.foo
刪去谬返。所以返回undefined
十一之斯、下面代碼輸出什么
var Employee = {
company: 'xyz'
}
var emp1 = Object.create(Employee);
delete emp1.company
console.log(emp1.company);
輸出是 xyz
,這里的 emp1
通過(guò) prototype
繼承了 Employee的 company
遣铝。emp1
自己并沒(méi)有company
屬性佑刷。所以delete
操作符的作用是無(wú)效的。
十二酿炸、什么是 undefined x 1
var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
console.log(trees);
- 當(dāng)我們使用
delete
操作符刪除一個(gè)數(shù)組中的元素瘫絮,這個(gè)元素的位置就會(huì)變成一個(gè)占位符。打印出來(lái)就是undefined x 1
填硕。 注意如果我們使用trees[3] === 'undefined × 1'
返回的是false
麦萤。因?yàn)樗鼉H僅是一種打印表示,并不是值變?yōu)?code>undefined x 1扁眯。 - 注:我自己沒(méi)有復(fù)現(xiàn)
十三壮莹、下面代碼輸出什么
var trees = ["xyz","xxxx","test","ryan","apple"];
delete trees[3];
console.log(trees.length);
輸出是5。因?yàn)?code>delete操作符并不是影響數(shù)組的長(zhǎng)度姻檀。
十四命满、下面代碼輸出什么
var bar = true;
console.log(bar + 0);
console.log(bar + "xyz");
console.log(bar + true);
console.log(bar + false);
輸出為
1
truexyz
2
1
下面給出一個(gè)加法操作表
- Number + Number -> 加法
- Boolean + Number -> 加法
- Boolean + Boolean -> 加法
- Number + String -> 連接
- String + Boolean -> 連接
- String + String -> 連接
十五、下面代碼輸出什么
var z = 1, y = z = typeof y;
console.log(y);
輸出是 undefined
绣版。js
中賦值操作結(jié)合律是右至左的 周荐,即從最右邊開始計(jì)算值賦值給左邊的變量。
上面代碼等價(jià)于
var z = 1
z = typeof y;
var y = z;
console.log(y);
十六僵娃、下面代碼輸出什么
var foo = function bar(){ return 12; };
typeof bar();
輸出是拋出異常概作,bar is not defined
。 如果想讓代碼正常運(yùn)行默怨,需要這樣修改代碼
var bar = function(){ return 12; };
typeof bar();
或者是
function bar(){ return 12; };
typeof bar();
十七讯榕、下面代碼輸出什么
console.log(foo)
console.log(bar)
var foo = function(){
// Some code
};
function bar(){
// Some code
};
輸出為
undefined
function bar(){
// Some code
};
JavaScript
在執(zhí)行時(shí),會(huì)將變量提升。所以上面代碼JavaScript
引擎在實(shí)際執(zhí)行時(shí)按下面這個(gè)順序執(zhí)行
// foo bar的定義位置被提升
function bar(){
// Some code
};
var foo;
console.log(foo)
console.log(bar)
foo = function(){
// Some code
};
十八愚屁、下面代碼輸出什么
var salary = "1000$";
(function () {
console.log("Original salary was " + salary);
var salary = "5000$";
console.log("My New Salary " + salary);
})();
這道題同樣考察的是變量提升济竹。等價(jià)于以下代碼
var salary = "1000$";
(function () {
var salary ;
console.log("Original salary was " + salary);
salary = "5000$";
console.log("My New Salary " + salary);
})();
所以輸出為
Original salary was undefined
My New Salary 5000$
十九、什么是 instanceof 操作符霎槐?下面代碼輸出什么
function foo(){
return foo;
}
console.log(new foo() instanceof foo);
- instanceof操作符用來(lái)判斷當(dāng)前對(duì)象是否是特定類的對(duì)象送浊。如:
function Animal(){
//或者不寫return語(yǔ)句
return this;
}
var dog = new Animal();
dog instanceof Animal // Output : true
- 但是,這里的foo定義為
function foo(){
return foo;
}
- 所以
// here bar is pointer to function foo(){return foo}.
var bar = new foo();
所以 new foo() instanceof foo
返回 false
二十丘跌、如果我們使用JavaScript的"關(guān)聯(lián)數(shù)組"袭景,我們?cè)趺从?jì)算"關(guān)聯(lián)數(shù)組"的長(zhǎng)度
var counterArray = {
A : 3,
B : 4
};
counterArray["C"] = 1;
Object.keys(counterArray).length // Output 3
直接計(jì)算key的數(shù)量就可以了。