更新時(shí)間:2022-12-23 15:15:02 來源:動力節(jié)點(diǎn) 瀏覽1314次
1. 介紹 js 的基本數(shù)據(jù)類型。
js 一共有六種基本數(shù)據(jù)類型,分別是 Undefined、Null、Boolean、Number、String,還有在 ES6 中新增的 Symbol 類型,代表創(chuàng)建后獨(dú)一無二且不可變的數(shù)據(jù)類型,它的出現(xiàn)我認(rèn)為主要是為了解決可能出現(xiàn)的全局變量沖突的問題。
2. JavaScript 有幾種類型的值?你能畫一下他們的內(nèi)存圖嗎?
js 可以分為兩種類型的值,一種是基本數(shù)據(jù)類型,一種是復(fù)雜數(shù)據(jù)類型。
基本數(shù)據(jù)類型....(參考1)
復(fù)雜數(shù)據(jù)類型指的是 Object 類型,所有其他的如 Array、Date 等數(shù)據(jù)類型都可以理解為 Object 類型的子類。
兩種類型間的主要區(qū)別是它們的存儲位置不同,基本數(shù)據(jù)類型的值直接保存在棧中,而復(fù)雜數(shù)據(jù)類型的值保存在堆中,通過使用在棧中保存對應(yīng)的指針來獲取堆中的值。
3. 什么是堆?什么是棧?它們之間有什么區(qū)別和聯(lián)系?
堆和棧的概念存在于數(shù)據(jù)結(jié)構(gòu)中和操作系統(tǒng)內(nèi)存中。
在數(shù)據(jù)結(jié)構(gòu)中,棧中數(shù)據(jù)的存取方式為先進(jìn)后出。而堆是一個(gè)優(yōu)先隊(duì)列,是按優(yōu)先級來進(jìn)行排序的,優(yōu)先級可以按照大小來規(guī)定。完全二叉樹是堆的一種實(shí)現(xiàn)方式。
在操作系統(tǒng)中,內(nèi)存被分為棧區(qū)和堆區(qū)。
棧區(qū)內(nèi)存由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
堆區(qū)內(nèi)存一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由垃圾回收機(jī)制回收。
4. 內(nèi)部屬性 [[Class]] 是什么?
所有 typeof 返回值為 "object" 的對象(如數(shù)組)都包含一個(gè)內(nèi)部屬性 [[Class]](我們可以把它看作一個(gè)內(nèi)部的分類,而非
傳統(tǒng)的面向?qū)ο笠饬x上的類)。這個(gè)屬性無法直接訪問,一般通過 Object.prototype.toString(..) 來查看。例如:
Object.prototype.toString.call( [1,2,3] );
// "[object Array]"
Object.prototype.toString.call( /regex-literal/i );
// "[object RegExp]"
5. 介紹 js 有哪些內(nèi)置對象?
js 中的內(nèi)置對象主要指的是在程序執(zhí)行前存在全局作用域里的由 js 定義的一些全局值屬性、函數(shù)和用來實(shí)例化其他對象的構(gòu)造函數(shù)對象。
一般我們經(jīng)常用到的如全局變量值 NaN、undefined,全局函數(shù)如 parseInt()、parseFloat() 用來實(shí)例化對象的構(gòu)造函數(shù)如 Date、Object 等,還有提供數(shù)學(xué)計(jì)算的單體內(nèi)置對象如 Math 對象。
6. undefined 與 undeclared 的區(qū)別?
已在作用域中聲明但還沒有賦值的變量,是 undefined 的。相反,還沒有在作用域中聲明過的變量,是 undeclared 的。
對于 undeclared 變量的引用,瀏覽器會報(bào)引用錯(cuò)誤,如 ReferenceError: b is not defined 。但是我們可以使用 typeof 的安全防范機(jī)制來避免報(bào)錯(cuò),因?yàn)閷τ?undeclared(或者 not defined )變量,typeof 會返回 "undefined"。
7. null 和 undefined 的區(qū)別?
首先 Undefined 和 Null 都是基本數(shù)據(jù)類型,這兩個(gè)基本數(shù)據(jù)類型分別都只有一個(gè)值,就是 undefined 和 null。
undefined 代表的含義是未定義,null 代表的含義是空對象。一般變量聲明了但還沒有定義的時(shí)候會返回 undefined,null主要用于賦值給一些可能會返回對象的變量,作為初始化。
undefined 在 js 中不是一個(gè)保留字,這意味著我們可以使用 undefined 來作為一個(gè)變量名,這樣的做法是非常危險(xiǎn)的,它會影響我們對 undefined 值的判斷。但是我們可以通過一些方法獲得安全的 undefined 值,比如說 void 0。
當(dāng)我們對兩種類型使用 typeof 進(jìn)行判斷的時(shí)候,Null 類型化會返回 “object”,這是一個(gè)歷史遺留的問題。當(dāng)我們使用雙等號對兩種類型的值進(jìn)行比較時(shí)會返回 true,使用三個(gè)等號時(shí)會返回 false。
8. 如何獲取安全的 undefined 值?
因?yàn)?undefined 是一個(gè)標(biāo)識符,所以可以被當(dāng)作變量來使用和賦值,但是這樣會影響 undefined 的正常判斷。
表達(dá)式 void ___ 沒有返回值,因此返回結(jié)果是 undefined。void 并不改變表達(dá)式的結(jié)果,只是讓表達(dá)式不返回值。
按慣例我們用 void 0 來獲得 undefined。
9. 說幾條寫 JavaScript 的基本規(guī)范?
在平常項(xiàng)目開發(fā)中,我們遵守一些這樣的基本規(guī)范,比如說:
(1)一個(gè)函數(shù)作用域中所有的變量聲明應(yīng)該盡量提到函數(shù)首部,用一個(gè) var 聲明,不允許出現(xiàn)兩個(gè)連續(xù)的 var 聲明,聲明時(shí)如果變量沒有值,應(yīng)該給該變量賦值對應(yīng)類型的初始值,便于他人閱讀代碼時(shí),能夠一目了然的知道變量對應(yīng)的類型值。
(2)代碼中出現(xiàn)地址、時(shí)間等字符串時(shí)需要使用常量代替。
(3)在進(jìn)行比較的時(shí)候吧,盡量使用'===', '!=='代替'==', '!='。
(4)不要在內(nèi)置對象的原型上添加方法,如 Array, Date。
(5)switch 語句必須帶有 default 分支。
(6)for 循環(huán)必須使用大括號。
(7)if 語句必須使用大括號。
10. JavaScript 原型,原型鏈? 有什么特點(diǎn)?
在 js 中我們是使用構(gòu)造函數(shù)來新建一個(gè)對象的,每一個(gè)構(gòu)造函數(shù)的內(nèi)部都有一個(gè) prototype 屬性值,這個(gè)屬性值是一個(gè)對象,這個(gè)對象包含了可以由該構(gòu)造函數(shù)的所有實(shí)例共享的屬性和方法。當(dāng)我們使用構(gòu)造函數(shù)新建一個(gè)對象后,在這個(gè)對象的內(nèi)部將包含一個(gè)指針,這個(gè)指針指向構(gòu)造函數(shù)的 prototype 屬性對應(yīng)的值,在 ES5 中這個(gè)指針被稱為對象的原型。
一般來說我們是不應(yīng)該能夠獲取到這個(gè)值的,但是現(xiàn)在瀏覽器中都實(shí)現(xiàn)了proto 屬性來讓我們訪問這個(gè)屬性,但是我們最好不要使用這個(gè)屬性,因?yàn)樗皇且?guī)范中規(guī)定的。ES5 中新增了一個(gè)Object.getPrototypeOf() 方法,我們可以通過這個(gè)方法來獲取對象的原型。
當(dāng)我們訪問一個(gè)對象的屬性時(shí),如果這個(gè)對象內(nèi)部不存在這個(gè)屬性,那么它就會去它的原型對象里找這個(gè)屬性,這個(gè)原型對象又會有自己的原型,于是就這樣一直找下去,也就是原型鏈的概念。原型鏈的盡頭一般來說都是 Object.prototype 所以這就是我們新建的對象為什么能夠使用 toString() 等方法的原因。
特點(diǎn):
JavaScript 對象是通過引用來傳遞的,我們創(chuàng)建的每個(gè)新對象實(shí)體中并沒有一份屬于自己的原型副本。當(dāng)我們修改原型時(shí),與之相關(guān)的對象也會繼承這一改變。
以上就是“比較經(jīng)典的Js面試題大匯總”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743