關(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開始每天都投遞的,有更多驚喜。