[每日一題]面試官問:詳細(xì)說一下JS數(shù)據(jù)類型

關(guān)注「松寶寫代碼」,精選好文,每日一題

?時(shí)間永遠(yuǎn)是自己的

每分每秒也都是為自己的將來鋪墊和增值

作者:saucxs | songEagle

2020,實(shí)「鼠」不易

2021,「?!罐D(zhuǎn)乾坤

風(fēng)勁潮涌當(dāng)揚(yáng)帆,任重道遠(yuǎn)須奮蹄!

[圖片上傳失敗...(image-36cb62-1611643902109)]

hello,大家好,我是「松寶寫代碼」的作者songEagle,今天是元旦,一元復(fù)始,萬象更新。看到大家已經(jīng)在寫年終總結(jié),我一般每年除夕左右的時(shí)候出年終總結(jié),近期會(huì)去回顧這一年做了哪些,哪些做的不好,希望大家留言,可以給我提提意見。
?

一、前言

2020.12.23 日剛立的 flag,每日一題,題目類型不限制,可以是:算法題,面試題,闡述題等等。

本文是「每日一題」第 10 題:[每日一題]面試官問:詳細(xì)說一下JS數(shù)據(jù)類型

[圖片上傳失敗...(image-a73e21-1611643902109)]

往期「每日一題」:

二、JS數(shù)據(jù)類型

我們?cè)诨卮鸬臅r(shí)候,很容易把symbol這個(gè)類型說漏,之前有講到過「[每日一題]ES6 中為什么要使用 Symbol?」。

數(shù)據(jù)類型:

  • 1、5種基本類型
  • 2、ES6的symbol類型
  • 3、引用類型

三、5種基本數(shù)據(jù)類型

(一)Undefined

只有一個(gè)特殊值unfefined,變量在未初始化的情況下,值為undefined

出現(xiàn)undefined的情況:

  • 1、預(yù)編譯階段,進(jìn)行變量提升時(shí),只聲明,未定義,變量值為undefined;
  • 2、函數(shù)無return,或者return后什么也沒有時(shí),默認(rèn)返回值為undefined;
  • 3、函數(shù)定義的參數(shù)未傳值時(shí),默認(rèn)為undefined;
  • 4、查到一個(gè)對(duì)象不存在的屬性時(shí),返回undefined;
  • 5、數(shù)組find方法中,沒找到時(shí),返回為undefined。

(二)Null

只有一個(gè)特殊值null,表示空對(duì)象指針

出現(xiàn)null的情況:

  • 未獲取到指定的dom元素對(duì)象時(shí),返回為null;
  • Object.prototype.proto 值為null;
  • 正則捕獲,無結(jié)果時(shí),返回為null。

(三) Boolean

包含兩個(gè)字面值:true、false

數(shù)據(jù)類型 true false
Boolean true false
String 任何非空字符串 空字符串
Number 任何非零數(shù)字值(包含正負(fù)無窮值) NaN, 0
Object 任何非空對(duì)象 null
Undefined undefined

(四) Number

  • 十進(jìn)制:如let number = 12
  • 八進(jìn)制:第一位為0,然后是八進(jìn)制數(shù)字序列0-7,如:let number = 012,表示十進(jìn)制的數(shù)字10。數(shù)值超出范圍時(shí),前導(dǎo)0將被忽略,后面的數(shù)值當(dāng)成十進(jìn)制處理。嚴(yán)格模式無效
  • 十六進(jìn)制:前兩位為0x,=,然后是十六進(jìn)制數(shù)字0-9及A-F/a-f,如:let number = 0xA,表示十進(jìn)制的數(shù)字10。

注意

  • 浮點(diǎn)數(shù):計(jì)算會(huì)產(chǎn)生誤差

常用方法、屬性

  • 浮點(diǎn)數(shù):計(jì)算會(huì)產(chǎn)生誤差
  • Number.MIN_VALUE:ECMAScript可表示的最小值
  • Number.MAX_VALUE:ECMAScript可表示的最大值
  • +Infinity:超出范圍的值,正無窮,如:1/0,返回Infinity不能參與計(jì)算
  • -Infinity:超出范圍的值,負(fù)無窮,如:-1/0,返回-Infinity不能參與計(jì)算
  • isFinite( ):判斷是否有窮值,在范圍內(nèi)的數(shù)值返回true
  • NaN:特殊數(shù)值,非數(shù)值,用來表示本應(yīng)返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況,如:零除以零,返回NaN。特點(diǎn):1. 任何涉及NaN的操作都返回NaN;2. NaN與任何值都不相等,包括自己本身。
  • isNaN( ):判斷參數(shù)是否不是數(shù)值,函數(shù)在接收到參數(shù)后,會(huì)先嘗試將參數(shù)轉(zhuǎn)成數(shù)值型,不能轉(zhuǎn)成數(shù)值的參數(shù)會(huì)返回true;轉(zhuǎn)成數(shù)值的部分,如果參數(shù)是NaN則返回true

數(shù)值轉(zhuǎn)換

  • Number( ):將任何類型參數(shù)轉(zhuǎn)成數(shù)值
數(shù)據(jù)類型 轉(zhuǎn)換結(jié)果
Number number
Boolean true:1
false:0
Undefined NaN
String 1. 只包含數(shù)字,忽略前導(dǎo)0,返回?cái)?shù)值
2. 包含有效浮點(diǎn)格式,忽略前導(dǎo)0,返回?cái)?shù)值
3. 包含有效的十六進(jìn)制格式,如:0xA, 返回對(duì)應(yīng)的十進(jìn)制數(shù)值
4. 空字符串,返回0
5.包含除上述格式之外字符,返回NaN
Object 1. null:0
2. 非空,調(diào)用對(duì)象的valueOf( ) 方法,然后按照前面的規(guī)則返回相應(yīng)值,如果返回結(jié)果為NaN,則再調(diào)用對(duì)象的toString( )方法,繼續(xù)按照規(guī)則轉(zhuǎn)換
  • parseInt(args, [type]):將字符型參數(shù)轉(zhuǎn)成數(shù)值,忽略空格,提供兩個(gè)參數(shù),第一個(gè)表示要轉(zhuǎn)換的參數(shù),第二個(gè)用來指定轉(zhuǎn)換基數(shù)
判斷過程 轉(zhuǎn)換結(jié)果
第一個(gè)字符非負(fù)號(hào),非數(shù)值 NaN
字符串以"0x"開頭 按照十六進(jìn)制格式轉(zhuǎn)換
遇到非數(shù)字字符,包含小數(shù)點(diǎn) 停止解析,返回結(jié)果, 如"22.5",返回22
  • parseFloat( ):將字符型參數(shù)轉(zhuǎn)成數(shù)值,忽略空格,與parseInt(
    )用法類似,只是只解析十進(jìn)制,不提供第二個(gè)參數(shù),且認(rèn)為第一個(gè)小數(shù)點(diǎn)為有效的

(五) String

特殊的字符字面量,轉(zhuǎn)義序列,用于表示非打印序列

字面量 含義
\n 換行
\t 制表符,相當(dāng)于tab鍵
\b 空格
\r 回車
\f 進(jìn)紙換頁
\\ 斜杠
' 單引號(hào),在單引號(hào)字符串使用,如:let string = 'He say \'hi\'.'
" 雙引號(hào),在雙引號(hào)字符串使用,如:let string = "He say \"hi\"."
\xnn 以十六進(jìn)制nn表示的字符
\unnn 以十六進(jìn)制nnnn表示的Unicode字符

注意:

  • 獲取字符串長(zhǎng)度時(shí),string.length空格算1個(gè)字符,多個(gè)字符的轉(zhuǎn)義序列算一個(gè)字符。
  • toString()方法:轉(zhuǎn)成字符型,數(shù)值、布爾值、對(duì)象和字符串都有該方法,null和undefined沒有該方法,使用該方法會(huì)報(bào)錯(cuò)。對(duì)于數(shù)字的的轉(zhuǎn)換,默認(rèn)采用十進(jìn)制,toString方法可以接受一個(gè)參數(shù),來指定轉(zhuǎn)換數(shù)字采用的進(jìn)制類型。
  • String(arg)方法:轉(zhuǎn)成字符型,如果參數(shù)有toString()方法,則返回對(duì)應(yīng)結(jié)果,如果null則返回null,undefined返回undefined。
  • toLowerCase()方法:轉(zhuǎn)成小寫
  • toLocaleLowerCase()方法:轉(zhuǎn)成小寫,針對(duì)特定地區(qū)
  • toUpperCase()方法:轉(zhuǎn)成大寫
  • toLocaleUpperCase()方法:轉(zhuǎn)成大寫,針對(duì)特定地區(qū)

二、ES6的symbol類型

之前有講到過「[每日一題]ES6 中為什么要使用 Symbol?」。

三、引用類型

一組數(shù)據(jù)與功能的集合。

Object是所有它的實(shí)例的基礎(chǔ),即Object類型所具有的任何屬性和方法也同樣存在于更具象的實(shí)例中。

引用類型的值是保存在內(nèi)存中的變量,即操作對(duì)象時(shí),實(shí)際上操作的是對(duì)象的引用而不是對(duì)象的指針。

Object的每個(gè)實(shí)例都具有一下屬性和方法

屬性/方法 含義
constructor 構(gòu)造函數(shù),保存用于創(chuàng)建當(dāng)前對(duì)象的函數(shù),如:let o = new Object(), 則對(duì)象 o 的構(gòu)造函數(shù)就是 Object()
hasOwnProperty(propertyName) 用于檢查給定的屬性是否在當(dāng)前實(shí)例中【而不是實(shí)例的原型中】,其中參數(shù)propertyName必須是字符串
A.isPrototypeOf(B) 用于A對(duì)象是否是B對(duì)象的原型
obj.propertyIsEnumerable(propertyName) 用于檢查給定的屬性能否使用for-in語句進(jìn)行枚舉,其中參數(shù)propertyName必須是字符串
toLocaleString() 返回對(duì)象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)
toString() 返回對(duì)象的字符串表示
valueOf() 返回對(duì)象的字符串、數(shù)值或布爾值表示,通常與toString()返回結(jié)果一致

注意:

  • 引用類型的復(fù)制,在操作結(jié)束以后,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象,改變其中一個(gè)變量的值,也會(huì)影響另一個(gè)變量。
  • 不管是基礎(chǔ)類型還是引用類型,參數(shù)都是按值傳遞的

1. Object類型

  • 可使用new操作符后面跟構(gòu)造函數(shù)的方式,如 let o = new Object()
  • 可使用對(duì)象字面量的形式創(chuàng)建, 如 let o = {name: 'test'}

2. Array類型

數(shù)組的每一項(xiàng)可以保存任意類型的數(shù)據(jù),且數(shù)組的大小是可以動(dòng)態(tài)調(diào)整的。

  • 可使用new操作符后面跟Array構(gòu)造函數(shù)的方式,如 let a = new Array(),也可以傳遞數(shù)值創(chuàng)建指定長(zhǎng)度的數(shù)組,如 let a = new Array(20), 也可以省略new操作符
  • 可使用數(shù)組字面量的形式創(chuàng)建,如 let a = [0, 1, 2]

數(shù)組常用方法

  • length:返回?cái)?shù)組的長(zhǎng)度,且length非只讀,可修改
  • Arrag.isArray(value): 用來確定value是不是數(shù)組
  • push():棧方法【先進(jìn)后出】,添加到數(shù)組的末尾,并返回修改后數(shù)組的長(zhǎng)度
  • pop():棧方法【先進(jìn)后出】,移除數(shù)組的最后一項(xiàng),并返回該項(xiàng)
  • shift():隊(duì)列方法【先進(jìn)先出】,移除數(shù)組的第一項(xiàng),并返回該項(xiàng)
  • unshift():dailies方法【先進(jìn)先出】,添加到數(shù)組的開頭,并返回修改后數(shù)組的長(zhǎng)度
  • reverse(): 返回逆序后的數(shù)組
  • sort():按照字符編碼排序,可指定排序規(guī)則,返回排序后的數(shù)組
  • concat():返回拼接后的新數(shù)組,原數(shù)組不變
  • slice(startiIdx, endIdx):返回根據(jù)位置創(chuàng)建的新數(shù)組,原數(shù)組不變。如果傳遞的參數(shù)中有負(fù)數(shù),則用數(shù)組的長(zhǎng)度加上該參數(shù)來確定相應(yīng)的位置。如果end<start,則返回空數(shù)組
  • splice():可以對(duì)數(shù)組進(jìn)行多種操作,插入、刪除、替換
  • indexOf():兩個(gè)參數(shù)第一個(gè)參數(shù)是查找項(xiàng),第二個(gè)是查找的起點(diǎn)位置索引[可選],返回查找項(xiàng)在數(shù)組中的位置,沒查到的情況返回-1
  • lastIndexOf():兩個(gè)參數(shù)第一個(gè)參數(shù)是查找項(xiàng),第二個(gè)是查找的起點(diǎn)位置索引[可選],返回查找項(xiàng)在數(shù)組中的位置,從數(shù)組的末尾開始查找,沒查到的情況返回-1
  • every():對(duì)每一項(xiàng)執(zhí)行指定函數(shù),每一項(xiàng)都返回true,則返回true
  • filter():對(duì)每一項(xiàng)執(zhí)行指定函數(shù),返回該函數(shù)返回true 的項(xiàng)組成的數(shù)組
  • forEach():對(duì)每一項(xiàng)執(zhí)行指定函數(shù),無返回值
  • map():對(duì)每一項(xiàng)執(zhí)行指定函數(shù),返回每次調(diào)用結(jié)果組成的數(shù)組
  • some():對(duì)每一項(xiàng)執(zhí)行指定函數(shù),若函數(shù)中的任意一項(xiàng)都返回true,則返回true
  • reduce():從數(shù)組的第一項(xiàng)開始,迭代數(shù)組的所有項(xiàng),返回最終值
  • reduceRight():從數(shù)組的最后一項(xiàng)開始,迭代數(shù)組的所有項(xiàng),返回最終值

3. Date類型

  • 可使用new操作符后面跟Date構(gòu)造函數(shù)的方式,如 let d = new Date(),如果根據(jù)指定的時(shí)間創(chuàng)建日期對(duì)象,則參數(shù)必須是改日期的毫秒數(shù)【即從1970年1月1日午夜起到該日期的毫秒數(shù)】,如果直接在Date()傳遞日期字符串,則會(huì)在后臺(tái)調(diào)用Date.parse()方法獲取毫秒數(shù)。

日期常用方法

  • Date.parse():返回指定日期毫秒數(shù)。接收表示日期的字符串做參數(shù),如果字符串不能表示日期,則返回NAN,如:let d2 = new Date(Date.parse(May 25, 2004))
  • Date.UTC(): 返回指定日期毫秒數(shù)。接收的參數(shù)與Date.parse()不同 如:let d2 = new Date(Date.UTC(2000, 1, 2, 17, 55, 55))
  • Date.now(): 返回調(diào)用方法的日期的毫秒數(shù)

4. RegExp類型

  • 可使用正則表達(dá)式字面量的方法創(chuàng)建正則表達(dá)式 let expression = / pattern / flags,其中pattern模式部分可以是任何簡(jiǎn)單或復(fù)雜的正則表達(dá)式,每個(gè)正則表達(dá)式都可帶有一個(gè)或多個(gè)flags標(biāo)志。
  • 可使用new操作符后面跟RegExp構(gòu)造函數(shù)的方式,如let pattren = new RegExp("[bc]at", "i")

目前支持的標(biāo)志有三種:

  • g: 表示全局模式,即該模式將被應(yīng)用于所有的字符串
  • i: 表示不區(qū)分大小寫
  • m: 表示可以匹配多行

注意

  • 元字符在正則表達(dá)式中都有一種或多種用途,如果要匹配的字符串中包含這些字符,則需要對(duì)它們進(jìn)行轉(zhuǎn)義,元字符包括:( [ { \ ^ $ | ) ? * + .]}

RegExp實(shí)例屬性

  • global: 表示是否設(shè)置了g標(biāo)志
  • ignoreCase: 表示是否設(shè)置了i標(biāo)志
  • lastIndex: 表示開始搜索下一個(gè)匹配項(xiàng)的字符位置,從零開始
  • multiline: 表示是否設(shè)置了m標(biāo)志
  • source: 正則表達(dá)式的字符串表示

RegExp實(shí)例方法

  • exec():參數(shù)為將要使用該模式匹配的字符串,返回第一個(gè)匹配項(xiàng)信息的數(shù)組。 exec每次只會(huì)返回一個(gè)匹配項(xiàng),在全局的情況下,每次調(diào)用方法,都會(huì)在字符串種繼續(xù)查找新的匹配項(xiàng);非全局下,始終返回第一個(gè)匹配項(xiàng)。
  • test():參數(shù)為將要使用該模式匹配的字符串,匹配的情況返回true,反之 false。

5. Function類型

  • 可使用函數(shù)聲明語法定義,解析器會(huì)預(yù)先讀取函數(shù)聲明,可以在任何地方使用。如: function a () {}
  • 可使用函數(shù)表達(dá)式的形式定義,必須解析過后才可以使用,如 let a = function () {}。這種情況下創(chuàng)建的函數(shù)為匿名函數(shù),因?yàn)閒unction關(guān)鍵字后面沒有標(biāo)識(shí)符,也稱為拉姆達(dá)函數(shù)。
  • 可使用構(gòu)造函數(shù)的形式定義,如 let a = new function () // 不推薦

注意

  • 函數(shù)無重載,即命名相同的函數(shù),最后一個(gè)會(huì)覆蓋掉之前的函數(shù)。

函數(shù)內(nèi)部屬性

  • this:引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象,在全局作用域中調(diào)用函數(shù)時(shí),this對(duì)象引用的就是window
  • arguements:類數(shù)組對(duì)象,包含傳入函數(shù)中的所有參數(shù)。注意,arguements下有一個(gè)屬性callee,該屬性是一個(gè)指針,指向擁有arguements對(duì)象的函數(shù)

函數(shù)的屬性和方法

  • length:接收的參數(shù)的個(gè)數(shù)
  • prototype:不可枚舉,保存所有實(shí)例方法的真正所在
  • apply():在指定的作用域中調(diào)用函數(shù),即設(shè)置函數(shù)的this對(duì)象值,接收兩個(gè)值,第一個(gè)值為運(yùn)行函數(shù)的作用域,第二個(gè)值是參數(shù)數(shù)組[數(shù)組|arguments對(duì)象]
  • call():與apply()用法一致,只是第二個(gè)參數(shù)不能傳遞數(shù)組,需要將參數(shù)一個(gè)一個(gè)傳遞
  • bind():將this的值綁定到傳給bind()函數(shù)的值

6. 內(nèi)置對(duì)象--Global對(duì)象

所有在全局作用域種定義的屬性和方法都是Global的屬性。

編碼方法:

  • encodeURI():對(duì)URI進(jìn)行編碼,將無效的字符使用utf-8編碼替換,然后發(fā)送給瀏覽器,以便瀏覽器接受和理解。作用于整個(gè)URI,不會(huì)對(duì)本身屬于URI的特殊字符編碼。
  • encodeURIComponent():對(duì)URI的某一段進(jìn)行編碼,會(huì)對(duì)它認(rèn)為的所有非標(biāo)準(zhǔn)字符進(jìn)行編碼。因此在使用過程中,對(duì)整個(gè)URI使用encodeURI(),對(duì)附加在現(xiàn)有URI后的字符串使用encodeURIComponent()
  • decodeURI():解碼,只能解析encodeURI編碼的部分
  • decodeURIComponent():解碼,只能解析encodeURIComponent編碼部分

7. 內(nèi)置對(duì)象--Math對(duì)象

Math對(duì)象的屬性

屬性/方法 含義
MATH.E 自然對(duì)數(shù)的底數(shù),即e的值
MATH.LN10 10的自然對(duì)數(shù)
MATH.LN2 2的自然對(duì)數(shù)
MATH.LOG2E 以2為底的對(duì)數(shù)
MATH.LOG10E 以10為底的對(duì)數(shù)
MATH.PI 2的自然對(duì)數(shù)
MATH.SQRT1_2 1/2的平方根
MATH.SQRT2 2的平方根
max() 獲取最大值
min() 獲取最小值
ceil() 向上舍入
floor() 向下舍入
round() 四舍五入
random() 返回0-1范圍內(nèi)的隨機(jī)數(shù)
abs() 絕對(duì)值

謝謝支持

1、作者昵稱:saucxs,songEagle,松寶寫代碼?!杆蓪殞懘a」公眾號(hào)作者,每日一題,實(shí)驗(yàn)室等。一個(gè)愛好折騰,致力于全棧,正在努力成長(zhǎng)的字節(jié)跳動(dòng)工程師,星辰大海,未來可期。內(nèi)推字節(jié)跳動(dòng)各個(gè)部門各個(gè)崗位。

2、長(zhǎng)按下面圖片,關(guān)注「松寶寫代碼」,是獲取開發(fā)知識(shí)體系構(gòu)建,精選文章,項(xiàng)目實(shí)戰(zhàn),實(shí)驗(yàn)室,每日一道面試題,進(jìn)階學(xué)習(xí),思考職業(yè)發(fā)展,涉及到JavaScript,Node,Vue,React,瀏覽器,http,算法,端相關(guān),小程序等領(lǐng)域,希望可以幫助到你,我們一起成長(zhǎng)~

[圖片上傳失敗...(image-3cfd5d-1611643902109)]

3、文章喜歡的話可以「分享,點(diǎn)贊,在看」三連哦。

4、紅包??福利

各位大佬們,用電腦PC和掘金App,幫我每天幫忙打卡投票領(lǐng)紅包:

  • 1、PC:https://rank.juejin.cn/?u=saucxs&t=user,每天投我x票,然后截圖。

  • 2、APP:下載掘金APP,打開后從首頁活動(dòng)頁進(jìn)入,搜索saucxs,投我x票,然后截圖。

  • 3、在「松寶寫代碼」公眾號(hào)后臺(tái)回復(fù)我截圖,然后我們抽獎(jiǎng)發(fā)紅包,從1.27開始每天都投遞的,有更多驚喜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容