一炎咖、在“JavaScript”規(guī)范中厕吉,共定義了七種數(shù)據(jù)類型受扳,分為“基本類型”和“引用類型”兩大類
- 基本類型(六種):字符串(String)序无、數(shù)字(Number)验毡、布爾(Boolean)、唯一(Symbol)帝嗡、(未定義)Undefined晶通、空(Null)。
- 引用類型(一種):對象(Object)哟玷,對象又包含了Object狮辽、Function、Array巢寡、Date喉脖、RegExp等
二、基本包裝類型(String抑月、Number树叽、Boolean)
- 引用類型有方法和屬性,但是基本類型是沒有的谦絮,為了方便操作菱皆,給每一個(gè)包裝類型提供了一個(gè)對應(yīng)的包裝對象
var str = 'hello'; // string 基本類型,本身不具備方法和屬性
var s1 = str.charAt(0); // 在執(zhí)行到這一句的時(shí)候 后臺會自動完成以下動作
// 1. 找到對應(yīng)的包裝對象挨稿,通過包裝對象創(chuàng)建一個(gè)值相同的實(shí)例
// var str = new String('hello');
// 2. 調(diào)用這個(gè)實(shí)例的方法(通過原型繼承調(diào)用包裝對象的方法)
// var s2 = str.chaAt(0);
// 3. 銷毀這個(gè)實(shí)例
// str = null;
console.log(s1); // h
console.log(str); // 還是hello不是null,注意這是一瞬間的動作,實(shí)際上我們沒有改變字符串本身的值仇轻。就是做了下面的動作.這也是為什么每個(gè)字符串具有的方法并沒有改變字符串本身的原因。
- 引用類型與基本包裝類型的區(qū)別
它們的對象生命周期不同:
引用類型:使用new創(chuàng)建引用類型的實(shí)例奶甘,在執(zhí)行流離開當(dāng)前作用域之前都一直保存在內(nèi)存中篷店。
基本包裝類型:自動創(chuàng)建基本包裝類型的對象,只執(zhí)行一行代碼的瞬間之后就會立即銷毀。
這意味著在運(yùn)行時(shí)為基本包裝類型值添加屬性和方法是無效的疲陕,只有在包裝對象的原型上添加方淤。
var str = 'hello';
str.name = 'jack'; // 添加之后馬上銷毀了,無效
console.log(str.name); // undefined
String.prototype.age = 24; // 在原型上添加
console.log(str.age); // 24
三蹄殃、數(shù)據(jù)類型檢測
let s1 = 1;
let s2 = '';
let s3 = true;
let s4 = undefined;
let s5 = Symbol();
let s6 = function test() { };
let s7 = null;
let s8 = [];
let s9 = {};
let s10 = new Date();
let s11 = new RegExp();
// 使用 typeof 運(yùn)算符只能檢測出七種
console.log(typeof s1); // number
console.log(typeof s2); // string
console.log(typeof s3); // boolean
console.log(typeof s4); // undefined
console.log(typeof s5); // symbol
console.log(typeof s6); // function
console.log(typeof s7); // object
console.log(typeof s8); // object
console.log(typeof s9); // object
console.log(typeof s10); // object
console.log(typeof s11); // object
console.log('----------------------');
// 使用 Object.prototype.toString(),全部能檢測出來
// Object.prototype.toString 最終會返回形式如 [object,class] 的字符串携茂,class 指代的是其檢測出的數(shù)據(jù)類型,這個(gè)是我們判斷數(shù)據(jù)類型的關(guān)鍵诅岩。
// toString === window.toString === Object.prototype.toString
let judgeType = val => toString.call(val).slice(8, -1).toLowerCase();
console.log(judgeType(s1)); // number
console.log(judgeType(s2)); // string
console.log(judgeType(s3)); // boolean
console.log(judgeType(s4)); // undefined
console.log(judgeType(s5)); // symbol
console.log(judgeType(s6)); // function
console.log(judgeType(s7)); // null
console.log(judgeType(s8)); // array
console.log(judgeType(s9)); // object
console.log(judgeType(s10)); // date
console.log(judgeType(s11)); // regexp
console.log(s3.toString()); // "true" 自己原型上的 toString 方法是轉(zhuǎn)成字符串
- 為什么非要調(diào)用對象上的 toString 方法(Object.prototype.toString.call())而不調(diào)用自己原型上的 toString(s3.toString() ) 方法呢讳苦?因?yàn)樽约涸蜕系?toString 方法重寫了對象的 toString 方法,自己原型上的 toString 方法用處不一樣