私人定制javascript中對象小知識點(Only For Me)
廢話不多講,先上笑話,然后再,。看懂這個的說明你的節(jié)操已經(jīng)不再了。
晚飯后去理發(fā)店理發(fā)。。。割了吧。。。老板問我怎么剪,我悠悠的來一句往帥了剪。。。高潮往往令人想不到。。。。旁邊一在焗油燙頭發(fā)的大媽說到 別這樣為難老板,人家賺點錢不容易。。。
首先如果你是高手那么請出門右轉(zhuǎn),如果你是菜鳥那么恭喜你,go on吧
全局對象
在javascript程序中任何位置,都可以拈來就用的這種東西,是全局對象的屬性.那么屬性所在的對象也就是全局對象了。
當(dāng)javascript解釋器啟動時(或者任何Web瀏覽器加載新頁面的時候),它將創(chuàng)建一個新的全局
對象,并給它一組定義的初始屬性:
1.全局屬性,比如undefined,Nan
2.全局函數(shù),例如isNaN(),parseInt()
3.構(gòu)造函數(shù),比如Date(),String()
4.全局對象,比如Math和JSON()
代碼中聲明了一個全局變量,這個全局變量就是全局對象的一個屬性
以上代碼純屬占篇幅,上代碼
var s="hello world!"; var tempstr=s.substring(s.indexof(" ")+1);
有沒有有想過為什么s會調(diào)用substring()方法呢?
答案是只要引用了字符串s的屬性,javascript就會將字符串值通過new String(s)的方式轉(zhuǎn)換成對象,
這個對象繼承了字符串的方法,并被用來處理屬性的引用。一旦屬性引用結(jié)束,這個新創(chuàng)建的對象就會銷毀。
舉例為證:
var s="test"; s.len=4; //給它設(shè)置一個屬性 var temp=s.len; console.log(temp) //undefined
解釋:第二行代碼創(chuàng)建一個臨時字符串對象,并給其len屬性賦值為4,但是馬上就銷毀這個對象。第三行試圖訪問臨時屬性,
修改只是發(fā)生在臨時對象身上,但這個臨時對象并未保存。
這就引出一個概念存取字符串,數(shù)字或布爾值的屬性時創(chuàng)建的臨時對象叫做包裝對象。
知道了這個就可以區(qū)分什么時候字符串和字符串對象等等概念。具體有什么大的用處,我還真心不太了解。
包裝對象
首先什么是包裝對象,就是將普通的非對象的常規(guī)類型用某種方式包裝成了一個對象
答案是可以通過某些內(nèi)置構(gòu)造函數(shù)String()//Number()限時創(chuàng)建包裝對象
var S=new String("marry you"); console.log(S); //String {0: "m", 1: "a", 2: "r", 3: "r", 4: "y", 5: " ", 6: "y", 7: "o", 8: "u", length: 9}
可以用==和===來區(qū)分是否是包裝對象,==將原始值和包裝對象視為相等,當(dāng)"==="視為不等,也可以通過typeof
原始值和對象有著根本的區(qū)別是,原始值是不可更改的。雖然字符串看上去有點例外。
比如
var s="marry me";
console.log(s.toUpperCase()); //返回"MARRY"
console.log(s); //"marry me" 但并沒有改變s的值
s=s.toUpperCase(); console.log(s); //MARRY ME
原始值是無法更改的,任何方法都無法更改一個原始值,比如說通過指定索引來修改字符串中字符,javascript是禁止的。實際上返回給s的是一個新的字符串,之前的s其實是存在于內(nèi)存中的,只不過沒有被引用而已(有點小疑惑對應(yīng)這個結(jié)論,多謝@泰山宏圖的提醒)。
對象轉(zhuǎn)換為原始值
那么怎么實現(xiàn)對象轉(zhuǎn)化為原始值呢
常見的有對象到字符串和數(shù)字到字符串等等
所有對象繼承了兩個轉(zhuǎn)換方法。
第一個是toString()
作用是返回一個反映這個對象的字符串。
第二個是valueOf()
作用是如果存在任意原始值,它就默認(rèn)將對象轉(zhuǎn)換為表示它的原始值。對象是復(fù)合值,而且大多數(shù)對象無法真正表示
一個原始值,默認(rèn)返回對象本身,非原始值。(其實這個知識點還可以挖的更深,對此我只能淺嘗而止啦)
例如:[1,2,4].toString();// "1,2,3"
(function(x){console.log("marry you");}).toString(); //"function (x){console.log("marry you");}" new Date(2022,2,2).toString();//"Sat Mar 02 2222 00:00:00 GMT+0800 (中國標(biāo)準(zhǔn)時間)" var d=new Date(2020,2,22); d.valueOf();//1584806400000
那么為啥會出現(xiàn)的不太一樣呢,因為很多內(nèi)置類都對toString()做了修改了。
所以如果你要想使用toString()來反應(yīng)這個對象的字符串類型
Object.prototype.toString().call(obj);//這樣得到的就是最原始的toString()的含義
如:Object.prototype.toString.call([1,2,4]); //"[object Array]"
如果你用[1,2,4].toString();//"1,2,4" 如果你得出這個鬼東西,我就只能安慰你,哥們不哭,站起來擼
變量作用域
在此簡單說說變量的作用域
首先變量的作用域是變量的作用范圍區(qū)域,特別給從后端程序員轉(zhuǎn)到前端的程序員說一點,此處的作用域不是用{}塊級來
區(qū)分作用域的,而是用一個function函數(shù)來區(qū)分作用域的也叫做函數(shù)塊級作用域。
比如for(var i=0;i<1;i++){console.log(i);} console.log("還是在這個作用域的i:",i) //0,還是在這個作用域的i: 1
首先函數(shù)體內(nèi),局部變量的優(yōu)先級高于同名的全局變量。
var a="global"; function testscope(){ var a="local"; return a; } testscope();//"local"
so作用域還有很多需要整理的,未完待續(xù)。如果你覺得對你有一點點幫助,求點推薦。如果沒有,不要點推薦旁邊的按鈕。
要不然我會來找你的...

浙公網(wǎng)安備 33010602011771號