//分析:String的兩種建立方法: //第一種方法: var str = "str" //str只是一個以String爲數據類型的值,但並不屬於String對象的實例 //第二種方法: var strObj = new String("strObj") //此時的strObj是String對象的一個實例 //針對第一種建立方式,採用typeof檢測,此時採用instanceof != String //針對第二種建立方式,採用instanceof檢測,此時採用typeof檢測出來的是Object function isString(str){ return (typeof str).toLowerCase() === 'string' || str instanceof String }
function Foo(){ getName = function(){ alert(1)} } Foo.getName = function(){alert(2)} Foo.prototype.getName = function(alert(3)) var getName = function(){alert(4)} function getName(){alert(5)} //問題:請給出下面運行的結果 Foo.getname(); getName(); Foo().getName(); getName(); New Foo.getName(); new Foo().getName(); new new Foo().getName();
進入環境(代碼未執行,已編譯):javascript
VO:{ Foo:{ <reference to function> getName:<reference to function(){alert(1)}> return this } getName:<reference to function(){alert(5}> }
代碼執行1:Foo.getName()
前端
VO:{ Foo:{ <reference to function>, getName:<reference to function(){alert(2)}>, return this }, getName:<reference to function(){alert(5)}> }
代碼執行2:Foo.prototype.getName = function(){alert(3)}
java
VO:{ Foo:{ <reference to function> getName:<reference to function(){alert(2)}>, prototype:{ getName:<reference to function(){alert(3)}> } return this } getName:<reference to function(){alert(5)}> }
代碼執行3:var getName = function(){alert(4);};
面試
VO:{ Foo:{ <reference to function> getName:<reference to function(){alert(2)}>, prototype:{ getName:<reference to function(){alert(3)}> } return this } getName:<reference to function(){alert(4)}> }
代碼執行4:Foo.getName()
函數
VO:{ Foo:{ <reference to function> getName:<reference to function(){alert(2)}>, prototype:{ getName:<reference to function(){alert(3)}> } return this } getName:<reference to function(){alert(4)}> }
代碼執行5:getName() //2
代碼執行6:Foo().getName()
this
Foo().getName() == window.getName() //同時注意:這裏因爲Foo()調用,致使VO發生了變化。最後alert(1) VO:{ Foo:{ <reference to function> getName:<reference to function(){alert(2)}>, prototype:{ getName:<reference to function(){alert(3)}> } return this } getName:<reference to function(){alert(1)}> }
代碼執行7:getName() //1
代碼執行8,9,10:prototype
//調用優先順序 成員訪問 > new(帶參數列表)>函數調用>new(無參數列表)
var name = 'the window' var obje = { name:'myObject', getNameFunc:function(){ return function(){ return this.name } } } obje.getNameFunc()()
var stringValue = 'lorem ipsum dolor sit amet ,consectent adipisicing elit' var array = [] var pos = stringValue.indexOf('e') while(pos > -1){ array.push(pos) pos = stringValue.indexOf('e',++pos) }
var a =1; function foo(a,b){ a = 2; console.log(a); var a; console.log(a); arguments[0] = 3 console.log(a,this.a,b) }
//2 //2 //2 1 undefined