您好,登錄后才能下訂單哦!
這篇“javascript拆箱裝箱和類型轉換的方法”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“javascript拆箱裝箱和類型轉換的方法”文章吧。
基本數據類型:string
、number
、boolean
引用類型:object
、function
不存在的類型:undefined
String
、Number
、Boolean
分別屬于string
、number
、boolean
三個原始類型的包裝類型,它們的對象屬于引用類型。
裝箱是指把基本數據類型轉換為對應的引用類型的操作,該過程主要是指string
、number
、boolean
類型的數據,通過String
、Number
、Boolean
進行包裝成為引用類型數據的過程。
// 隱式裝箱var s1 = 'Hello World'; var s2 = s1.substring(2);
上面第二行代碼的執行步驟其實是這樣的:
使用new String('Hello World')
創建一個臨時的實例對象;
使用臨時對象調用substring
方法;
將執行結果賦值給s2
;銷毀臨時的實例對象。
上面的步驟轉換為代碼,如下:
// 顯式裝箱var s1 = 'Hello World'; var tempObj = new String('Hello World'); var s2 = tempObj.substring(2);
拆箱是把引用類型轉換為基本的數據類型。
關于拆箱過程中的ToPrimitive
運算符對于兩端的變量,都有一個期待類型,在javascript
中,凡是不滿足運算符期待類型的變量,都會做做隱式轉換。
在進行邏輯運算時,隱式轉換只有一個標準:只有 null
、undefined
、 ''
、 NaN
、 0
和 false
表示 false
,其他的情況都是 true
,比如 {}
, []
。
如果算術運算符兩端均為number
類型的數據,直接進行計算;
如果算術運算符兩端存在非number
的基本數據類型,則對非number
的運算數使用Number()
進行裝箱,然后對返回值進行拆箱為number
類型,參與計算;
算術運算符兩端存在引用數據類型,則先對引用類型進行拆箱操作,如果結果為非number
類型,則根據條件2
執行,否則執行條件1
。
1 - true // 0, 首先 Number(true) 轉換為數字 1, 然后執行 1 - 11 - null // 1, 首先把 Number(null) 轉換為數字 0, 然后執行 1 - 01 * undefined // NaN, Number(undefined) 轉換為數字是 NaN , 然后執行 1 * NaN2 * ['5'] // 10, ['5'] 依照ToPrimitive規則進行拆箱會變成 '5', 然后通過 Number('5') 進行拆裝箱再變成數字 5123 + {valueOf:()=>{return 10}} // 133 {valueOf:()=>{return 10}} 依照ToPrimitive規則會先調用valueOf,獲得結果為10
當+
作為單目運算符出現在變量的前面時,表示的意思是將變量轉換為Number
類型
+"10" // 10 同 Number("10")+['5'] // 5 ['5']依照ToPrimitive規則會變成 '5', 然后通過`Number`的拆箱操作再變成數字 5
字符串連接符的符號同算術運算符的+
。
如果算術運算符兩端均為string
類型的數據,直接進行連接
如果運算符的兩端存在非string
的基本類型,則對非string
的基本類型數據使用String()
進行裝箱,然后對返回值進行拆箱為基本類型,參與字符串拼接。
當+
兩端兩端存在引用數據類型,則先對引用類型進行拆箱操作,如果結果為非string
類型,則根據條件2
執行,否則執行條件1
。
NaN
和其他任何類型,做任何關系運算永遠返回false
(包括和他自己)。如果想判斷一個變量是不是NaN
, 可以通過Number.isNaN()
來判斷。
null == undefined
比較結果是true
,除此之外,null
、undefined
和其他的(不包括它們自身)任何結果的比較值都為false
。
這里是規則定義的,
null
為 object 的類型,可是調用valueOf
或者toString
都會有語法錯誤,這里直接記住結果就行。
一般情況:
如果算術運算符兩端均為number
類型的數據,直接進行計算;
如果算術運算符兩端存在非number
的基本數據類型,則對非number
的運算數使用Number()
進行裝箱,然后對返回值進行拆箱為number
類型,參與計算;
算術運算符兩端存在引用數據類型,則先對引用類型進行拆箱操作,如果結果為非number
類型,則根據條件2
執行,否則執行條件1
。
{} == !{} // false Number({}.valueOf().toString())==> NaN , 所以題目等同于 NaN == false , NaN 和 任何類型比較都是 false[] == [] // false 內存地址不同![] == 0 // true ![]==>false , 所以題目等同于 false==0 , Number(false)==>0 , 所以結果為 true
[] == ![]
- 第一步,![] 會變成 false - 第二步,[]的valueOf是[],[]是引用類型,繼續調用toString,題目變成: "" == false - 第三步,符號兩端轉換為Number, 得到 0==0 - 所以, 答案是 true
[undefined] == false
- 第一步,[undefined]的valueOf結果為 [undefined],然后[undefined]通過toString變成 '' ,所以題目變成 '' == false - 第二步,符號兩端轉換為Number, 得到 0==0 - 所以, 答案是 true !
如何使a==1 && a==2 && a==3
的結果為 true
var a = { value: 0, valueOf: function() { this.value += 1; return this.value }};console.log(a == 1 && a == 2 && a == 3) // true
如何使a===1&&a===2&&a===3
的結果為 true
// 使用 defineProperty 進行數據劫持var value = 0;Object.defineProperty(window,"a",{ get(){ return ++value; }})console.log(a===1&&a===2&&a===3) //true
實現一個無限累加函數
柯里化實現多參累加
以上就是關于“javascript拆箱裝箱和類型轉換的方法”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。