遞歸實現階乘
function factorial(a) {
if (a == 1) {
return 1;
}
return a * factorial(a - 1);
}
var res = factorial(3);
console.log(res);
實現 add(2)(3)
add(2, 3)
都可以求出結果5的add函數()
function add(a, b) {
if (b != undefined) {
return a + b;
}
return function (c) {
return a + c;
}
}
console.log(add(2)(3));
console.log(add(2, 3));
提供數組[5, 2, 1, 38]
,獲得結果字符串"53821"
var arr = [5, 1, 2, 38];
var str = arr.sort().reverse().join('')
console.log(str);
Array(2).join(); // ,
Array(3).join(); // ,,
Array(2, 3).join(); // 2,3
const a = (x) => x + 1;
const b = (x) => x * 2;
const c = (x) => x * x;
// const compose = (...fns) => (x) => fns.reduce((accumulate, fn) => fn(accumulate), x);
const compose = (...fns) => { // fns = [a, b, c]
return (x) => { // x = 4
return fns.reduce((accumulate, fn) => { // return 100
// 4 x + 1
// 5 x * 2
// 10 x * x
return fn(accumulate)
}, x) // x = 4
}
}
const composedFn = compose(a, b, c);
const result = composedFn(4);
console.log(result);
1~9隨機組合,可以組成三位數,每個數字智能使用一次,例如a=198 b = 243 c=567,這樣的組合有很多,請編程找出所有這些組中中,滿足a=b*2,b=c*2。(只寫程序,不必給出結果),并寫出算法復雜度
-
Promise與bind與箭頭函數的問題?
class Foo { constructor (name) { this.name = name } greet () { console.log('hello, this is ', this.name) } someThingAsync () { return Promise.resolve() } asyncGreet () { this.someThingAsync().then(this.greet) // bind綁定 // this.someThingAsync().then(this.greet.bind(this)) // 使用箭頭函數 // this.someThingAsync().then(() => this.greet()) } } new Foo('dog').asyncGreet()
-
作用域問題
var arr = []; for (var i = 0; i < 10; i++) { arr.push(function () { console.log(i); }) } arr[0](); arr[1](); arr[2](); // 解決辦法 let // 使用bind實現 console.log.bind(null, this)
-
排序算法:冒泡排序、快速排序
?
-
如何判斷一個對象的類型
Object.prototype.type = function () { // 使用Object原型上的方法,將對象轉為字符串 var res = Object.prototype.toString.call(this); // 從第8位開始截取,然后刪除最后一位 res = res.substring(8).slice(0, -1); // 返回結果 return res; };
閉包的使用,構造函數內部變量私有化
const Person = function (name) {
this.name = name;
let gender = 'F';
function genderFunc() {
return gender;
}
this.gender = genderFunc();
}
var p = new Person('xiaoming');
console.log(p.gender);
- 使用
new
關鍵字構建對象的本質?
function Person(name) {
this.name = name;
}
var p = new Person('xiaoming');
console.log(p);
// 代碼解析
function Person(name) {
// 1. 創建對象,并賦值給this
this = {};
// 2. 修改constructor
this.constructor = Person;
// 3. 設置屬性
this.name = name;
// 4. 返回this
return this;
}
-
new關鍵字寫與不寫都可以構建對象,如何實現該構造函數?
function Person(name, age) { // 判斷this是否為當前的構造函數 if (!(this instanceof Person)) { return new Person(name, age); } this.name = name; this.age = age; } var p1 = new Person('xiaoming', 19); var p2 = Person('xiaoming', 20); console.log('-------------'); console.log(p1); console.log(p2);
-
寫出結果:
alert(1 && 2); // alert(1 || 2); //
-
寫出結果:
var obj = { a: 1, b: function () { console.log(this.a) } }; var a = 2; var objb = obj.b; obj.b(); // 1 objb(); // 2 obj.b.call(window); // 2
-
寫出結果:
function A() { } function B(a) { this.a = a; } function C(a) { if (a) { this.a = a; } } A.prototype.a = 1; B.prototype.a = 1; C.prototype.a = 1; console.log(new A()); // 原型上面有a = 1 console.log(new B()); // 自身和原型上都有a 自身 a = undefined 原型 a = 1 console.log(new C(2)); // 自身和原型上都有a 自身 a = 2 原型 a = 1
-
寫出結果:
var a = 1; function b() { var a = 2; function c() { console.log(a); } return c; } b()(); // 2 var res = b(); res(); // 2
閉包,內層函數持有外層函數的變量,即便在外部調用,也會使用內部的a
-
解釋下作用域鏈?
當執行一段JavaScript代碼(全局代碼或函數)時,JavaScript引擎會創建為其創建一個作用域又稱為執行上下文(Execution Context),在頁面加載后會首先創建一個全局的作用域,然后每執行一個函數,會建立一個對應的作用域,從而形成了一條作用域鏈。每個作用域都有一條對應的作用域鏈,鏈頭是全局作用域,鏈尾是當前函數作用域。 作用域鏈的作用是用于解析標識符,當函數被創建時(不是執行),會將this、arguments、命名參數和該函數中的所有局部變量添加到該當前作用域中,當JavaScript需要查找變量X的時候(這個過程稱為變量解析),它首先會從作用域鏈中的鏈尾也就是當前作用域進行查找是否有X屬性,如果沒有找到就順著作用域鏈繼續查找,直到查找到鏈頭,也就是全局作用域鏈,仍未找到該變量的話,就認為這段代碼的作用域鏈上不存在x變量,并拋出一個引用錯誤(ReferenceError)的異常。
-
AJAX并發問題?
-
解釋下原型鏈?
JavaScript中的每個對象都有一個prototype屬性,我們稱之為原型,而原型的值也是一個對象,因此它也有自己的原型,這樣就串聯起來了一條原型鏈,原型鏈的鏈頭是object,它的prototype比較特殊,值為null。 原型鏈的作用是用于對象繼承,函數A的原型屬性(prototype property)是一個對象,當這個函數被用作構造函數來創建實例時,該函數的原型屬性將被作為原型賦值給所有對象實例,比如我們新建一個數組,數組的方法便從數組的原型上繼承而來。 當訪問對象的一個屬性時, 首先查找對象本身, 找到則返回; 若未找到, 則繼續查找其原型對象的屬性(如果還找不到實際上還會沿著原型鏈向上查找, 直至到根). 只要沒有被覆蓋的話, 對象原型的屬性就能在所有的實例中找到,若整個原型鏈未找到則返回undefined;
-
body中的onload()函數和jQuery中的document.ready()有什么區別?
1、我們可以在頁面中使用多個document.ready(),但只能使用一次onload()。 2、document.ready()函數在頁面DOM元素加載完以后就會被調用,而onload()函數則要在所有的關聯資源(包括圖像、音頻)加載完畢后才會調用。
-
什么情況下會遇到內存泄露?如何解決?
內存泄漏指任何對象在您不再擁有或需要它之后仍然存在。 setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏 閉包、控制臺日志、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
?
?
?