主頁 > 企業開發 > JavaScript快速入門-03-資料型別

JavaScript快速入門-03-資料型別

2022-08-19 08:30:33 企業開發

3 資料型別

3.1 簡介

? ? JavaScript中的每個值都是屬于一種特定的資料型別,JavaScript中一共有以下幾種資料型別,詳細如下所示:

  • 原始型別:UndefinedNullBooleanNumberStringSymbol
  • 物件: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型別使用最多的型別之一,有兩個字面值:truefalse

  • 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詳解

下一篇:云圖說丨初識可信分布式身份服務

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more