關(guān)注「松寶寫代碼」沟娱,精選好文确沸,每日一題
?時間永遠是自己的
每分每秒也都是為自己的將來鋪墊和增值
作者:saucxs | songEagle
2020,實「鼠」不易
2021愈腾,「攀哒悖」轉(zhuǎn)乾坤
風(fēng)勁潮涌當(dāng)揚帆,任重道遠須奮蹄誊爹!
[圖片上傳失敗...(image-36cb62-1611643902109)]
hello骑疆,大家好,我是「松寶寫代碼」的作者songEagle替废,今天是元旦箍铭,一元復(fù)始,萬象更新椎镣≌┗穑看到大家已經(jīng)在寫年終總結(jié),我一般每年除夕左右的時候出年終總結(jié)状答,近期會去回顧這一年做了哪些冷守,哪些做的不好,希望大家留言惊科,可以給我提提意見拍摇。
?
一、前言
2020.12.23 日剛立的 flag馆截,每日一題充活,題目類型不限制,可以是:算法題蜡娶,面試題混卵,闡述題等等。
本文是「每日一題」第 10 題:[每日一題]面試官問:詳細說一下JS數(shù)據(jù)類型
[圖片上傳失敗...(image-a73e21-1611643902109)]
往期「每日一題」:
二、JS數(shù)據(jù)類型
我們在回答的時候低剔,很容易把symbol這個類型說漏,之前有講到過「[每日一題]ES6 中為什么要使用 Symbol肮塞?」襟齿。
數(shù)據(jù)類型:
- 1、5種基本類型
- 2枕赵、ES6的symbol類型
- 3猜欺、引用類型
三、5種基本數(shù)據(jù)類型
(一)Undefined
只有一個特殊值unfefined拷窜,變量在未初始化的情況下开皿,值為undefined
出現(xiàn)undefined的情況:
- 1、預(yù)編譯階段篮昧,進行變量提升時赋荆,只聲明,未定義懊昨,變量值為undefined窄潭;
- 2、函數(shù)無return酵颁,或者return后什么也沒有時嫉你,默認返回值為undefined;
- 3躏惋、函數(shù)定義的參數(shù)未傳值時幽污,默認為undefined;
- 4簿姨、查到一個對象不存在的屬性時距误,返回undefined;
- 5扁位、數(shù)組find方法中深寥,沒找到時,返回為undefined贤牛。
(二)Null
只有一個特殊值null惋鹅,表示空對象指針
出現(xiàn)null的情況:
- 未獲取到指定的dom元素對象時,返回為null殉簸;
- Object.prototype.proto 值為null闰集;
- 正則捕獲沽讹,無結(jié)果時,返回為null武鲁。
(三) Boolean
包含兩個字面值:true
爽雄、false
。
數(shù)據(jù)類型 | true | false |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | 空字符串 |
Number | 任何非零數(shù)字值(包含正負無窮值) | NaN, 0 |
Object | 任何非空對象 | null |
Undefined | undefined |
(四) Number
- 十進制:如
let number = 12
- 八進制:第一位為0沐鼠,然后是八進制數(shù)字序列0-7挚瘟,如:
let number = 012
,表示十進制的數(shù)字10
饲梭。數(shù)值超出范圍時乘盖,前導(dǎo)0將被忽略,后面的數(shù)值當(dāng)成十進制處理憔涉。嚴格模式無效 - 十六進制:前兩位為0x,=订框,然后是十六進制數(shù)字0-9及A-F/a-f,如:
let number = 0xA
兜叨,表示十進制的數(shù)字10
穿扳。
注意
- 浮點數(shù):計算會產(chǎn)生誤差
常用方法、屬性
- 浮點數(shù):計算會產(chǎn)生誤差
- Number.MIN_VALUE:ECMAScript可表示的最小值
- Number.MAX_VALUE:ECMAScript可表示的最大值
- +Infinity:超出范圍的值国旷,正無窮矛物,如:
1/0
,返回Infinity
跪但。不能參與計算 - -Infinity:超出范圍的值泽谨,負無窮,如:
-1/0
特漩,返回-Infinity
吧雹。不能參與計算 - isFinite( ):判斷是否有窮值,在范圍內(nèi)的數(shù)值返回
true
- NaN:特殊數(shù)值涂身,非數(shù)值雄卷,用來表示本應(yīng)返回數(shù)值的操作數(shù)未返回數(shù)值的情況,如:零除以零蛤售,返回NaN丁鹉。特點:1. 任何涉及NaN的操作都返回NaN;2. NaN與任何值都不相等悴能,包括自己本身揣钦。
- isNaN( ):判斷參數(shù)是否不是數(shù)值,函數(shù)在接收到參數(shù)后漠酿,會先嘗試將參數(shù)轉(zhuǎn)成數(shù)值型冯凹,不能轉(zhuǎn)成數(shù)值的參數(shù)會返回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匈庭,返回數(shù)值 2. 包含有效浮點格式,忽略前導(dǎo)0浑劳,返回數(shù)值 3. 包含有效的十六進制格式阱持,如: 0xA , 返回對應(yīng)的十進制數(shù)值4. 空字符串魔熏,返回0 5.包含除上述格式之外字符衷咽,返回NaN |
Object | 1. null:0 2. 非空,調(diào)用對象的valueOf( ) 方法蒜绽,然后按照前面的規(guī)則返回相應(yīng)值镶骗,如果返回結(jié)果為NaN,則再調(diào)用對象的toString( )方法滓窍,繼續(xù)按照規(guī)則轉(zhuǎn)換 |
-
parseInt(args, [type])
:將字符型參數(shù)轉(zhuǎn)成數(shù)值卖词,忽略空格巩那,提供兩個參數(shù)吏夯,第一個表示要轉(zhuǎn)換的參數(shù),第二個用來指定轉(zhuǎn)換基數(shù)
判斷過程 | 轉(zhuǎn)換結(jié)果 |
---|---|
第一個字符非負號即横,非數(shù)值 | NaN |
字符串以"0x"開頭 | 按照十六進制格式轉(zhuǎn)換 |
遇到非數(shù)字字符噪生,包含小數(shù)點 | 停止解析,返回結(jié)果东囚, 如"22.5" 跺嗽,返回22 |
-
parseFloat( )
:將字符型參數(shù)轉(zhuǎn)成數(shù)值,忽略空格页藻,與parseInt(
)用法類似桨嫁,只是只解析十進制,不提供第二個參數(shù)份帐,且認為第一個小數(shù)點為有效的
(五) String
特殊的字符字面量璃吧,轉(zhuǎn)義序列,用于表示非打印序列
字面量 | 含義 |
---|---|
\n | 換行 |
\t | 制表符废境,相當(dāng)于tab鍵 |
\b | 空格 |
\r | 回車 |
\f | 進紙換頁 |
\\ | 斜杠 |
' | 單引號畜挨,在單引號字符串使用,如:let string = 'He say \'hi\'.'
|
" | 雙引號噩凹,在雙引號字符串使用巴元,如:let string = "He say \"hi\"."
|
\xnn | 以十六進制nn表示的字符 |
\unnn | 以十六進制nnnn表示的Unicode字符 |
注意:
- 獲取字符串長度時,
string.length
空格算1個字符驮宴,多個字符的轉(zhuǎn)義序列算一個字符逮刨。 -
toString()
方法:轉(zhuǎn)成字符型,數(shù)值堵泽、布爾值禀忆、對象和字符串都有該方法臊旭,null和undefined沒有該方法,使用該方法會報錯箩退。對于數(shù)字的的轉(zhuǎn)換离熏,默認采用十進制,toString方法可以接受一個參數(shù)戴涝,來指定轉(zhuǎn)換數(shù)字采用的進制類型滋戳。 -
String(arg)
方法:轉(zhuǎn)成字符型,如果參數(shù)有toString()方法啥刻,則返回對應(yīng)結(jié)果奸鸯,如果null則返回null,undefined返回undefined可帽。 -
toLowerCase()
方法:轉(zhuǎn)成小寫 -
toLocaleLowerCase()
方法:轉(zhuǎn)成小寫娄涩,針對特定地區(qū) -
toUpperCase()
方法:轉(zhuǎn)成大寫 -
toLocaleUpperCase()
方法:轉(zhuǎn)成大寫,針對特定地區(qū)
二映跟、ES6的symbol類型
之前有講到過「[每日一題]ES6 中為什么要使用 Symbol蓄拣?」。
三努隙、引用類型
一組數(shù)據(jù)與功能的集合球恤。
Object是所有它的實例的基礎(chǔ),即Object類型所具有的任何屬性和方法也同樣存在于更具象的實例中荸镊。
引用類型的值是保存在內(nèi)存中的變量咽斧,即操作對象時,實際上操作的是對象的引用而不是對象的指針躬存。
Object的每個實例都具有一下屬性和方法
屬性/方法 | 含義 |
---|---|
constructor |
構(gòu)造函數(shù)张惹,保存用于創(chuàng)建當(dāng)前對象的函數(shù),如:let o = new Object()岭洲, 則對象 o 的構(gòu)造函數(shù)就是 Object() |
hasOwnProperty(propertyName) |
用于檢查給定的屬性是否在當(dāng)前實例中【而不是實例的原型中】宛逗,其中參數(shù)propertyName 必須是字符串 |
A.isPrototypeOf(B) |
用于A對象是否是B對象的原型 |
obj.propertyIsEnumerable(propertyName) |
用于檢查給定的屬性能否使用for-in語句進行枚舉,其中參數(shù)propertyName 必須是字符串 |
toLocaleString() |
返回對象的字符串表示钦椭,該字符串與執(zhí)行環(huán)境的地區(qū)對應(yīng) |
toString() |
返回對象的字符串表示 |
valueOf() |
返回對象的字符串拧额、數(shù)值或布爾值表示,通常與toString()返回結(jié)果一致 |
注意:
- 引用類型的復(fù)制彪腔,在操作結(jié)束以后侥锦,兩個變量實際上將引用同一個對象,改變其中一個變量的值德挣,也會影響另一個變量恭垦。
- 不管是基礎(chǔ)類型還是引用類型,參數(shù)都是按值傳遞的
1. Object類型
- 可使用new操作符后面跟構(gòu)造函數(shù)的方式,如
let o = new Object()
- 可使用對象字面量的形式創(chuàng)建番挺, 如
let o = {name: 'test'}
2. Array類型
數(shù)組的每一項可以保存任意類型的數(shù)據(jù)唠帝,且數(shù)組的大小是可以動態(tài)調(diào)整的。
- 可使用new操作符后面跟Array構(gòu)造函數(shù)的方式玄柏,如
let a = new Array()
襟衰,也可以傳遞數(shù)值創(chuàng)建指定長度的數(shù)組,如let a = new Array(20)
粪摘, 也可以省略new操作符 - 可使用數(shù)組字面量的形式創(chuàng)建瀑晒,如
let a = [0, 1, 2]
數(shù)組常用方法:
-
length
:返回數(shù)組的長度,且length非只讀徘意,可修改 -
Arrag.isArray(value)
: 用來確定value是不是數(shù)組 -
push()
:棧方法【先進后出】苔悦,添加到數(shù)組的末尾,并返回修改后數(shù)組的長度 -
pop()
:棧方法【先進后出】椎咧,移除數(shù)組的最后一項玖详,并返回該項 -
shift()
:隊列方法【先進先出】,移除數(shù)組的第一項勤讽,并返回該項 -
unshift()
:dailies方法【先進先出】蟋座,添加到數(shù)組的開頭,并返回修改后數(shù)組的長度 -
reverse()
: 返回逆序后的數(shù)組 -
sort()
:按照字符編碼排序地技,可指定排序規(guī)則蜈七,返回排序后的數(shù)組 -
concat()
:返回拼接后的新數(shù)組秒拔,原數(shù)組不變 -
slice(startiIdx, endIdx)
:返回根據(jù)位置創(chuàng)建的新數(shù)組莫矗,原數(shù)組不變。如果傳遞的參數(shù)中有負數(shù)砂缩,則用數(shù)組的長度加上該參數(shù)來確定相應(yīng)的位置作谚。如果end<start,則返回空數(shù)組 -
splice()
:可以對數(shù)組進行多種操作庵芭,插入妹懒、刪除、替換 -
indexOf()
:兩個參數(shù)第一個參數(shù)是查找項双吆,第二個是查找的起點位置索引[可選]眨唬,返回查找項在數(shù)組中的位置,沒查到的情況返回-1 -
lastIndexOf()
:兩個參數(shù)第一個參數(shù)是查找項好乐,第二個是查找的起點位置索引[可選]匾竿,返回查找項在數(shù)組中的位置,從數(shù)組的末尾開始查找蔚万,沒查到的情況返回-1 -
every()
:對每一項執(zhí)行指定函數(shù),每一項都返回true,則返回true -
filter()
:對每一項執(zhí)行指定函數(shù)锭汛,返回該函數(shù)返回true 的項組成的數(shù)組 -
forEach()
:對每一項執(zhí)行指定函數(shù),無返回值 -
map()
:對每一項執(zhí)行指定函數(shù)假夺,返回每次調(diào)用結(jié)果組成的數(shù)組 -
some()
:對每一項執(zhí)行指定函數(shù),若函數(shù)中的任意一項都返回true斋攀,則返回true -
reduce()
:從數(shù)組的第一項開始已卷,迭代數(shù)組的所有項,返回最終值 -
reduceRight()
:從數(shù)組的最后一項開始淳蔼,迭代數(shù)組的所有項悼尾,返回最終值
3. Date類型
- 可使用new操作符后面跟Date構(gòu)造函數(shù)的方式,如
let d = new Date()
肖方,如果根據(jù)指定的時間創(chuàng)建日期對象闺魏,則參數(shù)必須是改日期的毫秒數(shù)【即從1970年1月1日午夜起到該日期的毫秒數(shù)】,如果直接在Date()傳遞日期字符串俯画,則會在后臺調(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類型
- 可使用正則表達式字面量的方法創(chuàng)建正則表達式
let expression = / pattern / flags
娩怎,其中pattern模式部分可以是任何簡單或復(fù)雜的正則表達式,每個正則表達式都可帶有一個或多個flags標志胰柑。 - 可使用new操作符后面跟RegExp構(gòu)造函數(shù)的方式截亦,如
let pattren = new RegExp("[bc]at", "i")
目前支持的標志有三種:
-
g
: 表示全局模式,即該模式將被應(yīng)用于所有的字符串 -
i
: 表示不區(qū)分大小寫 -
m
: 表示可以匹配多行
注意
- 元字符在正則表達式中都有一種或多種用途柬讨,如果要匹配的字符串中包含這些字符崩瓤,則需要對它們進行轉(zhuǎn)義,元字符包括:
( [ { \ ^ $ | ) ? * + .]}
RegExp實例屬性
-
global
: 表示是否設(shè)置了g標志 -
ignoreCase
: 表示是否設(shè)置了i標志 -
lastIndex
: 表示開始搜索下一個匹配項的字符位置踩官,從零開始 -
multiline
: 表示是否設(shè)置了m標志 -
source
: 正則表達式的字符串表示
RegExp實例方法
-
exec()
:參數(shù)為將要使用該模式匹配的字符串却桶,返回第一個匹配項信息的數(shù)組。 exec每次只會返回一個匹配項蔗牡,在全局的情況下颖系,每次調(diào)用方法,都會在字符串種繼續(xù)查找新的匹配項辩越;非全局下嘁扼,始終返回第一個匹配項。 -
test()
:參數(shù)為將要使用該模式匹配的字符串区匣,匹配的情況返回true偷拔,反之 false蒋院。
5. Function類型
- 可使用
函數(shù)聲明
語法定義,解析器會預(yù)先讀取函數(shù)聲明莲绰,可以在任何地方使用欺旧。如:function a () {}
- 可使用
函數(shù)表達式
的形式定義,必須解析過后才可以使用蛤签,如let a = function () {}
辞友。這種情況下創(chuàng)建的函數(shù)為匿名函數(shù),因為function關(guān)鍵字后面沒有標識符震肮,也稱為拉姆達函數(shù)称龙。 - 可使用構(gòu)造函數(shù)的形式定義,如
let a = new function () // 不推薦
注意
- 函數(shù)無重載戳晌,即命名相同的函數(shù)鲫尊,最后一個會覆蓋掉之前的函數(shù)。
函數(shù)內(nèi)部屬性
-
this
:引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對象沦偎,在全局作用域中調(diào)用函數(shù)時疫向,this對象引用的就是window -
arguements
:類數(shù)組對象,包含傳入函數(shù)中的所有參數(shù)豪嚎。注意搔驼,arguements下有一個屬性callee
,該屬性是一個指針侈询,指向擁有arguements對象的函數(shù)
函數(shù)的屬性和方法
-
length
:接收的參數(shù)的個數(shù) -
prototype
:不可枚舉舌涨,保存所有實例方法的真正所在 -
apply()
:在指定的作用域中調(diào)用函數(shù),即設(shè)置函數(shù)的this對象值扔字,接收兩個值囊嘉,第一個值為運行函數(shù)的作用域,第二個值是參數(shù)數(shù)組[數(shù)組|arguments對象] -
call()
:與apply()用法一致啦租,只是第二個參數(shù)不能傳遞數(shù)組哗伯,需要將參數(shù)一個一個傳遞 -
bind()
:將this的值綁定到傳給bind()函數(shù)的值
6. 內(nèi)置對象--Global對象
所有在全局作用域種定義的屬性和方法都是Global的屬性荒揣。
編碼方法:
-
encodeURI()
:對URI進行編碼篷角,將無效的字符使用utf-8編碼替換,然后發(fā)送給瀏覽器系任,以便瀏覽器接受和理解恳蹲。作用于整個URI,不會對本身屬于URI的特殊字符編碼俩滥。 -
encodeURIComponent()
:對URI的某一段進行編碼嘉蕾,會對它認為的所有非標準字符進行編碼。因此在使用過程中霜旧,對整個URI使用encodeURI()错忱,對附加在現(xiàn)有URI后的字符串使用encodeURIComponent() -
decodeURI()
:解碼,只能解析encodeURI編碼的部分 -
decodeURIComponent()
:解碼,只能解析encodeURIComponent編碼部分
7. 內(nèi)置對象--Math對象
Math對象的屬性
屬性/方法 | 含義 |
---|---|
MATH.E |
自然對數(shù)的底數(shù)以清,即e的值 |
MATH.LN10 |
10的自然對數(shù) |
MATH.LN2 |
2的自然對數(shù) |
MATH.LOG2E |
以2為底的對數(shù) |
MATH.LOG10E |
以10為底的對數(shù) |
MATH.PI |
2的自然對數(shù) |
MATH.SQRT1_2 |
1/2的平方根 |
MATH.SQRT2 |
2的平方根 |
max() |
獲取最大值 |
min() |
獲取最小值 |
ceil() |
向上舍入 |
floor() |
向下舍入 |
round() |
四舍五入 |
random() |
返回0-1范圍內(nèi)的隨機數(shù) |
abs() |
絕對值 |
謝謝支持
1儿普、作者昵稱:saucxs,songEagle掷倔,松寶寫代碼眉孩。「松寶寫代碼」公眾號作者勒葱,每日一題浪汪,實驗室等。一個愛好折騰凛虽,致力于全棧死遭,正在努力成長的字節(jié)跳動工程師,星辰大海凯旋,未來可期殃姓。內(nèi)推字節(jié)跳動各個部門各個崗位。
2瓦阐、長按下面圖片蜗侈,關(guān)注「松寶寫代碼」,是獲取開發(fā)知識體系構(gòu)建睡蟋,精選文章踏幻,項目實戰(zhàn),實驗室戳杀,每日一道面試題该面,進階學(xué)習(xí),思考職業(yè)發(fā)展信卡,涉及到JavaScript隔缀,Node,Vue傍菇,React猾瘸,瀏覽器,http丢习,算法牵触,端相關(guān),小程序等領(lǐng)域咐低,希望可以幫助到你揽思,我們一起成長~
[圖片上傳失敗...(image-3cfd5d-1611643902109)]
3、文章喜歡的話可以「分享见擦,點贊钉汗,在看」三連哦羹令。
4、紅包??福利
各位大佬們损痰,用電腦PC和掘金App特恬,幫我每天幫忙打卡投票領(lǐng)紅包:
1、PC:https://rank.juejin.cn/?u=saucxs&t=user徐钠,每天投我x票癌刽,然后截圖。
2尝丐、APP:下載掘金APP显拜,打開后從首頁活動頁進入,搜索saucxs爹袁,投我x票远荠,然后截圖。
3失息、在「松寶寫代碼」公眾號后臺回復(fù)我截圖譬淳,然后我們抽獎發(fā)紅包,從1.27開始每天都投遞的盹兢,有更多驚喜邻梆。