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