摘要:應(yīng)該一樣啊騷年,不要把你判斷值類型的方法套在我們偉大的對(duì)象上。還記得上面說的,對(duì)象是由構(gòu)造器函數(shù)創(chuàng)建的嗎所以說有構(gòu)造器的類型,都是對(duì)象。其他的類型都有構(gòu)造器,所以再次聲明一切都是對(duì)象是很有道理的。
對(duì)象
在大多數(shù)人的眼里,js是一門面向?qū)ο?Object-Oriented)的語(yǔ)言,但是它與其他的語(yǔ)言比如c++,java 這些面向?qū)ο笳Z(yǔ)言 略有不同。
!!!艸,說人話
那問幾個(gè)問題吧:
1.你知道js中對(duì)象的定義是什么嗎?
答: 不就是一個(gè)散列表嘛~ 相當(dāng)于key/value對(duì).
var obj = { name:"jimmy", gender:"male" }
2.那js里面一切都是對(duì)象你能理解嗎?具體一點(diǎn),你說一下,函數(shù)為什么是對(duì)象吧。
答:...。 (Ps:md!!! 函數(shù)哪里是對(duì)象了。。。)
以上對(duì)話其實(shí)是一道面試題。 是不是感覺自己蒙蒙噠了~
壯士磨嘰, 其實(shí)js里面一切都是對(duì)象是完全有理有據(jù)的。希望能夠好好理解,因?yàn)檫@個(gè)以后可能會(huì)區(qū)別你是磚家,還是專家的一個(gè)重要分水嶺.
來(lái)我們先說一說對(duì)象.
這個(gè)問題就涉及了對(duì)象的定義。 上面說的沒錯(cuò),對(duì)象其實(shí)就是一個(gè)散列表而已。但是更深層次的說,你怎么獲得一個(gè)對(duì)象。
show me u code:
var obj = new Object();
上面一個(gè)例子很好的體現(xiàn)出,對(duì)象如何定義。
對(duì)象其實(shí)是由 new + 構(gòu)造函數(shù) 創(chuàng)建的。 關(guān)于這點(diǎn)就會(huì)涉及到模式的概念,大家有興趣可以參考我前面一篇文章——"模式之辯". 而且還有一個(gè)限制, 你所創(chuàng)建的類型必須是引用類型。
聽不懂了吧~
總結(jié)下上面的,其實(shí)
對(duì)象 = new + 構(gòu)造函數(shù) || 字面量的引用類型
來(lái)上個(gè)栗子.
var obj = new Function(); //對(duì)象 var obj = new Object(); //對(duì)象 var obj = {}; //對(duì)象 var str = "not a Object"; //不是對(duì)象
由于string不是引用類型,所以它創(chuàng)建的實(shí)例不是對(duì)象~ 而且其他的都是引用類型,所以結(jié)果都是對(duì)象.
但是對(duì)象還有幾個(gè)features, which are unique with other types.
1.對(duì)象的可增添性
什么意思嘞?
var obj = {}; obj.name = "jimmy"; console.log(obj.name); //jimmy var str = "a"; str.name = "jimmy"; console.log(str.name); //undefined
這個(gè)可以充分的說明,對(duì)象類型和值類型的區(qū)別的。
2.等價(jià)判斷
怎么判斷兩個(gè)對(duì)象是一個(gè)東西嘞?
用"==="唄。 來(lái)試一試.
var obj1 = new Object(); var obj2 = new Object(); console.log(obj1===obj2); //false
艸,怎么會(huì)這樣,兩個(gè)不都是對(duì)象嗎?而且我又沒動(dòng)它。應(yīng)該一樣啊~~~
騷年,不要把你判斷值類型的方法套在我們偉大的對(duì)象上。
說明一下。如果判斷對(duì)象類型和值類型。
對(duì)象類型的判斷:
對(duì)象的等價(jià)是建立在你們的源是否相同(官方的說法叫地址).
var obj1= new Object(); var obj2 = new Object();
需要搞清楚,使用 new + 構(gòu)造器 你是在新建實(shí)例,即你創(chuàng)建的是不同源的對(duì)象。
那如何同源嘞?
var obj1 = new Object({ name:"jimmy" }); var obj2 = obj1; //同源 var obj3 = new Object(); obj2.name = "sam"; console.log(obj1.name); //sam console.log(obj1===obj2); //true console.log(obj2===obj3); //false
其實(shí)到這里,我們需要將我們以前的所說的對(duì)象再抽象一層。 你說使用的var obj1 里面的obj1 并不是對(duì)象,而只是一個(gè)指針, 指向著這個(gè)對(duì)象。 那這個(gè)對(duì)象在哪里嘞? 在你的內(nèi)存當(dāng)中。 艸~~~ 好難理解。
為了大家更好的理解一切都是對(duì)象,我這里會(huì)以大眾的視角來(lái)講解的。(當(dāng)然如果你已經(jīng)理解了,可以忽略下面非正式的說法~)
回退~
我們還是將obj1和obj2說成是對(duì)象。 上面可以看出,只有是同源的對(duì)象才會(huì)相等。
值類型的判斷:
這個(gè)就很好說了, 你知道1===1嗎? 恩,知道~~~
恭喜你,你已經(jīng)知道值類型的判斷了。
var num1 = 2; var num2 = 2; console.log(num1===num2); //true
說了這么多,那值類型和引用類型到底有哪些呢?
值類型: string,number,Boolean,null,undefined,Symbol(es6才出的)
引用類型: Object,Array,RegExp,Function,Date
恩,大致就這么多。
~腳嘚瑪嘚(Ps:日語(yǔ))
大哥,不對(duì)呀~ 為什么有時(shí)候我使用string類型的時(shí)候又可以在后面使用方法嘞?您看:
var s = "jimmy"; console.log(s.length); //5
不是說值類型不是對(duì)象嗎? 那它怎么會(huì)有對(duì)象的feature呢?
對(duì),這個(gè)問題問的好~
來(lái),再給大家科普一個(gè)類型,基本包裝類型。
我相信寫過2k+代碼的童鞋應(yīng)該會(huì)遇到這樣的情況。比如我要知道這個(gè)字符串是不是空,可以使用這樣的判斷:
var s = "jimmy"; if(s.length===0){ console.log("這是一個(gè)空的string"); }
咦~ 為什么值類型的又可以使用屬性嘞?
事實(shí)上, ECMAScript 規(guī)定的類型詳細(xì)的分有2.5種.
除了上面說的兩種還有一種基本包裝類型.
基本包裝類型: String,Number,Boolean.
其實(shí)值類型 包括基本包裝類型的。
那他的特性是什么嘞?
再看一下上面的例子:
var str= "jimmy"; console.log(str.length); //5 str.length = 6; console.log(str.length); //5
我們用事實(shí)說話, 上面的結(jié)果很好的證明了,基本包裝類型的特性。 即 如果你想讀取值類型的相關(guān)屬性和方法,
js引擎會(huì)默認(rèn)幫你將值類型,臨時(shí)變?yōu)橐粋€(gè)對(duì)象使用。但是這層保存存在的時(shí)間,只是你代碼執(zhí)行的那一瞬間。
再次證明:
var str = "jimmy"; str.male = "male"; //執(zhí)行成功,但立即被銷毀 console.log(str.male); //undefined
上面例子的執(zhí)行過程是
1.給str包裝一層對(duì)象實(shí)例 2.執(zhí)行對(duì)象的一個(gè)特性 3.銷毀這層包裝實(shí)例
所以就不難理解,為什么上面會(huì)是undefined. (因?yàn)闆]都沒了,你哪來(lái)的定義嘞)。
綜上所述,在js中一切都是對(duì)象是不無(wú)道理的。
還記得上面說的,對(duì)象是由 new + 構(gòu)造器函數(shù) 創(chuàng)建的嗎? 所以說 有構(gòu)造器的類型,都是對(duì)象。 事實(shí)上除了null,undefined 這兩個(gè) 呆毛。 其他的類型都有構(gòu)造器,所以再次聲明一切都是對(duì)象是很有道理的。
最后我們來(lái)回答一下開篇的那個(gè)題目,為什么函數(shù)也是對(duì)象?
如果函數(shù)也是對(duì)象,那他應(yīng)該具有對(duì)象的一切特性,我這里偷個(gè)懶,就舉他的動(dòng)態(tài)特性吧。
function a (){}; a.move = 1; console.log(a.move); //1
額,不信嗎? 我開大了哈~ 用instanceof 檢測(cè)一下
console.log(a instanceof Object); // true
完畢~
再補(bǔ)充一點(diǎn),我整篇都是對(duì)象對(duì)象的。英文不都是Object. 那為什么Function類型也是Object. RegExp類型也是Object. Object 也是Object. 好了 不繞了, 如果大家如果知道原型鏈這個(gè)東西的話,應(yīng)該知道,所有的構(gòu)造器的原型的金字塔尖 就是Object. (null不算啊~ 這個(gè)呆毛不算,因?yàn)镺bject再往上就是null了);
下次面試之前理解一下這句話,我相信,你的評(píng)級(jí)應(yīng)該會(huì)靠SP 更近一點(diǎn)吧。嘿嘿
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/78397.html
摘要:在瀏覽區(qū)中的性能,可以認(rèn)為是開發(fā)者所面臨的最嚴(yán)重的可用性問題。優(yōu)化這個(gè)問題的第一步從它的加載和執(zhí)行開始。這意味著在對(duì)象的事件觸發(fā)后再下載腳本。屬性指明本元素所含的腳本不會(huì)修改,因此代碼能夠安全地執(zhí)行,但是瀏覽器的支持情況不理想。 JavaScript在瀏覽區(qū)中的性能,可以認(rèn)為是開發(fā)者所面臨的最嚴(yán)重的可用性問題。 優(yōu)化這個(gè)問題的第一步從它的加載和執(zhí)行開始。 霸道的script標(biāo)簽scr...
摘要:在這些文件的下載執(zhí)行過程中,用戶看到的則是一片空白。頁(yè)面仍然必須等到所有代碼下載并執(zhí)行完畢才能繼續(xù)渲染。 前言 kyrieliuの《高性能JavaScript》讀書筆記。 script標(biāo)簽是一個(gè)很霸道的狠角色,它的每次出現(xiàn)都讓頁(yè)面等待腳本的解析和執(zhí)行。也就是說,不管當(dāng)前的javascript代碼是內(nèi)嵌還是包含在外鏈文件中,頁(yè)面的下載和渲染都必須停下來(lái)等待腳本執(zhí)行完成。 其實(shí),scri...
摘要:近日,甲骨文公司在上海舉辦了甲骨文優(yōu)化數(shù)據(jù)中心高峰會(huì)和甲骨文金融服務(wù)全球領(lǐng)袖峰會(huì)活動(dòng),其中公司總裁馬克赫德也作為演講嘉賓的身份再次到訪中國(guó),這已經(jīng)是他上任后第二次來(lái)到中國(guó)。 近日,甲骨文公司在上海舉辦了甲骨文優(yōu)化數(shù)據(jù)中心高峰會(huì)和甲骨文金融服務(wù)全球領(lǐng)袖峰會(huì)活動(dòng),其中公司總裁馬克·赫德也作為演講嘉賓的身份再次到訪中國(guó),這已經(jīng)是他上任后第二次來(lái)到中國(guó)。與北京之行的低調(diào)形成鮮明對(duì)比,此番馬克·赫德到...
推薦 1. JavaScript 在嵌入式設(shè)備與物聯(lián)網(wǎng)中的應(yīng)用現(xiàn)狀 https://auth0.com/blog/javasc... 隨著近年來(lái) Web 的發(fā)展與 JavaScript 的崛起,JavaScript 被應(yīng)用到了許多原本不曾想象到的場(chǎng)景中,從服務(wù)端、工作站、數(shù)據(jù)庫(kù)、桌面環(huán)境到物聯(lián)網(wǎng)設(shè)備中,都可以見到 JavaScript 的身影。而本文則概括了 JavaScript 在不同的嵌入式微...
閱讀 659·2023-04-25 15:49
閱讀 3116·2021-09-22 15:13
閱讀 1251·2021-09-07 10:13
閱讀 3477·2019-08-29 18:34
閱讀 2560·2019-08-29 15:22
閱讀 510·2019-08-27 10:52
閱讀 687·2019-08-26 18:27
閱讀 3021·2019-08-26 13:44