前端經典面試題:js數據類型

JavaScript數據類型

萬丈高樓平地起,萬變不離其宗,紮實的基本功對於一個研發人員來講至關重要,此文從常見面試題着手,以文字思惟導圖的形式回顧總結JavaScript的數據類型,偶爾閱讀此文,可以查漏補缺、加深印象。es6

面試題引入

js有哪幾種數據類型?其中基本數據類型是哪些?面試

5s回想

回答前的旁白:

從結構上看,全部的數據(data)最終均可以分解成三種類型:
	標量(scalar),也就是一個單獨的字符串(string)或數字(number),好比"北京"這個單獨的詞。
	序列(sequence),也就是若干個相關的數據按照必定順序並列在一塊兒,又叫作數組(array)或列表(List),好比"北京,上海"。
	映射(mapping),也就是一個名/值對(Name/value),即數據有一個名稱,還有一個與之相對應的值,這又稱做散列(hash)或字典(dictionary),好比"首都:北京"。
json:
	Douglas Crockford聲稱的永遠沒必要升級的規則:
		1) 並列的數據之間用逗號(",")分隔
		2) 映射用冒號(":")表示
		3) 並列數據的集合(數組)用方括號("[]")表示
		4) 映射的集合(對象)用大括號("{}")表示
	例子:"北京市的面積爲16800平方千米,常住人口1600萬人。上海市的面積爲6400平方千米,常住人口1800萬。"
		=>	[
				{"城市":"北京","面積":16800,"人口":1600},
				{"城市":"上海","面積":6400,"人口":1800}
			]
複製代碼

分類:

基本數據類型(值類型、原始類型):
	包括:
		undefined
			定義:表示「無」的原始值、未定義,轉爲數值時爲NaN
			場景:
				變量聲明,但沒有賦值
				調用函數時,應該提供的參數沒有提供,該參數等於undefined
				對象沒有賦值的屬性
				函數沒有返回值時,默認返回undefined
		null
			定義:表示「無」的對象、空值,轉爲數值時爲0
			場景:調用函數時,不須要傳入某個參數,這時就能夠傳入null
			注意:typeof(null)返回'object'
		boolean
			定義:表示「真」(true)和「假」(false)兩個狀態
			場景:
				兩元邏輯運算符: && ,||
				前置邏輯運算符: !
				相等運算符:===,!==,==,!=
				比較運算符:>,>=,<,<=
			自動轉換:
				false:undefined, null, false, 0, NaN, ""或''
				true:除了轉爲false的外都轉爲true,特別的[], {}
			應用:用於程序流程的控制
		number
			概述
				整數和浮點數
					全部數字都是以64位浮點數形式儲存,1與1.0是相同的,是同一個數1 === 1.0  =>  true
					注意:
						某些運算只有整數才能完成,此時JavaScript會自動把64位浮點數,轉成32位整數
						浮點數不是精確的值 0.1 + 0.2 === 0.3, (0.3 - 0.2) === (0.2 - 0.1) =>  false
				數值精度
					國際標準IEEE 754:
						第1位:符號位,0表示正數,1表示負數
						第2位到第12位:儲存指數部分(11個二進制)
						第13位到第64位:儲存小數部分(即有效數字)
					精度:-(2e53-1)到2e53-1,超過沒法保持精度
				數值範圍
					指數範圍:最大2e11-1 => 2047
					數值範圍:2e1024到2e-1023,超過不能表示
					正向溢出:指數部分等於或超過最大正值1024 => Infinity
					負向溢出:指數部分等於或超過最小負值-1023 => 0
					最大值:Number.MAX_VALUE  =>  1.7976931348623157e+308
					最小值:Number.MIN_VALUE  =>  5e-324
			表示法
				字面量
					35(十進制)和0xFF(十六進制)
				科學計數法
					123e3  =>  123000,123e-3  =>  0.123
				自動轉科學計數法
					小數點前的數字多於21位
					小數點後的零多於5個
			進制
				十進制:沒有前導0的數值
				八進制:有前綴0o或0O的數值,或者有前導0、且只用到0-7的七個阿拉伯數字的數值
				十六進制:有前綴0x或0X的數值
				二進制:有前綴0b或0B的數值
			特殊數值
				正零和負零
					區別:+0或-0看成分母,返回的值是不相等
						1 / +0 => +Infinity
						1 / -0 => -Infinity
				NaN
					定義:「非數字」(Not a Number)
					場景:
						將字符串解析成數字出錯 5 - 'x'  =>  NaN
						數學函數的運算結果
							Math.acos(2) => NaN
							Math.log(-1) => NaN
							Math.sqrt(-1) => NaN
						0 / 0 => NaN
					運算規則:
						NaN === NaN => false
						[NaN].indexOf(NaN) => -1
						Boolean(NaN) => false
						NaN + 32 => NaN
					判斷方法:
						isNaN(NaN) => true
						注意:只對數值有效,其餘值要先轉換成數值
					注意:
						NaN不是一種獨立的數據類型
						是一種特殊數值,typeof NaN => 'number'
				Infinity
					定義:
						正的數值太大,或一個負的數值過小,沒法表示
						非0數值除以0,獲得Infinity
						有正負之分
					運算規則:略
					isFinite:返回一個布爾值,檢查某個值是否是正常數值,而不是Infinity
						isFinite(Infinity) => false,isFinite(NaN) => false,isFinite(-1) => true
			全局方法
				parseInt()
					將字符串轉爲整數
					進制轉換
				parseFloat()
					將一個字符串轉爲浮點數
			Number對象實例方法
				toString	把數字轉換爲字符串,使用指定的基數。
				toLocaleString	把數字轉換爲字符串,使用本地數字格式順序。
				toFixed	把數字轉換爲字符串,結果的小數點後有指定位數的數字。
				toExponential	把對象的值轉換爲指數計數法。
				toPrecision	把數字格式化爲指定的長度。
				valueOf	返回一個 Number 對象的基本數字值。
		string
			概述
				定義
				轉義:反斜槓(\)轉義符,表示特殊字符
					特殊:
						三個八進制數:'\251' => "©"
						兩個十六進制數:'\xA9' => "©"
						四個十六進制數:'\u00A9' => "©"
				字符串與數組
					相同取值方式,不可賦值
					使用數據方法:Array.prototype.join.call(s, ' ')
				長度
					length不可改
			字符集
				Unicode
			Base64轉碼
				處理特殊字符,方便打印
				btoa():字符串或二進制值轉爲Base64編碼
				atob():Base64編碼轉爲原來的編碼
				非ASCII碼字符(漢字)轉爲Base64編碼:
					btoa(encodeURIComponent(str))
			String對象方法:
				anchor()	建立 HTML 錨。
				big()	用大號字體顯示字符串。
				blink()	顯示閃動字符串。
				bold()	使用粗體顯示字符串。
				charAt()	返回在指定位置的字符。
				charCodeAt()	返回在指定的位置的字符的 Unicode 編碼。
				concat()	鏈接字符串。
				fixed()	以打字機文本顯示字符串。
				fontcolor()	使用指定的顏色來顯示字符串。
				fontsize()	使用指定的尺寸來顯示字符串。
				fromCharCode()	從字符編碼建立一個字符串。
				indexOf()	檢索字符串。
				italics()	使用斜體顯示字符串。
				lastIndexOf()	從後向前搜索字符串。
				link()	將字符串顯示爲連接。
				localeCompare()	用本地特定的順序來比較兩個字符串。
				match()	找到一個或多個正則表達式的匹配。
				replace()	替換與正則表達式匹配的子串。
				search()	檢索與正則表達式相匹配的值。
				slice()	提取字符串的片段,並在新的字符串中返回被提取的部分。
				small()	使用小字號來顯示字符串。
				split()	把字符串分割爲字符串數組。
				strike()	使用刪除線來顯示字符串。
				sub()	把字符串顯示爲下標。
				substr()	從起始索引號提取字符串中指定數目的字符。
				substring()	提取字符串中兩個指定的索引號之間的字符。
				sup()	把字符串顯示爲上標。
				toLocaleLowerCase()	把字符串轉換爲小寫。
				toLocaleUpperCase()	把字符串轉換爲大寫。
				toLowerCase()	把字符串轉換爲小寫。
				toUpperCase()	把字符串轉換爲大寫。
				toSource()	表明對象的源代碼。
				toString()	返回字符串。
				valueOf()	返回某個字符串對象的原始值。
	特色:
		1) 佔用空間固定,保存在棧中
		2) 保存與複製的是值自己
		3) 使用typeof檢測數據類型
合成數據類型(引用類型):
	包括:
		object:
			理解:
				(1)「對象」是單個實物的抽象。
				一本書、一輛汽車、一我的,一個數據庫、一張網頁、一個與遠程服務器的鏈接也能夠是「對象」。當實物被抽象成「對象」,實物之間的關係就變成了「對象」之間的關係,從而就能夠模擬現實狀況,針對「對象」進行編程。
				(2)「對象」是一個容器,封裝了「屬性」(property)和「方法」(method)。
				所謂「屬性」,就是對象的狀態;所謂「方法」,就是對象的行爲(完成某種任務)。好比,咱們能夠把動物抽象爲animal對象,「屬性」記錄具體是那一種動物,「方法」表示動物的某種行爲(奔跑、捕獵、休息等等)。
			分類:
				狹義的對象(object)
					概述
						生成方法
							var o1 = {};
							var o2 = new Object();
							var o3 = Object.create(null);
					鍵名
						都是字符串
						鍵名是數值,會被自動轉爲字符串
						不符合標識名的條件,必須加引號
					屬性
						任何數據類型
					對象的引用
						指向同一個內存地址,修改其中一個變量,會影響到其餘全部變量。
					屬性操做
						讀取:. []
						賦值:. []
						全部:Object.keys(o);
						刪除:delete能夠刪除的
						檢查:in
						遍歷:for...in
							全部可遍歷(enumerable)的屬性,跳過不可遍歷的屬性
							對象自身的屬性 + 繼承的屬性
					with語句
						通常模板引擎的原理
					Object靜態方法
						(0)Object.keys(),Object.getOwnPropertyNames()
						(1)對象屬性模型的相關方法

						Object.getOwnPropertyDescriptor():獲取某個屬性的attributes對象。
						Object.defineProperty():經過attributes對象,定義某個屬性。
						Object.defineProperties():經過attributes對象,定義多個屬性。
						Object.getOwnPropertyNames():返回直接定義在某個對象上面的所有屬性的名稱。
						(2)控制對象狀態的方法

						Object.preventExtensions():防止對象擴展。
						Object.isExtensible():判斷對象是否可擴展。
						Object.seal():禁止對象配置。
						Object.isSealed():判斷一個對象是否可配置。
						Object.freeze():凍結一個對象。
						Object.isFrozen():判斷一個對象是否被凍結。
						(3)原型鏈相關方法

						Object.create():生成一個新對象,並該對象的原型。
						Object.getPrototypeOf():獲取對象的Prototype對象。
					Object實例方法
						valueOf():返回當前對象對應的值。
						toString():返回當前對象對應的字符串形式。
						toLocaleString():返回當前對象對應的本地字符串形式。
						hasOwnProperty():判斷某個屬性是否爲當前對象自身的屬性,仍是繼承自原型對象的屬性。
						isPrototypeOf():判斷當前對象是否爲另外一個對象的原型。
						propertyIsEnumerable():判斷某個屬性是否可枚舉。
				數組(array)
					定義:有序集合,特殊的對象
					length
						32位整數,保存數組的元素個數,最大值2e32 - 1
						成員刪除:length比實際小
						數組清空:length=0
					類數組對象
						arguments,須要call方法來使用數組方法
					in
						適用於數組
					空位
						某個位置是空元素
						空位不影響length
						最後一個逗號不產生空位
						delete可產生
						遍歷跳過
							forEach方法、for...in結構、以及Object.keys
					靜態方法
						Array.isArray(a)
					實例方法
						concat()	鏈接兩個或更多的數組,並返回結果。
						join()	把數組的全部元素放入一個字符串。元素經過指定的分隔符進行分隔。
						pop()	刪除並返回數組的最後一個元素
						push()	向數組的末尾添加一個或更多元素,並返回新的長度。
						reverse()	顛倒數組中元素的順序。
						shift()	刪除並返回數組的第一個元素
						slice()	從某個已有的數組返回選定的元素
						sort()	對數組的元素進行排序
						splice()	刪除元素,並向數組添加新元素。
						toSource()	返回該對象的源代碼。
						toString()	把數組轉換爲字符串,並返回結果。
						toLocaleString()	把數組轉換爲本地數組,並返回結果。
						unshift()	向數組的開頭添加一個或更多元素,並返回新的長度。
						valueOf()	返回數組對象的原始值
				函數(function)
	特色:
		1) 佔用空間不固定,保存在堆中
		2) 保存與複製的是對象的一個指針(須要對象拷貝的緣由)
		3) 使用instanceof檢測數據類型
es6新類型:
	symbol符號對象
		定義:容許你建立惟一標識符
		使用:obj = Symbol(desc)
		檢測:typeof(Symbol) => symbol
		理解:
			Symbol,表示獨一無二的值。對象的屬性名如今能夠有兩種類型,一種是原來就有的字符串,另外一種就是新增的Symbol類型。凡是屬性名屬於Symbol類型,就都是獨一無二的,能夠保證不會與其餘屬性名產生衝突。

			Symbol 不可使用new關鍵字,Symbol函數能夠接受字符串參數使其返回值容易被區分,只是做爲描述,即便參數相同Symbol函數返回值也不等。

			Symbol值做爲對象屬性名時,不能用點運算符。同理,在對象的內部,使用Symbol值定義屬性時,Symbol值必須放在方括號之中。

			Symbol做爲屬性名,該屬性不會出如今for…in、for…of循環中,也不會被Object.keys()、Object.getOwnPropertyNames()返回。可是,它也不是私有屬性,有一個Object.getOwnPropertySymbols方法,能夠獲取指定對象的全部Symbol屬性名。

			Symbol.for方法接受一個字符串做爲參數,而後搜索有沒有以該參數做爲名稱的Symbol值。若是有,就返回這個Symbol值,不然就新建並返回一個以該字符串爲名稱的Symbol值。注意,Symbol函數是老是返回新的值。
		例子:
			var a = Symbol('foo');
			var b = Symbol('foo');
			var s1 = Symbol.for('foo');
			var s2 = Symbol.for('foo');
			s1 === s2 => true
			a === b => false

			a === s2 => false
			Symbol.keyFor(s1) => "foo"
			Symbol.keyFor(a) => undefined
		其餘:
			Symbol.hasInstance
			此方法可肯定構造函數對象是否會將對象識別爲構造函數實例之一。 它由 instanceof 運算符在內部使用。
			Symbol.isConcatSpreadable
			此屬性返回一個布爾值,該值指示是否應經過 Array.concat 將對象平展至其數組元素。
			Symbol.iterator
			此方法返回對象的默認迭代器。 它由 for…of 語句在內部使用。
			Symbol.toPrimitive
			此方法將對象轉換爲相應的基元值。 它由 ToPrimitive 抽象運算符在內部使用。
			Symbol.toStringTag
			此屬性返回一個字符串值,用於幫助建立對象的默認字符串說明。 它由內置方法 Object.toString 方法在內部使用。
			Symbol.unscopables
			此屬性返回一個對象,該對象的屬性從關聯對象的 with 環境綁定中排除。
複製代碼

數據類型轉換:

強制轉換
	Number()
		原始類型:有不能轉爲數字的,就是NaN
			Number(false) => 0
			Number(true) => 1
			Number(undefined) => NaN
			Number(null) => 0
			Number("1.2") => 1.2
			Number("12") => 12
			Number("1.2.3") => NaN
			Number(new object()) => NaN
			Number(50) => 50
		Number({}) => NaN
	String()
		原始類型值的轉換規則
			數值:轉爲相應的字符串。
			字符串:轉換後仍是原來的值。
			布爾值:true轉爲"true",false轉爲"false"。
			undefined:轉爲"undefined"。
			null:轉爲"null"。
		String({a: 1}) => "[object Object]"
		String([1, 2, 3]) => "1,2,3"
	Boolean()
		false
			undefined
			null
			-0
			0或+0
			NaN
			false
			''
		true
			全部對象,包括{}、布爾對象new Boolean(false)
自動轉換
	場景:
		不一樣類型的數據互相運算
			123 + 'abc' => "123abc"
		對非布爾值類型的數據求布爾值
			if ('abc')
		對非數值類型的數據使用一元運算符(即「+」和「-」)
			+ {foo: 'bar'} => NaN
	本質:
		以強制類型爲基礎,轉爲須要的number、string、boolean
複製代碼

數據類型檢測:

typeof運算符
		數值、字符串、布爾值、undefined、函數,返分別返回number、string、boolean、undefined、function
		除此之外,其餘狀況都返回object
			typeof window  =>  "object"
			typeof {}  =>  "object"
			typeof []  =>  "object"
			typeof null  =>  "object"
	instanceof運算符
		定義:返回一個布爾值,表示指定對象是否爲某個構造函數的實例
		實質:是檢查右邊構建函數的原型對象,是否在左邊對象的原型鏈上
			v instanceof Vehicle 等價於 Vehicle.prototype.isPrototypeOf(v)
		instanceof對整個原型鏈上的對象都有效,所以同一個實例對象,可能會對多個構造函數都返回true
		特例:Object.create(null) instanceof Object  =>  false,除了這個其餘對象的數據類型均可以這麼判斷
		注意:instanceof運算符只能用於對象,不適用原始類型的值
	Object.prototype.toString(value)方法
		相對準確的檢測方法
			Object.prototype.toString.call(value);
		返回值
			數值:返回[object Number]。
			字符串:返回[object String]。
			布爾值:返回[object Boolean]。
			undefined:返回[object Undefined]。
			null:返回[object Null]。
			數組:返回[object Array]。
			arguments對象:返回[object Arguments]。
			函數:返回[object Function]。
			Error對象:返回[object Error]。
			Date對象:返回[object Date]。
			RegExp對象:返回[object RegExp]。
			其餘對象:返回[object " + 構造函數的名稱 + "]
複製代碼
相關文章
相關標籤/搜索