數據類型分類
-
基礎數據類型
undefined
Undefined 類型只有一個值,即特殊的 undefined。在使用 var 聲明變量但未對其加以初始化時,這個變量的值就是 undefined
/* 在未申明的請求下直接使用會報錯, 在使用未聲明的變量時, 可以使用typeof,這樣操作是安全的 */ console.log(a); // undefined 因爲var 聲明會出現變量提升 var a; console.log(b); // 報錯 因爲const聲明會產生一個暫時性死區,不可以在申明前調用 let b;
null
類似於空指針(typeof null 返回 object),值爲null,更多的情況下來表示這個變量爲空,語義上跟undefined有明顯區別。
/* null 在值判斷時候跟undefined 是相等的,是因爲,都轉成了number,值均爲0。 儘管 null 和 undefined 有這樣的關係,但它們的用途完全不同。無論在什麼情況下 都沒有必要把一個變量的值顯式地設置爲 undefined(因爲如果使用typeof 返回 undefined,沒法判斷是未定義還是未賦值),可是同樣的規則對 null 卻不適用。換句話說, 只要意在保存對象的變量還沒有真正保存對象,就應該明確地讓該變量保存 null 值。這樣做不僅可以 體現 null 作爲空對象指針的慣例,而且也有助於進一步區分 null 和 undefined。 */ null == undefined // true null === undefined // false
Boolean
據類型 轉發爲true的值 轉換爲falsede zhi Boolean true fase String 任何非空字符串 “” Number 任何非零數字(包含 Infinity
)0 和 NaN Object 任何對象 null undefined 無 undefined Number
// 二進制 8進制 十進制 16進制 var a = 010; // 8 var b = 0x12 // 18 // 浮點數 由於浮點數存儲的空間比整數大 ECMA 會適機將浮點轉換爲整數 // 關於浮點數值計算會產生舍入誤差的問題,感興趣可以查一下 JavaScript 浮點進度問題 var c = 10.0 // 會變成整數10 // 科學計數法 var d = 3e2; // 3 * 10的2次方即爲300 // 數字中的特殊類型 NaN not a number NaN === NaN // false window.isNaN(NaN) // true Number.isNaN(NaN) // true window.isNaN('a') // true 因爲 會先將`a`執行Number(a) Number.isNaN('a') // false 只有NaN纔是ture // 常用的數值轉換方法Number parseInt parseFloat var num1 = Number("Hello world!");// NaN var num2 = Number(''); // 0 var num3 = Number("000011"); // 11 var num4 = Number(true); // parseInt 跟看開頭是否爲數字如果是那麼取到數字最後一位 var num1 = parseInt("1234blue"); // 1234 var num2 = parseInt(""); // NaN var num3 = parseInt("0xA"); // 10 16進制 var num4 = parseInt(22.5); // 22 var num5 = parseInt("070"); // 56 8進制 var num6 = parseInt("70"); // 70 // parseInt 第二個參數爲進制 var num1 = parseInt("AF", 16); //175 var num1 = parseInt("AF"); // NaN // parsefloat 同上 不同點在於可以取浮點數
String
字符串的內容是不可以變的,一旦創建,它的值就不能改變,要改變的話需要先銷燬當前的,再創建
var lang = "Java"; lang = lang + "Script"; // 首先創建一個能容納 10 個字符的 新字符串,然後在這個字符串中填 充"Java"和"Script", // 最後一步是銷燬原來的字符串"Java"和字 符串"Script",因爲這兩個字符串已經沒用了。
-
引用數據類型
Object
存儲的爲地址的引用
// 實例化 var person = new Object; person.name = 'javascript'; // 對象字面量表示法 var person2 = { name: 'javascript' }; var obj1 = { x:2 } var obj2 = obj1; obj2.x = 3; console.log(obj1, obj2); // { x:3 } { x:3 }
使用
defineProperty
來定義對象屬性Object.defineProperty(obj, prop, descriptor)
value
值writable
爲true 纔可以賦值,默認爲falseconfigurable
當且僅當該屬性的 configurable 爲 true 時,該屬性描述符才能夠被改變,同時該屬性也能從對應的對象上被刪除。默認爲 falseenumerable
當且僅當該屬性的enumerable爲true時,該屬性才能夠出現在對象的枚舉屬性中。默認爲 false。get
一個給屬性提供 getter 的方法,如果沒有 getter 則爲 undefined。當訪問該屬性時,該方法會被執行,方法執行時沒有參數傳入,但是會傳入this對象set
一個給屬性提供 setter 的方法,如果沒有 setter 則爲 undefined。當屬性值修改時,觸發執行該方法。該方法將接受唯一參數,即該屬性新的參數值。
Array
常見的數組方法參見 數組方法
Date
時間對象
var date = new Date(); // 日期格式化方法 // toDateString()——以特定於實現的格式顯示星期幾、月、日和年; date.toDateString(); // Sun May 26 2019 // toTimeString()——以特定於實現的格式顯示時、分、秒和時區; date.toTimeString(); // 15:27:53 GMT+0800 (中國標準時間) // toLocaleDateString()——以特定於地區的格式顯示星期幾、月、日和年; date.toLocaleDateString(); // 2019/5/26 // toLocaleTimeString()——以特定於實現的格式顯示時、分、秒; date.toLocaleTimeString(); // 下午3:27:53 // toUTCString()——以特定於實現的格式完整的 UTC 日期。 date.toUTCString(); // Sun, 26 May 2019 07:27:53 GMT
RegExp
- 模式
g:表示全局(global)模式,即模式將被應用於所有字符串,而非在發現第一個匹配項時立即 停止
i:表示不區分大小寫(case-insensitive)模式,即在確定匹配項時忽略模式與字符串的大小寫;
m:表示多行(multiline)模式,即在到達一行文本末尾時還會繼續查找下一行中是否存在與模式匹配的項。
Function
函數實際 上是對象。每個函數都是 Function 類型的實例,而且都與其他引用類型一樣具有屬性和方法。由於函 數是對象,因此函數名實際上也是一個指向函數對象的指針,不會與某個函數綁定。
問題
關於數據類型的深拷貝操作,給定一個輸入,將輸入的內容深拷貝一份返回 ?