導航:首頁 > 編程語言 > jsreference

jsreference

發布時間:2024-04-29 19:20:55

javascript傳遞參數如果是object的話,是按值傳遞還是按引用傳遞

對象當作參數可以理解為按引用傳遞如果是某個對象的屬性當參數,是值傳遞

② 如果我要學習JavaScript,需要先學習什麼

這個問題對於不同人的答案是不一樣的。對於編程老手來說,學習JavaScript可能只需要看看reference、看看一些腳本庫的源碼,有疑難再上上stackoverflow或知乎之類的地方就可以了。

js中函數的調用、引用有什麼區別

調用是 invoke,引用是 reference。
題主知道值類型和引用類型的區別嗎?如果還不清楚,那麼建議把書從頭讀。JS 中的函數是一種引用類型。
調用就是執行了這個函數。

④ JavaScript原型,原型鏈 有什麼特點

1.1 一切皆為對象
JavaScript里所有的東西都是對象. 對象是屬性的集合. 數字, 字元串, 布爾值等原始值是"偽對象", 它們同樣擁有屬性, 但是是在棧上分配並按值傳遞. 而其他的對象是堆上分配並按引用傳遞.
一個很重要的概念是,函數也是對象, 能夠作為變數的值, 返回值, 參數或者屬性的值. 函數對象特殊的地方是能通過"xxx()"語法執行包含在xxx函數對象內的代碼. 因為這一特殊性, typeof xxx 將會返回function, 但這只是一種便利設施.

1.2 對象的屬性可以動態添加和刪除

varfoo=newObject();
//為foo對象添加bar屬性
foo.bar="foobar";
alert(foo.bar);//foobar
//刪除foo對象的bar屬性
deletefoo.bar;
alert(foo.bar);//undefined


1.3 除了宿主對象, 其它對象皆由構造函數創建
要有對象, 就先要有創建對象的方法.
在C++/Java等語言, 這個方法就是實例化XXX類的一個實例xxx.
而在JavaScript的世界裡實際沒有類的東西, 當然仍然可以用"類"和"實例"等慣用語來描述JavaScript中類似的行為, 但其機制是完全不同的. JavaScript的對象是由構造函數創建的, 每個對象都有constructor屬性表示創建該對象的構造函數:

functionTest(){this.a="hello";}
vartest=newTest();//由Test構造函數創建
alert(test.constructor);

varo={a:"hello"};
//實際相當於
varo_=newObject();
o_.a="hello";//由Object構造函數創建
alert(o.constructor);

構造函數也是對象, 那構造函數是由什麼創建? 內建的Function函數:

functionTest(a, b)
{
alert(a+b);
}
//相當於:
Test=newFunction(["a","b"],"alert(a+b);");

Function函數又是由什麼創建? 實際上Function是本機代碼實現的固有對象. 不過為了一致性, Function也有constructor屬性, 該屬性指向它自己. 接上面的代碼:

/*輸出functionFunction(){
[nativecode]
}
*/
alert(Test.constructor);

alert(Test.constructor.constructor===Test.constructor);//true
alert(Test.constructor===Object.constructor);//true


2 原型prototype
2.1 prototype的概念
prototype是構造函數的一個屬性, 該屬性指向一個對象. 而這個對象將作為該構造函數所創建的所有實例的基引用(base reference),可以把對象的基引用想像成一個自動創建的隱藏屬性. 當訪問對象的一個屬性時, 首先查找對象本身, 找到則返回; 若不, 則查找基引用指向的對象的屬性(如果還找不到實際上還會沿著原型鏈向上查找, 直至到根).只要沒有被覆蓋的話, 對象原型的屬性就能在所有的實例中找到.
原型默認為Object的新實例, 由於仍是對象, 故可以給該對象添加新的屬性:

//prototype默認為newObject();為了方便, 記為p_obj
functionPerson(name){
this.name=name;
}

//為p_obj增加sayName屬性
Person.prototype.sayName=function(){
alert(this.name);
}

varjohn=newPerson("John");//john的basereference指向p_obj
vareric=newPerson("Eric");//eric的basereference也是指向p_obj

//注意sayName代碼中的this將指向實例化後的對象(this綁定)
john.sayName();//john對象本身沒有sayName屬性,於是訪問原型對象p_obj的sayName屬性
eric.sayName();//訪問同一個原型對象p_obj的sayName屬性


vartmp=Person.prototype;
tmp.boss="David";
//於這個運行點,p_obj已經被修改
//根據上述屬性訪問流程,新的修改(boss屬性)能反映到所有的實例,包括已經創建和即將創建的
alert("John'sbossis"+john.boss);
alert("Eric'sbossis"+eric.boss);


//hisCar和sayCar屬性將增加到john對象而不是p_obj對象..
john.hisCar="Audi";
john.sayCar=function(){
alert(this.name+"hasacarof"+this.hisCar);
}
john.sayCar();
//..因此下一句將錯誤,因為eric對象本身和原型p_obj都沒有sayName屬性
/*eric.sayCar();*/


2.2 原型鏈
除了能修改prototype指向的對象, 還能修改prototype指向哪一個對象, 即為prototype賦予一個不同的對象. 這可以實現一種簡單的繼承:

functionSuperman(){}
Superman.prototype.sayHello=function(){
alert("I'masuperman.");
}

functionSupermanCan(skill){
this.skill=skill;
}
//為prototype賦予Superman的實例..
SupermanCan.prototype=newSuperman();
//..再動態添加新的屬性
SupermanCan.prototype.sayMore=function(){
this.sayHello();//調用"父類"的方法
alert("Ican"+this.skill);
}

vardavid=newSupermanCan("fly");
//output:I'masuperman.Icanfly
david.sayMore();

如果先實例化出一個對象, 再為構造函數prototype賦予一個不同的對象, 將會: 已經創建的對象的基引用不變, 將來創建的對象的基引用為新的原型對象:

varf1={echo:function(){alert("sound");}};
functionFoo(){};
varfoo=newFoo();//foo的基引用指向Object實例
Foo.prototype=f1;
/*未定義,因為這是"foo對象自己或者基引用指向的對象有echo屬性嗎?"
而不是"foo對象自己或者Foo.prototype指向的對象有echo屬性嗎?"*/
alert(foo.echo);

varfoo2=newFoo();//foo2的基引用指f1對象
foo2.echo();//output:sound

所有的構造函數的prototype都不能為空, 就是說Superman.prototype = null 會被解釋引擎無視; 另一方面, Object構造函數也有prototype屬性(該屬性是只讀的, 可以為原型增加屬性,但不能賦予不同的對象), 故因此可以有多層的原型鏈, 但原型鏈的根必定會是Object.prototype . 這意味著給Object.prototype增加屬性影響到所有對象:

Object.prototype.echo=function(){
alert("hello");
}

//echo屬性將增加到所有對象固有對象和自定義對象

vararr=newArray();
arr.echo();
Array.echo();

functionObjCons(){
this.mmy="d";
}
varobj=newObjCons();
obj.echo();
ObjCons.echo();


3. 構造函數和new的實質
構造函數是一個地地道道的函數, 一個函數之所以能成為構造函數, 是因為new運算符:

this.msg="window";

functionTest()
{
alert(this.msg);
}

Test();//window
vartest=newTest();//undefined.因為test對象沒有定義msg屬性

二者區別在於如何切入對象: Test() 在某個對象(例子中為window)的上下文上執行代碼, 即this指向這個對象; new Test()創建一個新對象, 並以這個新的對象為上下文(this指向新對象)執行代碼, 然後返回這個新對象.
假如有個函數:

functionTest(){
varmmy="havemoney";
this.wish=mmy;
doSomeThing();

}

結合以上的所有論述, 可以推測new Test()行為的偽代碼表示為:
創建一個新對象temp;
temp.constructor = Test;
temp.(base reference) = Test.prototype; // 這一句先於代碼體執行, 意味著構造函數里的this.xxx能訪問原型對象的屬性xxx
bind: this=temp; //將this綁定到temp對象
// 開始執行函數代碼
var mmy = "have money";
this.wish = mmy; // 為temp對象添加wish屬性
doSomeThing();
....
// 結束執行函數代碼
return temp;
這個未必會符合內部的二進制實現, 但卻能很好地解釋了JavaScript的特性.

⑤ javascript中的indexOf函數用法

比如 有個 var txt="abcdefg";var num=txt.indexOf("b"); //這時來候 num的值源就是1 var num=txt.indexOf("m"); //這時候 num的值就是-1 如果沒有找到匹配的 就返回-1 如果indexOf 只會返回第一次匹配到的值的下標 下標從0開始

⑥ 怎樣用js代碼替換頁面上的連接地址

你在連接上使用 onclick 函數,<a href='#' onclick=函數名(變數)>連接名稱</a>
js 函數可以這樣定義例如function rLink(){document.location.reload(變數);}
嘻嘻

閱讀全文

與jsreference相關的資料

熱點內容
計算器編程序怎麼學 瀏覽:500
如何知道櫥窗賣出的商品是哪個app的 瀏覽:56
大眾寶來點火線圈數據流通道號是多少 瀏覽:981
手機後台網路怎麼關閉 瀏覽:537
大數據安徽 瀏覽:563
iphone鎖屏密碼能破解嗎 瀏覽:964
電信運營商大數據徵信 瀏覽:699
怎麼u盤里的文件打不開 瀏覽:97
如何發word文件怎麼打開 瀏覽:176
惠普還原系統win10教程 瀏覽:167
iphone6ssunspider 瀏覽:796
java獲取攝像頭 瀏覽:959
怎麼用網線傳文件 瀏覽:24
電導增量法matlab程序 瀏覽:366
手機文件管理在那裡 瀏覽:205
如何取消卸載app的續費 瀏覽:316
數控編程哪個最容易 瀏覽:170
光速互動官方教程 瀏覽:411
谷歌登陸網站打不開怎麼辦 瀏覽:937
java什麼是非同步編程 瀏覽:898

友情鏈接