一、下面代碼的實際執行過程是什麼?javascript
var name = 'fan' var str = name.charAt(0) console.log(str)
var name = 'fan' var temp = new String(name) var str = temp.charAt(0) temp = null console.log(temp)
二、使用原始值和原始封裝類型是有區別的java
var flag = new Boolean(false) if(flag){ console.log(flag) }
由於flag是被解析成一個對象的,因此確定是真的git
三、函數是對象,函數有兩種字面形式,第一種是函數聲明,以function
關鍵字開頭後面跟函數名字。github
function add(){ //... }
第二種形式是將函數做爲一個值賦值給變量數組
var add = function(){ }
函數聲明會被提高到上下文頂部,能夠先使用再定義app
var result = add() function add(){ //... }
而函數表達式僅能經過變量引用,所以是沒有辦法提高的。因此下面會報錯函數
var result = add() var add = function(){ //... }
四、函數的length屬性表示該函數的指望參數個數,實現一個函數,求其接受任意數量的參數並返回他們的和this
function sum(){ var result = 0, i = 0, l = arguments.length while(i < l){ result += arguments[i] i++ } return result }
五、函數重載的理解,下面的函數輸出什麼?並解釋下。code
function sayHello(name){ console.log(name) } function sayHello(){ console.log('default msg') } sayHello('fan')
解釋:對象
var sayHello = new Function('name', 'console.log(name)') var sayHello = new Function("console.log('default')") sayHello('fan')
能夠利用參數的個數來模擬函數的重載
六、改變函數的this。
一、call()方法
function sayHi(context){ console.log(context + ':' + this.name) } var person1 = { name: 'fanchao' } var person2 = { name: '陳冠希' } var name = '小姐姐' sayHi.call(this, 'global') sayHi.call(person1, 'person1') sayHi.call(person2, 'person2')
這裏是顯示的指定this的值,並非讓javascript引擎去自動指定this
二、apply()方法
function sayHi(context){ console.log(context + ':' + this.name) } var person1 = { name: 'fanchao' } var person2 = { name: '陳冠希' } var name = '小姐姐' sayHi.apply(this, ['global']) sayHi.apply(person1, ['person1']) sayHi.apply(person2, ['person2'])
apply基本上和call的方式是同樣的,就是接受的第二個參數不同,是以數組的形式傳入函數的,call是須要有多少就要以展開的方式傳入參數例如:
xxxxFun.call(xxObj, param1,param2,...)
三、bind()方法
bind方法是ECMAscript 5中的方法,和以前的call和apply有點不同
function sayHi(context){ console.log(context + ':' + this.name) } var person1 = { name: 'fanchao' } var person2 = { name: '陳冠希' } //爲person1建立一個方法sayHiPerson1 var sayHiPerson1 = sayHi.bind(person1) sayHiPerson1('person1') // 爲person2建立一個方法sayHiPerson2 var sayHiPerson2 = sayHi.bind(person2,'person2') sayHiPerson2() // 由於this已經綁定給了person1,因此name仍是person1的 person2.say = sayHiPerson1 person2.say('person2')
sayHiPerson1方法沒有綁定參數,因此本身仍是要在調用的時候傳參數
sayHiPerson2不只綁定了this指向還綁定了第一個參數。參數的綁定相似call方法。
一個好的食用連接,給個star唄