3 資料型別
3.1 簡介
? ? JavaScript中的每個值都是屬于一種特定的資料型別,JavaScript中一共有以下幾種資料型別,詳細如下所示:
- 原始型別:Undefined、Null、Boolean、Number、String 和Symbol
- 物件:Object
通常將數值、字串和布林值三種型別,稱之為基本的資料型別,物件型別稱之為合成型別(因為一個物件往往是多個基本型別值的合成,可以看作是一個存放各種值的容器),而Undefined和Null一般看作是兩個特殊值,
3.2 typeof 運算子
? ? 因為JavaScript的型別系統是松散的,所以需要一種手段來確定任意變數的資料型別,這時可以使用typeof,對一個值使用typeof運算子可以回傳以下值
- undefined 表示值未定義
- boolean 表示值為布林值
- string 表示值為字串
- number 表示值為數值
- object 表示值為物件(不是函式)或null
- function 表示值為函式
- symbol 表示值為符號
? ? JavaScript有三種方法,可以確定一個值是屬于什么型別,如下所示:
- typeof 運算子
- instanceof 運算子
- Object.prototype.toString 方法
? 這里先介紹常用的typeof方法,示例如下所示:
> typeof 123
"number"
> typeof true
"boolean"
> typeof "1234"
"string"
> typeof function f(){}
"function"
> typeof undefined
"undefined"
> typeof null
"object"
> typeof {}
"object"
> typeof []
"object"
基于typeof這個特性,我們可以用來檢查一個沒有宣告的變數而不報錯,如下所示:
> test
VM344:1 Uncaught ReferenceError: test is not defined
at <anonymous>:1:1
(anonymous) @ VM344:1
> typeof test
"undefined"
在實際編程中,可以利用typeof這一點進行判斷,如下所示:
if (test){
// do something
}
if (typeof test === "undefined"){
// do something
}
3.3 數值型別
3.3.1 整數和浮點數
? ? 在JavaScript中,所的數字都是64位浮點數形式進行存盤,即使整數也是如此,示例如下所示:
> 1.00000 === 1.0
true
> 1 === 1.0
true
JavaScript 語言的底層根本沒有整數,所有數字都是浮點型別,而在某些情況下,只有整數才能完成,此時JavaScript會自動把64位的浮點數轉換成32位整數,再進行運算,如位運算,
? ? 由于浮點數不是精確的值,所以在涉及到小數的比較和運算是要特別小心,示例如下所示:
> 0.1+0.2 === 0.3
false
> 0.3/0.1
2.9999999999999996
> (0.5-0.3) === (0.3-0.1)
false
3.3.2 數值精度
? ? 根據國際標準IEEE 754,JavaScript浮點數的64個二進制位,最左邊到右邊的表示方式如下所示:
- 第1位:符號位,0表示正數,1表示負數
- 第2~12位:指數部分,共11位
- 第13~64位:小數部分,共52位
符號位決定一個數的正負,而指數決定了數值的大小,小數部分決定了數值的精度,
3.3.3 數值范圍
? ? 根據標準,64位浮點數的指數部分長度是11個二進制位,則指數的范圍為0~2047,分出一半負數,則JavaScript能夠表示的數值范圍為2-1023 (開區間) - 21024,超出這個范圍則無法表示,
如果一個數大于等于 $ 2 ^{1024} $ ,那么則會發生正向溢位,此時會回傳Infinity
> Math.pow(2,1025)
Infinity
如果一個數小于 $ 2^{1024} $ ,則會發生負向溢位,此時會回傳0
> Math.pow(2,-1080)
0
? ? 實際的示例代碼如下所示:
var a=2;
for (var i=0;i<100;i++){
a = a * a
}
Infinity // 輸出結果
var b=0.2;
for (var i=0;i<100;i++){
b = b * b
}
0 // 輸出結果
在JavaScript中提供獲取數值物件的最大和最小值屬性,可以回傳表示的具體的最大值和最小值,如下所示:
> Number.MAX_VALUE
1.7976931348623157e+308
> Number.MIN_VALUE
5e-324
3.3.4 數值表示方法
? ? JavaScript中的數值有多種表示方法,可以用字面形式直接表示,如10(十進制)和0xA2(十六進制),數值也可以用科學計數方式表示,示例如下所示:
> 123e5
12300000
> 123e-2
1.23
> -4.5e5
-450000
> .02e5
2000
> 2e-2
0.02
在科學計數方式中,e可以大寫也可以小寫
? ? 以JavaScript中,在以下兩種情況下,會自動將數值轉換為科學計數方式表示,其他情況則采用字面形式直接表示
- 1.小數點前的位數多于21位
> 123456789012345678901234567890
1.2345678901234568e+29
- 2.小數點后的零多于5個
> 0.000000123
1.23e-7
3.3.5 數值的進制
? ? 使用字面量直接表示一個數值時,JavaScript對整數提供4種進制的表示方法:二進制、八進制、十進制和十六進制,
- 二進制:使用前綴0b或0B表示
- 八進制:使用前緣0o或0O表示,或都僅有0,且只用了0~7的8個數字
- 十進制:沒有前綴
- 十六進制:使用前綴0x或0X表示
默認情況下,JavaScript內部會自動將二進制、八進制、十六進制轉換為十進制,示例如下所示:
> 0b111
7
> 0o76
62
> 0xAF
175
> 098 // 注意與 8 進制的區別
98
3.3.6 特殊數值
3.3.6.1 正零和負零
? ? 在JavaScript中,最左邊的一位表示符號位,則意味著任何一個數都對應著一個負值,而0也不例外,在JavaScript中,實際上存在2個0,一個是+0和一個-0,區別就是64位浮點數表示法的符號位不同,但卻是等價的,需要注意的事項如下所示
- 大多數情況下,正零和負零都會被當作正常的0
- 在+0和-0當作分母時,回傳的值是不相等的
示例如下所示:
> 0 === +0
true
> 0 == -0
true
> -0 === +0
true
> (+0).toString()
"0"
> (-0).toString()
"0"
> (1/+0) === (1/-0) //(1/+0)=+Infinity, (1/-0)=-Infinity,所以導致兩者不相等
false
3.3.6.2 NaN
? ? NaN是JavaScript的特殊值,表示非數字(Not a number),一般常出現在將字串決議成數字出錯的情況中或一些數學函式的運算結果中,示例如下所示:
> 1-"a"
NaN
> Math.log(-10)
NaN
> 0/0
NaN
- NaN不是獨立的資料型別,而是一個特殊的數值,它的資料型別依然屬于Number,可以使用typeof運算子進行查看,
> typeof(NaN)
"number"
- NaN不等于任何值,包括其本身
> NaN === NaN
false
- NaN在布爾運算中被當作false
> Boolean(NaN)
false
- NaN與任何數(含自身)之間進行運算,得到的都是NaN
> NaN + NaN
NaN
> NaN -32
NaN
> NaN *32
NaN
> NaN+32
NaN
3.3.6.3 Infinity
? ? Infinity表示無窮,用來表示兩種場景,一種是一個正的數值太大,或一個負的數值太小,無法表示;另一種是非0數值除以0,得到Infinity
> Math.pow(2,2048)
Infinity
> 28/0
Infinity
? ? nfinity有正負之分,Infinity表示正的無窮,-Infinity表示負的無窮,
> 1/-0
-Infinity
> -1/-0
Infinity
3.4 字串型別
? ? String資料型別表示零或多個字符序列,字串可以使用雙引號(")、單引號(')或反引號(`)表示,示例如下所示:
let firstName="Surpas";
let lastName='Lee';
let nickName=`Kevin`;
1.三種引號表示字串沒有任何區別
2.以某種引號作為字串開頭,必須仍然以該種引號作為字串結尾
- 1. 字符字面量
? ? 字串資料型別包含一些字符字面量,用于表示非列印字符或有其他用途的字符,如下所示:
| 字面量 | 含義 |
|---|---|
| \n | 換行符 |
| \t | 制表符 |
| \b | 退格 |
| \ | 反斜杠(\) |
| ' | 單引號(') |
| " | 雙引號(") |
| ` | 反引號(`) |
- 2. 字串的特點
? ? 字串是不可變的,意思是一旦創建,它們的值就不能變了,要修改某個變數中的字串值,必須先銷毀原始的字串,然后將包含新值的另一個字串保存到該變數,
- 3.轉換為字串
? ? 有兩種方式可以把一個值轉換為字串,
- 可以使用幾乎所有值都有的 toString() 方法,該方法可以回傳當前值的字串等價物,
let age=28
let ageStr=age.toString()
let flag=true
let flagStr=flag.toString()
console.log(typeof(age),typeof(ageStr),typeof(flag),typeof(flagStr)) // number string boolean string
toString()方法可見于數值、布林值、物件和字串值,null 和undefined 值沒有toString()方法
? ? 多數情況下,toString()不接收任何引數,不過在對數值呼叫該方法時,toString()可以接收一個底數引數,即以底數形式輸出數值的字串表示,默認情況下,toString()回傳數值的十進制字串表示,而通過傳入引數,可以得到數值的二進制、八進制、十六進制,或者其他任何有效基數的字串表示
let age=28
console.log(age.toString()) // "28"
console.log(age.toString(2)) // "11100"
console.log(age.toString(8)) // "34"
console.log(age.toString(10)) // "28"
console.log(age.toString(16)) // "1c"
- 如果在不確定一個值是不是null或undefined,可以使用String()轉型函式,它始侄訓回傳表示相應型別值的字串,String()函式遵循如下規則
-
- 如果值有toString()方法,則呼叫該方法(不傳引數)并回傳結果,
-
- 如果值是null,回傳"null",
-
- 如果值是undefined,回傳"undefined"
let age=28;
let flag=true;
let person=null;
let name=undefined;
console.log(typeof(String(age)),String(age)); // string "28"
console.log(typeof(String(flag)),String(flag)); // string "true"
console.log(typeof(String(person)),String(person)); // string "null"
console.log(typeof(String(name)),String(name)); // string "undefined"
- 4.模板字面量
? ? ECMAScript 6 新增了使用模板字面量定義字串的能力,與使用單引號或雙引號不同,模板字面量
保留換行字符,可以跨行定義字串,
let mulStr01="Hello Surpass\n Welcome to Shanghai";
let mulStr02=`Hello Surpass
Welcome to Shanghai`;
console.log(mulStr01)
console.log(mulStr02)
? ? 輸出結果如下所示:
mulStr01 is: Hello Surpass
Welcome to Shanghai
mulStr02 is: Hello Surpass
Welcome to Shanghai
模板字面量在定義模板時特別有用,比如下面這個HTML模板:
let pageHTMLTemplate=`
<div>
<a href="https://www.cnblogs.com/surpassme/archive/2022/08/18/#"/>
<span>Surpass</span>
</div>
`;
? ? 由于模板字面量會保持反引號內部的空格,因此在使用時要格外注意,示例如下所示:
let tempStr01=`Hello Surpass
Welcome to Shanghai`;
let tempStr02="Hello Surpass\nWelcome to Shanghai"
console.log("tempStr01 length is:",tempStr01.length)
console.log("tempStr01 content is:",tempStr01)
console.log("tempStr02 length is:",tempStr02.length)
console.log("tempStr02 content is:",tempStr02)
? ? 輸出結果如下所示:
tempStr01 length is: 46
tempStr01 content is: Hello Surpass
Welcome to Shanghai
tempStr02 length is: 33
tempStr02 content is: Hello Surpass
Welcome to Shanghai
- 5.字串插值
? ? 模板字面量中最常用的一個特性是支持字串插值,也就是可以在一個連續定義中插入一個或多個值,技術上講,模板字面量不是字串,而是一種特殊的JavaScript句法運算式,只不過求值后得到的是字串,
字串插值通過在 ${} 中使用一個JavaScript運算式實作,
所有插入的值都會使用toString()強制轉型為字串,而且任何JavaScript運算式都可以用于插值
在插值運算式中可以呼叫函式和方法
模板也可以插入自己之前的值
let person="Surpass";
let age=28
// 以前最常用的字串插值
let personInfoOld="Name is "+ person + " age is " + age;
// 現在可以采用的方式
let personInfoNew=`Name is ${person} age is ${age}`;
// 插值中呼叫函式和方法
function convertToUpper(word){
return word.toUpperCase()
}
result=`${convertToUpper("surpass")}`
console.log("old output is: ",personInfoOld);
console.log("new output is: ",personInfoNew);
console.log("after word convert to upper is ",result)
let str="";
function append(){
str=`${str}surpass`;
console.log("str is: ",str);
}
for(let i=0;i<3;i++){
append()
}
? ? 輸出結果如下所示:
old output is: Name is Surpass age is 28
new output is: Name is Surpass age is 28
after word convert to upper is SURPASS
str is: surpass
str is: surpasssurpass
str is: surpasssurpasssurpass
3.5 布爾型別
? ? Boolean型別使用最多的型別之一,有兩個字面值:true和false
-
1.true和false不同于數值,因此true!=1,false!=0
-
2.true和false是區分大小寫
-
3.要將其他型別的值轉換為布林值,可以使用Boolean()函式
| 資料型別 | 轉換為true值 | 轉換為false值 |
|---|---|---|
| Boolean | true | false |
| String | 非空字串 | 空字串 |
| Number | 非零數值(包括無窮值) | 0、NaN |
| Object | 任意物件 | null |
| Undefined | N/A(不存在) | undefined |
? ? 示例如下所示:
let str="Hello,Surpass";
if (str) {
console.log("str value is true");
}
else{
console.log("str value is false");
}
// 輸出結果
// str value is true
3.6 陣列型別
? ? 陣列(array)是按順序排列的一組值,每個值的位置都有編號(從0開始),整個陣列用方括號表示,
3.6.1 陣列定義
- 方法一:定義即賦值
var sampleArray=[1,2,3,4]
- 方法二:先定義再賦值
var sampleArray=[];
sampleArray[0]=1;
sampleArray[1]=2;
sampleArray[2]=3;
sampleArray[3]=4;
? ? 任何型別的資料都可以放入陣列中,如下所示:
var sampleArray=[
{"name":"Surpass"},
28,
function(){ return true;},
["a","b"]
];
3.6.2 陣列本質
? ? 本質上,陣列屬于一種特殊的物件,typeof運算子會回傳陣列的型別是object,其特殊特性體現在,其鍵名是按順序排列的一個組整數,如下所示:
let sampleArray=["a","b","c","d"];
console.log("sampleArray type is:"+typeof(sampleArray)+" sampleArray key is:"+Object.keys(sampleArray))
// 輸出結果:sampleArray type is:object sampleArray key is:0,1,2,3
由于陣列成員的鍵名是固定的(默認總是0、1、2...),因此陣列不用為每個元素指定鍵名,JavaScript規定,物件的鍵名一律為字串,所以,陣列的鍵名其實也是字串,之所以可以用數值讀取,是因為非字串的鍵名會被轉為字串,
let sampleArray=["a","b","c","d"];
console.log("sampleArray first element is:",sampleArray[0])
console.log("sampleArray first element is:",sampleArray["0"])
console.log("sampleArray second element is:",sampleArray[1.0000])
輸出結果如下所示:
sampleArray first element is: a
sampleArray first element is: a
sampleArray second element is: b
3.6.3 常用方法
3.6.3.1 length
? ? 回傳陣列成員數量,示例如下所示:
let sampleArray=["a","b","c","d"];
console.log("sampleArray length is:",sampleArray.length)
console.log("temp array length is:",[1,2,3].length)
輸出結果如下所示:
sampleArray length is: 4
temp array length is: 3
? ? 只要是陣列,就一定有length屬性,該屬性是一個動態的值,length屬性是可寫的,其特性如下所示:
- 如果人為設定一個小于當前成員個數的值,該陣列的成員數量會自動減少到length設定的值
- 如果人為設定length大于當前元素個數,則陣列的成員數量會增加到這個值,新增的位置都是空位
- 如果人為設定length為不合法的值,則會報錯
let sampleArray=["a","b","c","d"];
sampleArray.length=2;
console.log("reduce sampleArray length is:",sampleArray);
sampleArray.length=8;
console.log("add sampleArray length is:",sampleArray);
sampleArray.length="Surpass";
輸出結果如下所示:
reduce sampleArray length is: [ 'a', 'b' ]
add sampleArray length is: [ 'a', 'b', <6 empty items> ]
C:\Users\Surpass\Documents\VSCodeProjects\JavaScriptDemo\sample.js:144
sampleArray.length="Surpass"
^
RangeError: Invalid array length
at Object.<anonymous> (C:\Users\Surpass\Documents\VSCodeProjects\JavaScriptDemo\sample.js:144:19)
at Module._compile (node:internal/modules/cjs/loader:1099:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:975:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
at node:internal/main/run_main_module:17:47
Node.js v17.8.0
通過這個特性,可以利用length=0來達到清空陣列
let sampleArray=["a","b","c","d"];
sampleArray.length=0;
console.log("sampleArray is:",sampleArray); // sampleArray is: []
3.6.3.2 遍歷陣列
? ? 陣列遍歷的方法主要有以下幾種:
- 1.for回圈
let sampleArray=["a","b","c","d"];
for(let i=0;i<sampleArray.length;i++){
console.log("sample element is:",sampleArray[i])
}
// 或
let sampleArray=["a","b","c","d"];
for(var i in sampleArray){
console.log("sampleArray element is:",sampleArray[i])
}
- 2.while 回圈
let sampleArray=["a","b","c","d"];
let index=0;
while(index<sampleArray.length){
console.log("sampleArray element is:",sampleArray[index]);
index++
}
//或
let sampleArray=["a","b","c","d"];
let index=sampleArray.length;
while(index--){
console.log("sampleArray element is:",sampleArray[index]);
}
- 3.forEach回圈
let sampleArray=["a","b","c","d"];
sampleArray.forEach(function (ele){
console.log("sampleArray element is:",ele)
})
3.6.3.3 push/unshift
- push:將新元素添加到陣列的末尾,并回傳新的長度,
- unshift:方法將新項添加到陣列的開頭,并回傳新的長度,
let sampleArray=["a","b","c","d"];
let pushSampleArrayLength=sampleArray.push("tail");
console.log("push method:new sampleArray element is: "+sampleArray+" new sampleArray length is: "+pushSampleArrayLength);
let unshiftSampleArrayLength=sampleArray.unshift("head");
console.log("unshift method:new sampleArray element is: "+sampleArray+" new sampleArray length is: "+unshiftSampleArrayLength);
輸出結果如下所示:
push method:new sampleArray element is: a,b,c,d,tail new sampleArray length is: 5
unshift method:new sampleArray element is: head,a,b,c,d,tail new sampleArray length is: 6
3.6.3.4 pop/shift
- pop:洗掉陣列的最后一個元素,并回傳其洗掉的值
- shift:洗掉陣列中的第一個元素,并回傳其洗掉的值
let sampleArray=["a","b","c","d"];
let shiftElement=sampleArray.shift();
console.log("delete first element :"+shiftElement+" sampleArray is:"+sampleArray);
let popElement=sampleArray.pop();
console.log("delete last element is:"+popElement+" sampleArray is:"+sampleArray);
輸出結果如下所示:
delete first element :a sampleArray is:b,c,d
delete last element is:d sampleArray is:b,c
3.6.3.5 slice
? ? 回傳陣列中被選中的元素
let sampleArray=["a","b","c","d"];
console.log("new samplArray is:",sampleArray.slice(1,3)); // new samplArray is: [ 'b', 'c' ]
3.7 物件型別
? ? 物件型別簡單來說就是一組鍵值對(key-value)的集合,是一種無序的復合資料集合,
3.7.1 定義物件
- 方法一:
let personInfo={
name:"Surpass",
age:28,
location:"Shanghai"
};
// 或
let personInfo={
"name":"Surpass",
"age":28,
"location":"Shanghai"
};
- 方法二:
let personInfo={};
personInfo.name="Surpass";
personInfo.age=28;
personInfo.location="Shanghai"
3.7.2 常用方法
3.7.2.1 鍵值讀取/賦值
- 1.讀取鍵,示例代碼如下所示:
let personInfo={
"name":"Surpass",
"age":28,
"location":"Shanghai"
};
console.log("person info is:",Object.keys(personInfo))
// person info is: [ 'name', 'age', 'location' ]
- 2.值讀取和賦值都可以使用以下兩種方法
- 使用點運算子
- 使用[]運算子
let personInfo={
"name":"Surpass",
"age":28,
"location":"Shanghai"
};
// 方法一:讀值
console.log("person name is:",personInfo.name); // person name is: Surpass
// 方法二:讀值
console.log("person age is:",personInfo["age"]); // person age is: 28
// 方法一:賦值
personInfo.name="Kevin";
// 方法二:賦值
personInfo["location"]="Wuhan";
console.log("person info is:",personInfo) //person info is: { name: 'Kevin', age: 28, location: 'Wuhan' }
3.7.2.2 鍵值洗掉/增加
- 增加:可使用點運算子或[]增加即可
- 洗掉:使用delete
let personInfo={
"name":"Surpass",
"age":28,
"location":"Shanghai"
};
personInfo.from="Wuhan";
personInfo["to"]="Nanjing"
console.log("person info is:",personInfo); // person info is: {name: 'Surpass', age: 28, location: 'Shanghai', from: 'Wuhan', to: 'Nanjing'}
delete personInfo.to;
console.log("person info is:",personInfo); // person info is: {name: 'Surpass', age: 28, location: 'Shanghai', from: 'Wuhan'}
3.7.2.3 in
? ? in 用于檢查鍵是否存在于某一物件中
let personInfo={
"name":"Surpass",
"age":28,
"location":"Shanghai"
};
let nameExist="name" in personInfo;
let fromExist="from" in personInfo;
let toStringExist="toString" in personInfo;
console.log("person info is:",nameExist); // true
console.log("person info is:",fromExist); // false
console.log("person info is:",toStringExist); // true
in運算子存在一個問題,其不能識別哪些屬性是物件自身的,哪些屬性是繼承的,就像上面代碼中,物件personInfo本身并沒有toString屬性,但是in運算子會回傳true,因為這個屬性是繼承的,針對這種情況,可以使用物件的hasOwnProperty方法判斷一下,是否為物件自身的屬性,
let personInfo={
"name":"Surpass",
"age":28,
"location":"Shanghai"
};
var property="toString"
if (property in personInfo){
if (personInfo.hasOwnProperty(property)){
console.log("toString is personInfo owner property");
}
else{
console.log("toString is not personInfo owner property");
}
}
// toString is not personInfo owner property
3.7.2.4 遍歷
? ? 遍歷物件,一般常用for ... in,如下所示:
let personInfo={
"name":"Surpass",
"age":28,
"location":"Shanghai"
};
for(var item in personInfo){
console.log("key is:"+item+" value is:"+personInfo[item])
}
輸出結果如下所示:
key is:name value is:Surpass
key is:age value is:28
key is:location value is:Shanghai
3.7.2.5 with陳述句
? ? with作用是操作同一個物件的多個屬性,提供一些書寫的方便,其基本語法格式如下所示:
with(物件){
陳述句;
}
? ? 示例代碼如下所示:
let personInfo={
"name":"Surpass",
"age":28,
"location":"Shanghai"
};
with(personInfo){
name="Kevin";
location="Wuhan"
}
console.log("personInfo is",personInfo) // personInfo is { name: 'Kevin', age: 28, location: 'Wuhan' }
? ? 以上代碼等同于以下代碼:
let personInfo={
"name":"Surpass",
"age":28,
"location":"Shanghai"
};
personInfo.name="Kevin";
personInfo.location="Wuhan";
console.log("personInfo is",personInfo); // personInfo is { name: 'Kevin', age: 28, location: 'Wuhan' }
注意事項:with區塊內的賦值操作,必須是當前物件已經存在的屬性,否則會創造一個當前作用域的全域變數
let personInfo={
"name":"Surpass",
"age":28,
"location":"Shanghai"
};
with (personInfo){
name="Kevin";
from="Wuhan";
to="Nanjing";
}
console.log("personInfo is",personInfo); // personInfo is { name: 'Kevin', age: 28, location: 'Shanghai' }
console.log("from value is:",from,"to value is:",to); // from value is: Wuhan to value is: Nanjing
3.8 Undefined 型別
? ? Undefined型別只有一個值,特殊值undefined,當使用var或let宣告了變數但沒有初始化時,就相當于給變數賦予了undefined值:
var age;
console.log(age==undefined) // true
在對未初始化的變數呼叫typeof時,回傳的結果是undefined,但對未宣告的變數呼叫它時,回傳的結果還是undefined
undefined是一個假值
3.9 Null型別
? ? Null型別同樣只有一個值,特殊值null,邏輯上講,null值表示一個空物件指標,這也是給typeof null會回傳object的原因,
? ? 在定義將來要保存物件值的變數時,建議使用null來初始化,不要使用其他值,這樣,只要檢查這個變數的值是不是null就可以知道這個變數是否在后來被重新賦予了一個物件的參考,示例如下所示:
let person=null
if (person != null) {
console.log("person 已經申明");
}
else{
console.log("person 未申明");
}
null是一個假值
原文地址:https://www.jianshu.com/p/c9061b035596
本文同步在微信訂閱號上發布,如各位小伙伴們喜歡我的文章,也可以關注我的微信訂閱號:woaitest,或掃描下面的二維碼添加關注:

作者: Surpassme
來源: http://www.jianshu.com/u/28161b7c9995/
http://www.cnblogs.com/surpassme/
宣告:本文著作權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出 原文鏈接 ,否則保留追究法律責任的權利,如有問題,可發送郵件 聯系,讓我們尊重原創者著作權,共同營造良好的IT朋友圈,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/502261.html
標籤:其他
上一篇:ES6 Promise詳解
下一篇:云圖說丨初識可信分布式身份服務
