沒有排名的網(wǎng)站怎么做營銷的四種方式
包裝對象類型
目錄
- 包裝對象類型
- 目錄
- 包裝對象的概念
- 包裝對象類型和字面量類型
- Object
- object
包裝對象的概念
JavaScript 的8種類型之中,undefined
和null
其實是兩個特殊值,object
屬于復合類型,剩下的五種屬于原始類型(primitive value),代表最基本的、不可再分的值。
- boolean
- string
- number
- bigint
- symbol
📌上面這五種原始類型的值,都有對應(yīng)的包裝對象(wrapper object)。所謂“包裝對象”,指的是這些值在需要時,會自動產(chǎn)生的對象。
// 包裝對象概念
'hello'.charAt(1) // 'e'
上面示例中,字符串hello
執(zhí)行了charAt()
方法。但是,在 JavaScript 語言中,只有對象才有方法,原始類型的值本身沒有方法。這行代碼之所以可以運行,就是因為在調(diào)用方法時,字符串會自動轉(zhuǎn)為包裝對象,charAt()
方法其實是定義在包裝對象上。
這樣的設(shè)計大大方便了字符串處理,省去了將原始類型的值手動轉(zhuǎn)成對象實例的麻煩。
五種包裝對象之中,symbol 類型和 bigint 類型無法直接獲取它們的包裝對象(即Symbol()
和BigInt()
不能作為構(gòu)造函數(shù)使用),但是剩下三種可以。
Boolean()
String()
Number()
以上三個構(gòu)造函數(shù),執(zhí)行后可以直接獲取某個原始類型值的包裝對象。
const Bakun = new String("hello");
typeof Bakun; // 'object'
Bakun.charAt(1); // 'e'
上面示例中,Bakun
就是字符串hello
的包裝對象,typeof
運算符返回object
,不是string
,但是本質(zhì)上它還是字符串,可以使用所有的字符串方法。
注意,String()
只有當作構(gòu)造函數(shù)使用時(即帶有new
命令調(diào)用),才會返回包裝對象。如果當作普通函數(shù)使用(不帶有new
命令),返回就是一個普通字符串。其他兩個構(gòu)造函數(shù)Number()
和Boolean()
也是如此。
包裝對象類型和字面量類型
由于包裝對象的存在,導致每一個原始類型的值都有包裝對象和字面量兩種情況。
'hello' // 字面量
new String('hello') // 包裝對象
為了區(qū)分這兩種情況,TypeScript 對五種原始類型分別提供了大寫和小寫兩種類型。
- Boolean 和 boolean
- String 和 string
- Number 和 number
- BigInt 和 bigint
- Symbol 和 symbol
其中,大寫類型同時包含包裝對象和字面量兩種情況,小寫類型只包含字面量,不包含包裝對象。
//ts中
const Bakun02: String = "hello"; // 正確
const Bakun03: String = new String("hello"); // 正確const Bakun04: string = "hello"; // 正確
const Bakun05: string = new String("hello"); // 報錯
建議只使用小寫類型,不使用大寫類型。因為絕大部分使用原始類型的場合,都是使用字面量,不使用包裝對象。而且,TypeScript 把很多內(nèi)置方法的參數(shù),定義成小寫類型,使用大寫類型會報錯。
const n1:number = 1;
const n2:Number = 1;Math.abs(n1) // 1
Math.abs(n2) // 報錯
Object
大寫的Object
類型代表 JavaScript 語言里面的廣義對象。所有可以轉(zhuǎn)成對象的值,都是Object
類型,這囊括了幾乎所有的值。
let obj:Object;obj = true;
obj = 'hi';
obj = 1;
obj = { foo: 123 };
obj = [1, 2];
obj = (a:number) => a + 1;
上面示例中,原始類型值、對象、數(shù)組、函數(shù)都是合法的Object類型。
事實上,除了undefined和null這兩個值不能轉(zhuǎn)為對象,其他任何值都可以賦值給Object類型。
let obj:Object;obj = undefined; // 報錯
obj = null; // 報錯
上面示例中,undefined和null賦值給Object類型,就會報錯。
另外,空對象{}是Object類型的簡寫形式,所以使用Object時常常用空對象代替。
let obj:{};obj = true;
obj = 'hi';
obj = 1;
obj = { foo: 123 };
obj = [1, 2];
obj = (a:number) => a + 1;
上面示例中,變量obj的類型是空對象{},就代表Object類型。
顯然,無所不包的Object類型既不符合直覺,也不方便使用。
object
小寫的object
類型代表 JavaScript 里面的狹義對象,即可以用字面量表示的對象,只包含對象、數(shù)組和函數(shù),不包括原始類型的值。
let obj:object;obj = { foo: 123 };
obj = [1, 2];
obj = (a:number) => a + 1;
obj = true; // 報錯
obj = 'hi'; // 報錯
obj = 1; // 報錯
上面示例中,object類型不包含原始類型值,只包含對象、數(shù)組和函數(shù)。
大多數(shù)時候,我們使用對象類型,只希望包含真正的對象,不希望包含原始類型。所以,建議總是使用小寫類型object,不使用大寫類型Object。
注意,無論是大寫的Object類型,還是小寫的object類型,都只包含 JavaScript 內(nèi)置對象原生的屬性和方法,用戶自定義的屬性和方法都不存在于這兩個類型之中。
const o1:Object = { foo: 0 };
const o2:object = { foo: 0 };o1.toString() // 正確
o1.foo // 報錯o2.toString() // 正確
o2.foo // 報錯
上面示例中,toString()是對象的原生方法,可以正確訪問。foo是自定義屬性,訪問就會報錯。
后續(xù)會和大家說怎么描述對象的自定義屬性