国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JavaScript 類型判斷及類型轉(zhuǎn)換規(guī)則

這篇具有很好參考價值的文章主要介紹了JavaScript 類型判斷及類型轉(zhuǎn)換規(guī)則。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


JavaScript 類型判斷及類型轉(zhuǎn)換規(guī)則,前端架構(gòu)師之路,javascript,開發(fā)語言,ecmascript,類型判斷,類型轉(zhuǎn)換

?創(chuàng)作者:全棧弄潮兒
?? 個人主頁: 全棧弄潮兒的個人主頁
??? 個人社區(qū),歡迎你的加入:全棧弄潮兒的個人社區(qū)
?? 專欄地址,歡迎訂閱:前端架構(gòu)師之路

JavaScript 類型及其判斷

JavaScript 具有七種內(nèi)置數(shù)據(jù)類型,它們分別是:

  • null
  • undefined
  • boolean
  • number
  • string
  • object
  • symbol

其中,前面五種為基本類型。第六種 object 類型又具體包含了 function、array、date 等。

對于這些類型的判斷,我們常用的方法有:

  • typeof
  • instanceof
  • Object.prototype.toString
  • constructor

使用 typeof 判斷類型

基本類型可以使用 typeof 來判斷:

typeof 5 // "number"
typeof 'lucas' // "string"
typeof undefined // "undefined"
typeof true // "boolean"

但是也存在著一些特例,比如用 typeof 判斷 null 時:

typeof null // "object"

我們再看使用 typeof 判斷復(fù)雜類型時的表現(xiàn):

const foo = () => 1
typeof foo // "function"

const foo = {}
typeof foo // "object"

const foo = []
typeof foo // "object"

const foo = new Date()
typeof foo // "object"

const foo = Symbol("foo") 
typeof foo // "symbol"

因此,我們可以總結(jié)出:使用 typeof 可以準(zhǔn)確判斷出除 null 以外的基本類型,以及 function 類型、symbol 類型;null 會被 typeof 判斷為 object。

使用 instanceof 判斷類型

再來看看 instanceof:

使用 a instanceof B 判斷的是:a 是否為 B 的實(shí)例,即 a 的原型鏈上是否存在 B 構(gòu)造函數(shù) 。因此如果我們使用:

function Person(name) {
    this.name = name
}
const p = new Person('lucas')

p instanceof Person
// true

這里 p 是 Person 構(gòu)造出來的實(shí)例。同時,順著 p 的原型鏈,也能找到 Object 構(gòu)造函數(shù):

p.__proto__.__proto__ === Object.prototype

因此:

p instanceof Object

// true

原型原型鏈的知識我們會在后續(xù)章節(jié)中介紹,這里只需要理解 instanceof 的判斷原理即可。另外,一個細(xì)節(jié)需要注意:

5 instanceof Number // false

返回 false,是因?yàn)?5 是基本類型,它并不是 Number 構(gòu)造函數(shù)構(gòu)造出來的實(shí)例對象,如果:

new Number(5) instanceof Number 

// true

結(jié)果返回 true。
我們使用以下代碼來模擬 instanceof 原理:

// L 表示左表達(dá)式,R 表示右表達(dá)式
const instanceofMock = (L, R) => {
    if (typeof L !== 'object') {
        return false
    }
    while (true) { 
        if (L === null) {
            // 已經(jīng)遍歷到了最頂端
            return false
        }
        if (R.prototype === L.__proto__) {
            return true
        }
        L = L.__proto__
    } 
}

L 表示左表達(dá)式,R 表示右表達(dá)式,我們可以如此使用:

instanceofMock('', String)

// false

function Person(name) {
    this.name = name
}
const p = new Person('lucas')

instanceofMock(p, Person)

// true

使用 constructor 和 Object.prototype.toString 判斷類型

使用 constructor 可以查看目標(biāo)的構(gòu)造函數(shù),這也可以進(jìn)行類型判斷,但也存在著問題,具體請看:
var foo = 5
foo.constructor
// ? Number() { [native code] }

var foo = ‘Lucas’
foo.constructor
// ? String() { [native code] }

var foo = true
foo.constructor
// ? Boolean() { [native code] }

var foo = []
foo.constructor
// ? Array() { [native code] }

var foo = {}
foo.constructor
// ? Object() { [native code] }

var foo = () => 1
foo.constructor
// ? Function() { [native code] }

var foo = new Date()
foo.constructor
// ? Date() { [native code] }

var foo = Symbol(“foo”)
foo.constructor
// ? Symbol() { [native code] }

var foo = undefined
foo.constructor
// VM257:1 Uncaught TypeError: Cannot read property ‘constructor’ of undefined
at :1:5

var foo = null
foo.constructor
// VM334:1 Uncaught TypeError: Cannot read property ‘constructor’ of null
at :1:5

我們發(fā)現(xiàn)對于 undefined 和 null,如果嘗試讀取其 constructor 屬性,將會進(jìn)行報(bào)錯。并且 constructor 返回的是構(gòu)造函數(shù)本身,一般使用它來判斷類型的情況并不多見。

使用 Object.prototype.toString 判斷類型,我們稱之為“萬能方法”,“終極方法”:
console.log(Object.prototype.toString.call(1))
// [object Number]

console.log(Object.prototype.toString.call(‘lucas’))
// [object String]

console.log(Object.prototype.toString.call(undefined))
// [object Undefined]

console.log(Object.prototype.toString.call(true))
// [object Boolean]

console.log(Object.prototype.toString.call({}))
// [object Object]

console.log(Object.prototype.toString.call([]))
// [object Array]

console.log(Object.prototype.toString.call(function(){}))
// [object Function]

console.log(Object.prototype.toString.call(null))
// [object Null]

console.log(Object.prototype.toString.call(Symbol(‘lucas’)))
// [object Symbol]

JavaScript 類型及其轉(zhuǎn)換

JavaScript 的一個顯著特點(diǎn)就是“靈活”?!办`活”的反面就是猝不及防的“坑”多,其中一個典型的例子就是被詬病的類型“隱式轉(zhuǎn)換”。

MDN 這樣介紹過 JavaScript 的特點(diǎn):JavaScript 是一種弱類型或者說動態(tài)語言。這意味著你不用提前聲明變量的類型,在程序運(yùn)行過程中,類型會被自動確定。

我們再來看一些基本例子,在使用加號進(jìn)行運(yùn)算時:

console.log(1 + '1')
// 11

console.log(1 + true)
// 2

console.log(1 + false)
// 1

console.log(1 + undefined)
// NaN

console.log('lucas' + true)
// lucastrue

我們發(fā)現(xiàn):

當(dāng)使用 + 運(yùn)算符計(jì)算 string 和其他類型相加時,都會轉(zhuǎn)換為 string 類型;其他情況,都會轉(zhuǎn)換為 number 類型,但是 undefined 會轉(zhuǎn)換為 NaN,相加結(jié)果也是 NaN
比如布爾值轉(zhuǎn)換為 number 類型:true 為 1,false 為 0,因此:

console.log(1 + true)
// 2

console.log(1 + false)
// 1

console.log(false + false)
// 0

console.log(true + true)
// 2

再看代碼:

console.log({} + true)
// [object Object]true

在 + 號兩側(cè),如果存在復(fù)雜類型,比如對象,那么這到底是怎樣的一套轉(zhuǎn)換規(guī)則呢?

當(dāng)使用 + 運(yùn)算符計(jì)算時,如果存在復(fù)雜類型,那么復(fù)雜類型將會轉(zhuǎn)換為基本類型,再進(jìn)行運(yùn)算。

這就涉及到“對象類型轉(zhuǎn)基本類型”這個過程。具體規(guī)則:對象在轉(zhuǎn)換基本類型時,會調(diào)用該對象上 valueOf 或 toString 這兩個方法,該方法的返回值是轉(zhuǎn)換為基本類型的結(jié)果

那具體調(diào)用 valueOf 還是 toString 呢?這是 ES 規(guī)范所決定的,實(shí)際上這取決于內(nèi)置的 toPrimitive 調(diào)用結(jié)果。主觀上說,這個對象傾向于轉(zhuǎn)換成什么,就會優(yōu)先調(diào)用哪個方法。如果傾向于轉(zhuǎn)換為 Number 類型,就優(yōu)先調(diào)用 valueOf;如果傾向于轉(zhuǎn)換為 String 類型,就只調(diào)用 toString。

valueOf 以及 toString 是可以被開發(fā)者重寫的。比如:

const foo = {
  toString () {
    return 'lucas'
  },
  valueOf () {
    return 1
  }
}

我們對 foo 對象的 valueOf 以及 toString 進(jìn)行了重寫,這時候調(diào)用:

alert(foo)

輸出:lucas。這里就涉及到“隱式轉(zhuǎn)換”,在調(diào)用 alert 打印輸出時,“傾向于使用 foo 對象的 toString 方法,將 foo 轉(zhuǎn)為基本類型”,得以打印出結(jié)果。
然而:

console.log(1 + foo)

輸出:2,這時候的隱式轉(zhuǎn)換“傾向于使用 foo 對象的 valueOf 方法,將 foo 轉(zhuǎn)為基本類型”,得以進(jìn)行相加。

我們再全面總結(jié)一下,對于加法操作,如果加號兩邊都是 Number 類型,其規(guī)則為:

  • 如果 + 號兩邊存在 NaN,則結(jié)果為 NaN(typeof NaN 是 ‘number’)
  • 如果是 Infinity + Infinity,結(jié)果是 Infinity
  • 如果是 -Infinity + (-Infinity),結(jié)果是 -Infinity
  • 如果是 Infinity + (-Infinity),結(jié)果是 NaN

如果加號兩邊有至少一個是字符串,其規(guī)則為:

  • 如果 + 號兩邊都是字符串,則執(zhí)行字符串拼接
  • 如果 + 號兩邊只有一個值是字符串,則將另外的值轉(zhuǎn)換為字符串,再執(zhí)行字符串拼接
  • 如果 + 號兩邊有一個是對象,則調(diào)用 valueof() 或者 toStrinig() 方法取得值,轉(zhuǎn)換為基本類型再進(jìn)行字符串拼接。

當(dāng)然也可以進(jìn)行顯式轉(zhuǎn)換,我們往往使用類似 Number、Boolean、String、parseInt 等方法,進(jìn)行顯式類型轉(zhuǎn)換。

JavaScript 函數(shù)參數(shù)傳遞

我們知道 JavaScript 當(dāng)中有“引用賦值”和“基本類型賦值”以及相關(guān)概念:“深拷貝”、“淺拷貝”區(qū)分。那么函數(shù)的參數(shù)傳遞有什么講究呢?請看例題:

let foo = 1
const bar = value => {
    value = 2
    console.log(value)
}
bar(foo)
console.log(foo) 

兩處輸出分別為 2、1;也就是說在 bar 函數(shù)中,參數(shù)為基本類型時,函數(shù)體內(nèi)復(fù)制了一份參數(shù)值,而不會影響參數(shù)實(shí)際值。

let foo = {bar: 1}
const func = obj => {
    obj.bar = 2
    console.log(obj.bar)
}
func(foo)
console.log(foo)

兩處輸出分別為 2、{bar: 2};也就是說如果函數(shù)參數(shù)是一個引用類型,當(dāng)在函數(shù)體內(nèi)修改這個引用類型參數(shù)的某個屬性值時,將會對參數(shù)進(jìn)行修改。因?yàn)檫@時候函數(shù)體內(nèi)的引用地址指向了原來的參數(shù)。

但是如果在函數(shù)體內(nèi),直接修改了對參數(shù)的引用,則情況又不一樣:

let foo = {bar: 1}
const func = obj => {
    obj = 2
    console.log(obj)
}
func(foo)
console.log(foo)

兩處輸出分別為 2、{bar: 1};這樣的情況理解起來較為晦澀,其實(shí)總結(jié)下來就是:

  • 參數(shù)為基本類型時,函數(shù)體內(nèi)復(fù)制了一份參數(shù)值,對于任何操作不會影響參數(shù)實(shí)際值
  • 函數(shù)參數(shù)是一個引用類型時,當(dāng)在函數(shù)體內(nèi)修改這個值的某個屬性值時,將會對參數(shù)進(jìn)行修改
  • 函數(shù)參數(shù)是一個引用類型時,如果我們直接修改了這個值的引用地址,則相當(dāng)于函數(shù)體內(nèi)新創(chuàng)建了一份引用,對于任何操作不會影響原參數(shù)實(shí)際值

cannot read property of undefined 問題解決方案

這里我們分析一個常見的 JavaScript 細(xì)節(jié):cannot read property of undefined 是一個常見的錯誤,如果意外的得到了一個空對象或者空值,這樣惱人的問題在所難免。

考慮這樣的一個數(shù)據(jù)結(jié)構(gòu):

const obj = {
    user: {
        posts: [
            { title: 'Foo', comments: [ 'Good one!', 'Interesting...' ] },
            { title: 'Bar', comments: [ 'Ok' ] },
            { title: 'Baz', comments: []}
        ],
        comments: []
    }
}

為了在對象中相關(guān)取值的過程,需要驗(yàn)證對象每一個 key 的存在性。常見的處理方案有:

  • && 短路運(yùn)算符進(jìn)行可訪問性嗅探
obj.user &&
obj.user.posts &&
obj.user.posts[0] &&
obj.user.posts[0].comments
  • || 單元設(shè)置默認(rèn)保底值
(((obj.user || {}).posts||{})[0]||{}).comments 
  • try…catch
var result
try {
    result = obj.user.posts[0].comments
}
catch {
    result = null
}

最后,TC39 提案中有一個新的提案,支持:
console.log(obj?.user?.posts[0]?.comments)

由此可見,JavaScript 語言也在不斷演進(jìn)。通過這個案例,想告訴大家:熟練掌握基礎(chǔ)環(huán)節(jié),將對于進(jìn)階起到關(guān)鍵作用。

分析一道網(wǎng)紅題目

綜合以上知識點(diǎn),我們來看一道“網(wǎng)紅”題目:
Can (a == 1 && a == 2 && a == 3) ever evaluate to true?
即:
a == 1 && a == 2 && a == 3 可能為 true 嗎?
直觀上分析,如果變量 a 是一個基本 Number 類型,這是不可能為 true 的,因此解題思路也需要從變量 a 的類型及(對象)轉(zhuǎn)換(基本類型)上來考慮。

方案一:

const a = {
    value: 1,
    toString: function () {
        return a.value++
    }
}
console.log(a == 1 && a == 2 && a == 3) // true

這個方案中,我們將 a 定義為一個對象,并重寫了其 toString 方法。因此在每次進(jìn)行判斷時,按照規(guī)則,== 號兩邊出現(xiàn)了對象類型,另一邊是 Number 類型,需要調(diào)用 a 對象 toString 方法,toString 方法的返回值會作為對象轉(zhuǎn)為基本類型的值,我們每次將 value 屬性加 1。同樣,如果按照相同的方式重寫 valueOf 方法,也是可以達(dá)到同樣目的的。

方案二:

let value = 0
Object.defineProperty(window, 'a', {
    get: function() {
        return ++value
    }
})

console.log(a == 1 && a == 2 && a == 3) // true

這里我們將 a 作為屬性,掛載在 window 對象當(dāng)中,重寫其 getter 方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-803762.html

JavaScript 類型判斷總結(jié)

  • 通過 x === null 來判斷 null 類型
  • 對于 typeof x 不為 object 的情況,直接返回 typeof x 結(jié)果,這時候可以判斷出 number,string,boolean,undefined,symbol 類型
  • Object.prototype.toString 方法,該方法確實(shí)可以稱得上“終極方案”。對返回結(jié)果使用 .slice(8, -1),更加方便拿到結(jié)果:
Object.prototype.toString.call(true).slice(8, -1)
// "Boolean"

到了這里,關(guān)于JavaScript 類型判斷及類型轉(zhuǎn)換規(guī)則的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【JAVA】數(shù)據(jù)類型,類型轉(zhuǎn)換與提升,運(yùn)算符,標(biāo)識符命名規(guī)則

    【JAVA】數(shù)據(jù)類型,類型轉(zhuǎn)換與提升,運(yùn)算符,標(biāo)識符命名規(guī)則

    ??內(nèi)容專 欄:【JAVA從0到入門】 ??本文脈絡(luò):數(shù)據(jù)類型,類型轉(zhuǎn)換與提升,運(yùn)算符,標(biāo)識符命名規(guī)則 ??本文作者:Melon_西西 ??發(fā)布時間 :2023.7.12 目錄 ?1. 字面常量 2. 數(shù)據(jù)類型:四類八種 ?3.類型轉(zhuǎn)換 3.1 自動類型轉(zhuǎn)換(隱式) 自動類型轉(zhuǎn)換: 3.2 強(qiáng)制類型轉(zhuǎn)換(顯式) 強(qiáng)制類

    2024年02月15日
    瀏覽(24)
  • 『C語言初階』第八章 -隱式類型轉(zhuǎn)換規(guī)則

    『C語言初階』第八章 -隱式類型轉(zhuǎn)換規(guī)則

    ?? 博客主頁 : 小羊失眠啦. ?? 系列專欄 : C語言 ??? 每日語錄 : 但行前路,不負(fù)韶華! ?? 感謝大家點(diǎn)贊??收藏?評論?? 今天小羊又來給鐵汁們分享關(guān)于C語言的 隱式類型轉(zhuǎn)換規(guī)則 ,在C語言中類型轉(zhuǎn)換方式可分為 隱式類型轉(zhuǎn)換 和 顯式類型轉(zhuǎn)換 (強(qiáng)制類型轉(zhuǎn)換),

    2024年02月13日
    瀏覽(19)
  • Java對象類型的轉(zhuǎn)換+instanceOf判斷對象類型

    將子類的實(shí)例對象定義為父類類型,這種稱為 向上轉(zhuǎn)型 ;將父類的實(shí)例對象定義為子類類型,這種稱為 向下轉(zhuǎn)型 ,向下轉(zhuǎn)型必須使用 顯示轉(zhuǎn)換 ,否則編譯器會報(bào)錯。 ? ? ? ? ? instanceof操作符,可以用來判斷是否一個類實(shí)現(xiàn)了某個接口,也可以用來判斷一個實(shí)例對象是否

    2024年02月08日
    瀏覽(30)
  • 【C語言】你不知道的隱式類型轉(zhuǎn)換規(guī)則

    ??個人主頁:庫庫的里昂 ??CSDN新晉作者 ??歡迎 ??點(diǎn)贊?評論?收藏 ?系列專欄C語言初階、代碼小游戲 ??希望作者的文章能對你有所幫助,有不足的地方請?jiān)谠u論區(qū)留言指正,大家一起學(xué)習(xí)交流!?? 【前言】 本文接著C語言中的操作符(萬字詳解)講解隱式類型轉(zhuǎn)換規(guī)

    2024年02月14日
    瀏覽(23)
  • JavaScript 數(shù)據(jù)類型轉(zhuǎn)換

    JavaScript 數(shù)據(jù)類型轉(zhuǎn)換

    目錄 JavaScript 數(shù)據(jù)類型轉(zhuǎn)換 一、類型轉(zhuǎn)換簡介 1、字符串型轉(zhuǎn)換為數(shù)值型 2、數(shù)值型轉(zhuǎn)換為字符串型 ? 所謂的類型轉(zhuǎn)換,就是將一種數(shù)據(jù)類型轉(zhuǎn)換為另外一種數(shù)據(jù)類型,例如上一節(jié)課說到的,如果一個數(shù)字與一個字符串相加,JavaScript會自動將數(shù)字轉(zhuǎn)換為字符串,然后再與另外

    2024年02月05日
    瀏覽(15)
  • JavaScript數(shù)據(jù)類型的轉(zhuǎn)換

    JavaScript數(shù)據(jù)類型的轉(zhuǎn)換

    一、字符串類型的轉(zhuǎn)換 1、自動轉(zhuǎn)換 2、強(qiáng)制轉(zhuǎn)換 String(),object.toString() object 意思為對象,一切皆為對象,所以查詢date是否被強(qiáng)制轉(zhuǎn)為字符串類型的時候,object.toString()中的object換為date 二、轉(zhuǎn)為Number類型 1、自動轉(zhuǎn)換 2、強(qiáng)制轉(zhuǎn)換 ??Number() 按照自動轉(zhuǎn)換規(guī)則轉(zhuǎn)換 ??p

    2024年02月08日
    瀏覽(17)
  • 【C++航海王:追尋羅杰的編程之路】C++的類型轉(zhuǎn)換

    【C++航海王:追尋羅杰的編程之路】C++的類型轉(zhuǎn)換

    目錄 1 - C語言中的類型轉(zhuǎn)換 2 - 為什么C++需要四種類型轉(zhuǎn)換 3 - C++強(qiáng)制類型轉(zhuǎn)換 3.1 - static_cast 3.2 -?reinterpret_cast 3.3 -?const_cast 3.4 -?dynamic_cast 4 - RTTI 在C語言中,如果 賦值運(yùn)算符左右兩側(cè)類型不同,或者形參與實(shí)參類型不匹配,或者返回值類型與接收返回值類型不一致時,就需

    2024年04月13日
    瀏覽(23)
  • javascript基礎(chǔ)三:談?wù)?JavaScript 中的類型轉(zhuǎn)換機(jī)制

    javascript基礎(chǔ)三:談?wù)?JavaScript 中的類型轉(zhuǎn)換機(jī)制

    一、概述 JS中有六種簡單數(shù)據(jù)類型:undefined、null、boolean、string、number、symbol,以及引用類型:object 但是我們在聲明的時候只有一種數(shù)據(jù)類型,只有到運(yùn)行期間才會確定當(dāng)前類型 上面代碼中,name的值在編譯階段是無法獲取的,只有等到程序運(yùn)行時才能知道 雖然變量的數(shù)據(jù)類

    2024年02月05日
    瀏覽(27)
  • [架構(gòu)之路-203] - 對系統(tǒng)需求類型的進(jìn)一步澄清

    [架構(gòu)之路-203] - 對系統(tǒng)需求類型的進(jìn)一步澄清

    目錄 業(yè)務(wù)/商業(yè)需求: 用戶/客戶需求: 功能性需求: 非功能性需求: 系統(tǒng)需求: 約束條件: 軟件需求說明書: 軟件質(zhì)量: 是自頂向下的需求,往往來自于中高層管理人員(或監(jiān)管、政策要求),基于業(yè)務(wù)運(yùn)營管理的直接訴求和要求。需要使用商業(yè)/工作語言描述業(yè)務(wù)/商業(yè)

    2024年02月07日
    瀏覽(30)
  • JavaScript基礎(chǔ):js介紹、變量、數(shù)據(jù)類型以及類型轉(zhuǎn)換

    JavaScript基礎(chǔ):js介紹、變量、數(shù)據(jù)類型以及類型轉(zhuǎn)換

    ? 目錄 介紹 引入方式 內(nèi)部方式 外部形式 注釋和結(jié)束符 單行注釋 多行注釋 結(jié)束符 輸入和輸出 輸出 輸入 變量 聲明 賦值 變量名命名規(guī)則 常量 數(shù)據(jù)類型 數(shù)值類型 字符串類型 布爾類型 undefined 類型轉(zhuǎn)換 隱式轉(zhuǎn)換 顯式轉(zhuǎn)換 Number ??引入方式 JavaScript 程序不能獨(dú)立運(yùn)行

    2024年04月27日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包