1. 程式人生 > >你真的瞭解JS的資料型別?

你真的瞭解JS的資料型別?

在這裡插入圖片描述

數值(number):整數和小數(比如1和3.14) 字串(string):文字(比如Hello World)。 布林值(boolean):表示真偽的兩個特殊值,即true(真)和false(假) undefined:表示“未定義”或不存在,即由於目前沒有定義,所以此處暫時沒有任何值 null:表示空值,即此處的值為空。 Symbol:es6新增的型別的值 物件(object):各種值組成的集合。狹義的物件(object),陣列(array),函式(function) object是複雜資料型別,是由簡單的資料型別組成的,除object外均為基礎資料型別/簡單資料型別

typeof運算子 JavaScript有三種方法,可以確定一個值到底是什麼型別。

typeof運算子 instanceof運算子 Object.prototype.toString方法 下面使用typeof運算子判斷資料型別 例子:

typeof 123 //"number"
typeof "123" //"string"
typeof true //"boolean"
typeof undefined //"undefined"
typeof null //"object"
typeof function f(){} //"object"
typeof [] //"object"
typeof {} //"object"

從上面的例子的結果,你會發現為什麼null的型別不是null,而是object等等的問題

JS的Bug小彙總 typeof null //“object” typeof function f(){} //“function”

null的型別是object,這是由於歷史原因造成的。1995年的 JavaScript 語言第一版,只設計了五種資料型別(物件、整數、浮點數、字串和布林值),沒考慮null,只把它當作object的一種特殊值。後來null獨立出來,作為一種單獨的資料型別,為了相容以前的程式碼,typeof null返回object就沒法改變了 number 1.1 整數和浮點數 JavaScript 語言的底層根本沒有整數,所有數字都是小數(64位浮點數)由於浮點數不是精確的值,所以涉及小數的比較和運算要特別小心 1.2 數值精度 根據國際標準 IEEE 754,JavaScript 浮點數的64個二進位制位,從最左邊開始,是這樣組成的。 第1位:符號位,0表示正數,1表示負數 第2位到第12位(共11位):指數部分 第13位到第64位(共52位):小數部分(即有效數字) 符號位決定了一個數的正負,指數部分決定了數值的大小,小數部分決定了數值的精度。 1.3 數值範圍 根據標準,64位浮點數的指數部分的長度是11個二進位制位,意味著指數部分的最大值是2047(2的11次方減1)。也就是說,64位浮點數的指數部分的值最大為2047,分出一半表示負數,則 JavaScript 能夠表示的數值範圍為21024到2-1023(開區間),超出這個範圍的數無法表示。 2.表示的方式 就是直接表示和科學計數法兩種方式,特殊情況,JavaScript 會自動將數值轉為科學計數法表示,其他情況都採用字面形式直接表示。

//小數點前的數字多於21位
1234567890123456789012
// 1.2345678901234568e+21

//小數點後的零多於5個,就自動轉為科學計數法
0.0000003 // 3e-7

3.數值的進位制 直接表示的時候也是可以輸入十進位制之外的進位制數的,比如二進位制、八進位制、十六進位制。

十進位制(decimal):沒有前導0的數值。 八進位制(octonary):有字首0o或0O的數值,或者有前導0、且只用到0-7的八個阿拉伯數字的數值。 十六進位制(hexadecimal):有字首0x或0X的數值。 二進位制(binary):有字首0b或0B的數值。

255 //255
0xff // 255
0377 // 255
0b11 // 3

4.特殊的值

正零和負零:JavaScript 內部實際上存在2個0:一個是+0,一個是-0,區別就是64位浮點數表示法的符號位不同。它們是等價的。 NaN是 JavaScript 的特殊值,表示“非數字”(Not a Number),主要出現在將字串解析成數字出錯的場合。真正的奇葩,因為他自己也不等於自己。NaN === NaN // false Infinity表示“無窮”,用來表示兩種場景。一種是一個正的數值太大,或一個負的數值太小,無法表示;另一種是非0數值除以0,得到Infinity。

Infinity的四則運算,符合無窮的數學計算規則。 0乘以Infinity,返回NaN;0除以Infinity,返回0;Infinity除以0,返回Infinity。 Infinity加上或乘以Infinity,返回的還是Infinity。 Infinity減去或除以Infinity,得到NaN。 Infinity與null計算時,null會轉成0,等同於與0的計算。 Infinity與undefined計算,返回的都是NaN。 5.與數值相關的全域性方法

parseInt()//將字串轉為整數,自動去除字串頭部的空格,parseInt的引數如果不是字串,會先轉換為字串再轉換。遇到不是數字的就停止。如果字串的第一個字元不能轉化為數字(後面跟著數字的正負號除外),返回NaN。 parseFloat()//將一個字串轉為浮點數,如果字串包含不能轉為浮點數的字元,則不再進行往後轉換,返回已經轉好的部分。InFinity、NaN、undefined、返回false。parseFloat會將空字串轉為NaN。 isNaN()//判斷一個值是否為NaN isFinity()//表示某個值是否為正常的數值。只對+InFinity、-InFinity、NaN、undefined、返回false。

parseInt方法還可以接受第二個引數(2到36之間),表示被解析的值的進位制,返回該值對應的十進位制數。預設情況下,parseInt的第二個引數為10,即預設是十進位制轉十進位制。

parseInt('   81') // 81
parseInt('15px') // 15
parseInt('1000', 2) // 8
parseFloat('3.14more non-digit characters') // 3.14
isNaN('Hello') // true
isFinite(null) // true

string

字串就是零個或多個排在一起的字元,放在單引號或雙引號之中。 奇葩需求1: 在單引號字串的內部,使用單引號 在雙引號字串的內部,使用雙引號 我不能使用小技巧,那我只能叫我大哥(轉義符)出來走一下啦

'Did she say \'Hello\'?'
// "Did she say 'Hello'?"

"Did she say \"Hello\"?"
// "Did she say "Hello"?"

奇葩需求2:長字串必須分成多行 解決方法:

//方法1(坑人語法),但是使用不小心會出bug,記得反斜槓的後面必須是換行符,而不能有其他字元(比如空格),否則會報錯,不信,你可以試一下
var s1 = '12345\
67890'

//方法2(好讀語法)
var s2 = '12345'+
'67890'

//方法3(ES6新出的),使用反引號(1左邊的符號)
var s3 = `12345
67890`
s3.length //11,會包含回車

boolean 布林值相當於是一個開關,布林值代表“真”和“假”兩個狀態。“真”用關鍵字true表示,“假”用關鍵字false表示。布林值只有這兩個值。 例子:

var a = true;
if(a){
    console.log("條件為真");
}else{
    console.log("條件為假");
}

下列運算子會返回布林值:

兩元邏輯運算子: && (And),|| (Or) 前置邏輯運算子: ! (Not) 相等運算子:=,!,==,!= 比較運算子:>,>=,<,<= 敲黑板,重點來啦 除了下面六個值被轉為false,其他值都視為true null undefined ‘’"/’’(空字串) null false NaN undefined & null null與undefined都可以表示“沒有”,含義非常相似。將一個變數賦值為undefined或null,老實說,語法效果幾乎沒區別。

null是一個表示“空”的物件 undefined是一個表示"此處無定義"的原始值 那我偏偏說他們倆是有具體區別怎麼辦? (語法規範)如果一個變數被聲明瞭,但是沒有被賦值,那麼這個變數的值就是 undefiend (慣例)如果想要表示一個還沒賦值的物件,就用 null。如果想要表示一個還沒賦值的非物件(字串/數字/布林/symbol),就用 undefined object 物件就是一組“鍵值對”(key-value)的集合,是一種無序的複合資料集合。key代表鍵名,value代表鍵值

key 物件的所有鍵名都是字串。如果鍵名是數值,會被自動轉為字串。如果鍵名不符合標識名的條件(比如第一個字元為數字,或者含有空格或運算子),且也不是數字,則必須加上引號,否則會報錯。 2.value value的值可以是任意的資料型別 3.屬性的讀取 讀取物件的屬性,有兩種方法,一種是使用點運算子,還有一種是使用方括號運算子。

var obj = {
  123: 'hello world'
};

obj.123 // 報錯
obj[123] // "hello world"

4.屬性的賦值 點運算子和方括號運算子,不僅可以用來讀取值,還可以用來賦值。 5.屬性的檢視 檢視一個物件本身的所有屬性,可以使用Object.keys方法。

var obj = {
  key1: 1,
  key2: 2
};

Object.keys(obj);
// ['key1', 'key2']

6.屬性的刪除:delete 命令 delete命令用於刪除物件的屬性(刪除鍵名和鍵值),刪除成功後返回true。 delete命令會返回false,那就是該屬性存在,且不得刪除。 7.屬性是否存在:in 運算子 in運算子用於檢查物件是否包含某個屬性(注意,檢查的是鍵名,不是鍵值),如果包含就返回true,否則返回false。它的左邊是一個字串,表示屬性名,右邊是一個物件。

var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true

8.屬性的遍歷:for…in 迴圈 for…in迴圈用來遍歷一個物件的全部屬性。

var obj = {a: 1, b: 2, c: 3};

for (var i in obj) {
  console.log('鍵名:', i);
  console.log('鍵值:', obj[i]);
}

它遍歷的是物件所有可遍歷(enumerable)的屬性,會跳過不可遍歷的屬性。 它不僅遍歷物件自身的屬性,還遍歷繼承的屬性。 9.with 批量操作 操作同一個物件的多個屬性 建議不要使用with語句,可以考慮用一個臨時變數代替with。

加Java架構師群獲取Java工程化、高效能及分散式、高效能、深入淺出。高架構。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等多個知識點高階進階乾貨的直播免費學習許可權 都是大牛帶飛 讓你少走很多的彎路的 群…號是:855801563 對了 小白勿進 最好是有開發經驗

注:加群要求

1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!