Javascript學(xué)習(xí)筆記-類型

Javascript類型.png

重新回顧一下Javascript中類型相關(guān)的知識

1. 基本類型

Javascript截止目前有7個基本類型:number, string, boolean , undefined, null, object, symbol

1.1 typeof

使用typeof函數(shù)可以得到對應(yīng)變量/值的基本類型的字符串,但是也存在著一些例外:

typeof 1 === 'number';
typeof '' === 'string';
typeof true === 'boolean';
typeof {} === 'object';
typeof function(){} === 'function'; // function是object的一等公民,并不是基本類型
typeof null === 'object'; //之前說過在javascript中對對象的檢測機制影響導(dǎo)致
typeof undefined === 'undefined';
typeof Symbol() === 'symbol';

我們知道Javascript中存在undefinedundeclared兩種情況,undefined是變量已經(jīng)聲明,但是沒有初始化賦值,此時獲取變量的值為undefined;而undeclared是變量并沒有聲明,在詞法作用域中無法找到對應(yīng)的變量,此時獲取變量的值會拋出ReferenceError
typeof對于undeclared的變量檢測存在一個安全機制,會返回undefined的字符串,所以當(dāng)我們需要使用一個不能確定是否存在的變量時,我們可以利用typeof的機制來避免異常的拋出

if(typeof x === 'undefined') { // x如果是undefined或者undecalred會滿足條件
  // TODO
}

1.2 值相關(guān)內(nèi)容

不同的基本類型的值存在一些特點:

1.2.1 string
  • 對于string的值來說,是一個常量,創(chuàng)建以后就不可以發(fā)生改變
  • string可以從某種程度上可以理解為字符數(shù)組,因此string在可以使用Array原型鏈上的方法,但是其本身并不是Array,所以并不是所有的方法都可以使用(這里存在自動封裝過程)

var s = Array.prototype.join.call('abc', ','); // 可以使用該方法
console.log(s); // a,b,c
var r = Array.prototype.reverse.call('abc'); // 并不能使用該方法,會拋出異常
// 想要實現(xiàn)字符串順序反轉(zhuǎn),可以將字符串轉(zhuǎn)為數(shù)組后利用reverse()函數(shù)后再連接
var r = 'abc'.split('').reverse().join('');
console.log(r); // 'cba'
1.2.2 number
  • number類型可以分為不帶小數(shù)的數(shù)據(jù)(整數(shù))和帶小數(shù)的數(shù)據(jù),因此對于不帶小數(shù)的數(shù)據(jù)和整數(shù)是一樣的

4.0 === 4
  • number類型使用的是雙精度的格式,所以在進行計算的時候并不是精確計算,會存在精度的不準確,最常見的例子就是

0.1 + 0.2 != 0.3

這是很讓人費解的結(jié)果,所以在使用含有小數(shù)的數(shù)據(jù)進行計算的時候,最好引入一個誤差精度,兩個數(shù)差值絕對值小于這個值的時候,就認為它們相等,ES6中引入了Number.EPILON,該值等于Math.pow(2,-52)

  • number類型在較大或者較小的時候,會自動轉(zhuǎn)換為科學(xué)計數(shù)法的方式

5000000000000000000000 // 5e+21
  • number類型在自動封裝后可以使用toFixedtoPrecision分別保留指定小數(shù)位數(shù)和有效數(shù)字位數(shù)(科學(xué)計數(shù)法方式),返回結(jié)果為字符串

0.1234.toFixed(2); // '0.12'
1234.0.toPrecision(2); // '1.2e+3'

但是如果是整數(shù)調(diào)用對應(yīng)方法的時候,要么使用..的方式,要么手動封裝后調(diào)用,因為自動封裝會默認把第一個.作為number自身的值

1234..toPrecision(2); // '1.2e+3'
Number(1234).toPrecision(2); // '1.2e+3'
1.2.3 特殊值
  • void和任何值進行運算后都只會返回undefined
  • NaN是特殊的number,是Javascript中唯一一個不具有自反性的值NaN!==NaN,因此想要判斷一個變量是不是NaN可以利用自反性,也可以利用Number或者Window中的isNaN方法

var a = 1 / 'foo';
console.log(a!==a); // true
console.log(isNaN(a)); // true
console.log(Number.isNaN(a)); // true
  • Infinity是特殊的number,表示無限的意思,且在兩個無限值進行計算的時候會有以下結(jié)果:

console.log(Infinity + Infinity); // Infinity
console.log(Infinity - Infinity); // NaN
console.log(Infinity * Infinity); // Infinity
console.log(Infinity / Infinity); // NaN
  • +0和-0,兩個數(shù)在數(shù)值上并沒有區(qū)別,但是確實可以區(qū)分其意義,如果要進行比較,可以使用Object.is函數(shù)進行

console.log(0 === -0); // true
console.log(Object.is(0,-0)); // false
// 也可以使用該函數(shù)對NaN進行比較
console.log(Object.is(NaN, NaN)); // true
1.2.4 值復(fù)制和值引用

只有很簡單的一句話:對于基本類型的值在操作的時候進行值的復(fù)制傳遞,而對于復(fù)合對象在操作的時候進行值的引用傳遞。

2. 內(nèi)置對象

Javascript內(nèi)置對象也是內(nèi)置函數(shù),一共有10個:Number, String, Boolean, Object, Function, Array, RegExp, Error, Date, Symbol

2.1 toString

所有typeofobject的對象都有toString方法,其結(jié)果輸出的對應(yīng)對象的[[Class]]屬性

Object.prototype.toString.call(Number(1)); // [object Number]
Object.prototype.toString.call(String(''));// [object String]

2.2 自動封裝

基本類型并不存在方法,但是在使用的時候確可以直接使用某些方法,是因為在調(diào)用方法前,Javascript執(zhí)行了自動封裝的過程,所以可以使用對應(yīng)封裝類型的原型方法

2.3 valueOf拆封

對于封裝后的對象(主要是通過顯示的強制類型轉(zhuǎn)換),如果需要得到其基本類型的值,可以使用valueOf函數(shù)進行拆封

new Boolean(false) === false; // false
new Boolean(false).valueOf() === false; // true

2.4 對象特性

2.4.1 Array
  • 創(chuàng)建一個數(shù)組,可以使用字面量的創(chuàng)建方法,也可以使用Array構(gòu)造器,其中如果構(gòu)造器傳遞參數(shù)為數(shù)字將創(chuàng)建對應(yīng)長度的空單元數(shù)組

var arr = []; // 字面量創(chuàng)建
var arr = new Array([]); // 構(gòu)造器創(chuàng)建
var arr = Array(3); // new關(guān)鍵字可以省略
console.log(arr.length); // 3;
  • Array對象的toString方法調(diào)用將返回通過,連接的字符串

[1,2,3].toString(); // '1,2,3'
  • Array對象中,如果存在空單元,那么就稱為稀疏數(shù)組。空單元雖然在某些表現(xiàn)上和undefined單元相同,但是兩者實際上有所區(qū)別

var arr1 = [undefined, undefined, undefined];
var arr2 = Array(3);
console.log(arr1.length === arr2.length); // true
console.log(arr1[0] === arr2[0]); // true;
// 區(qū)別
Array.prototype.map.call(arr1, (item,i) => { console.log(i);}); // 1 2 3
Array.prototype.map.call(arr2, (item,i) => {console.log(i);}); // [undefined * 3]
  • 使用delete可以刪除數(shù)組元素,元素刪除后長度不發(fā)生變化,刪除位置變?yōu)榭諉卧?/li>

var a = [1, 2, 3];
delete a[0];
console.log(a);// [undefind * 1, 2, 3];
console.log(a.length); // 3
2.4.2 Date和Error

DateError沒有字面量的構(gòu)建形式,一定要使用構(gòu)造器的方式去創(chuàng)建對應(yīng)的對象

var date = new Date(); // new關(guān)鍵字不能省略,若只獲取當(dāng)前時間可以使用Date.now()代替
var error = new Error(); // new關(guān)鍵字可以省略
2.4.3 Symbol

ES6引入的新的內(nèi)置對象,通常用來作為對象內(nèi)部私有屬性的key,構(gòu)建時不能使用new關(guān)鍵字,且可以使用Object.getOwnPropertySymbols()獲取當(dāng)前對象所有的symbol屬性的數(shù)組

var s = Symbol('test');
var obj = {};
obj[s] = 1;
Object.getOwnPropertySymbols(o); // [Symbol(test)]
  1. 參考
    《你不知道的Javscript(中卷)》
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內(nèi)容