JavaScript 的核心語(yǔ)法包括磷箕?
基本的語(yǔ)法構(gòu)造(比如變量沥阳、操作符、控制結(jié)構(gòu)泽论、語(yǔ)句戳杀、注釋)和標(biāo)準(zhǔn)庫(kù)(就是一系列具有各種功能的對(duì)象比如Array该面、Date夭苗、Math等)
瀏覽器提供JavaScript 調(diào)用的額外 API有哪幾類?
- BOM(Browser Object Model) 瀏覽器控制類:操作瀏覽器
- DOM(Document Object Model) 頁(yè)面文檔操控類:操作網(wǎng)頁(yè)的各種元素
DOM的最小組成單位叫做節(jié)點(diǎn)(node)隔缀,js提供了許多獲取和操作節(jié)點(diǎn)的方法 - Web 類:實(shí)現(xiàn)互聯(lián)網(wǎng)的各種功能题造,http協(xié)議,websocket
JavaScript 的復(fù)雜性體現(xiàn)在哪兩個(gè)方面猾瘸?
- JavaScript 要發(fā)揮作用界赔,需要掌握大量的外部 API,幾乎涉及網(wǎng)絡(luò)應(yīng)用的各個(gè)方面牵触,掌握它們絕非易事淮悼。
- JavaScript 語(yǔ)言有一些設(shè)計(jì)缺陷,學(xué)習(xí) JavaScript荒吏,很大一部分時(shí)間是用來(lái)搞清楚哪些地方有陷阱敛惊。
為何要發(fā)明CoffeeScript渊鞋、TypeScript绰更、Dart 等類JS語(yǔ)言?
因?yàn)镴S語(yǔ)言設(shè)計(jì)坑太深锡宋,有時(shí)為了更合理地編寫 JavaScript 程序儡湾,就不能用 JavaScript 來(lái)寫,不得不發(fā)明新的語(yǔ)言执俩。
- TypeScript 是一種微軟開(kāi)源的編程語(yǔ)言徐钠。由于JavaScript是弱類型的,TypeScript為JavaScript擴(kuò)展類和模塊的概念役首。正是由于TypeScript最大的特點(diǎn)是類型化尝丐,因此才叫做TypeScript。
- 和TypeScript 相似的工具語(yǔ)言還有很多衡奥,主要分為兩個(gè)陣營(yíng):
一個(gè)是類似 Babel 的陣營(yíng)爹袁,堅(jiān)持JavaScript 的語(yǔ)法風(fēng)格編寫,為開(kāi)發(fā)者提供最新的 ECMAScript 特性矮固。
另一個(gè)則是Coffeescript失息、Dart等的陣營(yíng),它們的語(yǔ)法與 JavaScript 迥然不同档址,但最終會(huì)編譯為JavaScript盹兢。 - Dart最初是由 Google 的 Chrome V8 團(tuán)隊(duì)打造。與TypeScript編譯JavaScript代碼不同守伸,Dart是跳過(guò)翻譯的步驟绎秒,直接在瀏覽器里面嵌入一個(gè) Dart 解釋引擎與 V8 并行。
JavaScript 與 Java 的區(qū)別和聯(lián)系尼摹?
- 聯(lián)系:JavaScript 的基本語(yǔ)法和對(duì)象體系见芹,是模仿 Java 而設(shè)計(jì)的校辩。
- 區(qū)別:
- JS的函數(shù)是一種獨(dú)立的數(shù)據(jù)類型;
- JS采用基于原型對(duì)象(prototype)的繼承鏈;
- Java 語(yǔ)言需要編譯辆童,而 JS 則是運(yùn)行時(shí)由解釋器直接執(zhí)行;
JavaScript 與 ECMAScript 的關(guān)系?
ECMAScript 和 JavaScript 的關(guān)系是宜咒,前者是后者的規(guī)格,后者是前者的一種實(shí)現(xiàn)把鉴。ECMAScript 只用來(lái)標(biāo)準(zhǔn)化 JavaScript 這種語(yǔ)言的基本語(yǔ)法結(jié)構(gòu)故黑,與部署環(huán)境相關(guān)的標(biāo)準(zhǔn)都由其他標(biāo)準(zhǔn)規(guī)定,比如 DOM 的標(biāo)準(zhǔn)就是由 W3C組織制定的庭砍。
什么是語(yǔ)句场晶?
語(yǔ)句(statement)是為了完成某種任務(wù)而進(jìn)行的操作;
語(yǔ)句和表達(dá)式的區(qū)別怠缸?
前者主要為了進(jìn)行某種操作诗轻,一般情況下不需要返回值;后者則是為了得到返回值揭北,一定會(huì)返回一個(gè)值扳炬。表達(dá)式不需要分號(hào)結(jié)尾,一旦在表達(dá)式后面添加分號(hào)搔体,則 JavaScript 引擎就將表達(dá)式視為語(yǔ)句恨樟。
為何說(shuō)JavaScript 是一種動(dòng)態(tài)類型語(yǔ)言?
因?yàn)樽兞康念愋蜎](méi)有限制疚俱,變量可以隨時(shí)更改類型劝术。
什么是變量提升?
由于JS引擎先解析后運(yùn)行代碼呆奕,所以所有變量的聲明語(yǔ)句养晋,都會(huì)被提升到代碼的頭部,這就是變量提升梁钾。
為何有些開(kāi)發(fā)者習(xí)慣將常量寫在運(yùn)算符的左邊绳泉?
避免不小心將相等運(yùn)算符寫成賦值運(yùn)算符而引起的未知bug,通過(guò)報(bào)錯(cuò)提前發(fā)現(xiàn)陈轿。
if (x = 2) { // 不報(bào)錯(cuò)
if (2 = x) { // 報(bào)錯(cuò)
為何switch每個(gè)case代碼塊內(nèi)部的break語(yǔ)句不能少?
否則會(huì)接下去執(zhí)行下一個(gè)case代碼塊圈纺,而不是跳出switch結(jié)構(gòu)。
為何switch進(jìn)行比較時(shí)不會(huì)發(fā)生類型轉(zhuǎn)換麦射?
switch語(yǔ)句后面的表達(dá)式蛾娶,與case語(yǔ)句后面的表示式比較運(yùn)行結(jié)果時(shí),采用的是嚴(yán)格相等運(yùn)算符(===)潜秋,而不是相等運(yùn)算符(==)蛔琅。
break 語(yǔ)句和 continue 語(yǔ)句的作用?
跳轉(zhuǎn)作用峻呛,可以讓代碼不按既有的順序執(zhí)行罗售。
JavaScript 的數(shù)據(jù)類型有辜窑?
數(shù)值、字符串寨躁、布爾值三種基本類型穆碎,對(duì)象這一種復(fù)雜類型,undefined和null 兩個(gè)特殊值职恳,以及ES6 新增的第七種 Symbol 類型所禀。
JavaScript 的“函數(shù)式編程”的基礎(chǔ)是?
把函數(shù)當(dāng)成一種數(shù)據(jù)類型放钦,可以賦值給變量
JS中確定一個(gè)值是什么類型的方法有色徘?
- typeof運(yùn)算符
- instanceof運(yùn)算符
- Object.prototype.toString方法
為何typeof 用來(lái)檢查一個(gè)沒(méi)有聲明的變量不報(bào)錯(cuò)?
因?yàn)?typeof undefined // "undefined"
為何typeof null返回object操禀?
歷史原因造成的褂策,一開(kāi)始沒(méi)考慮null,只把它當(dāng)作object的一種特殊值颓屑,后來(lái)null獨(dú)立出來(lái)斤寂,作為一種單獨(dú)的數(shù)據(jù)類型,但需要兼容以前的代碼邢锯,所以你懂的扬蕊。。丹擎。
null 和 undefined 的區(qū)別?
null是一個(gè)表示“空”的對(duì)象歇父,轉(zhuǎn)為數(shù)值時(shí)為0蒂培;undefined是一個(gè)表示"此處無(wú)定義"的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN榜苫。
談?wù)勀銓?duì)JS轉(zhuǎn)換規(guī)則的理解护戳?
如果 JavaScript 預(yù)期某個(gè)位置應(yīng)該是布爾值,會(huì)將該位置上現(xiàn)有的值自動(dòng)轉(zhuǎn)為布爾值垂睬。轉(zhuǎn)換規(guī)則是除了下面六個(gè)值被轉(zhuǎn)為false媳荒,其他值都視為true。
- undefined
- null
- false
- 0
- NaN
- ""或''(空字符串)
空數(shù)組([])和空對(duì)象({})對(duì)應(yīng)的布爾值是驹饺?
都是true
為何說(shuō)JavaScript 語(yǔ)言的底層根本沒(méi)有整數(shù)钳枕?
JavaScript 內(nèi)部,所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲(chǔ)存赏壹,即使整數(shù)也是如此鱼炒。所以,1與1.0是相同的蝌借,是同一個(gè)數(shù)昔瞧。1 === 1.0 // true
為何JS中任何一個(gè)數(shù)都有一個(gè)對(duì)應(yīng)的負(fù)值指蚁?
JavaScript 的64位浮點(diǎn)數(shù)之中,有一個(gè)二進(jìn)制位是符號(hào)位自晰。
+0 和 -0的區(qū)別凝化?
幾乎所有場(chǎng)合,正零和負(fù)零都會(huì)被當(dāng)作正常的0酬荞。唯一有區(qū)別的場(chǎng)合是缘圈,+0或-0當(dāng)作分母,返回的值是不相等的袜蚕。
NaN的作用是糟把?
主要是用于將字符串解析成數(shù)字出錯(cuò)的場(chǎng)合。NaN不是獨(dú)立的數(shù)據(jù)類型牲剃,而是一個(gè)特殊數(shù)值遣疯,typeof NaN。NaN === NaN // false
parseInt 需要注意的有凿傅?
- 字符串頭部有空格缠犀,空格會(huì)被自動(dòng)去除;
- 參數(shù)不是字符串聪舒,則會(huì)先轉(zhuǎn)為字符串再轉(zhuǎn)換辨液;
- 遇到不能轉(zhuǎn)為數(shù)字的字符,就不再進(jìn)行下去箱残,返回已經(jīng)轉(zhuǎn)好的部分滔迈;
- 第一個(gè)字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負(fù)號(hào)除外),返回NaN被辑;
- 返回值只有兩種可能燎悍,要么是一個(gè)十進(jìn)制整數(shù),要么是NaN盼理;
- 如果第二個(gè)參數(shù)是0谈山、undefined和null,則直接忽略宏怔;
為何使用isNaN之前奏路,最好判斷一下數(shù)據(jù)類型?
因?yàn)閕sNaN只對(duì)數(shù)值有效臊诊,如果傳入其他值鸽粉,會(huì)被先轉(zhuǎn)成數(shù)值。當(dāng)isNaN為true的值妨猩,有可能不是NaN潜叛。
function myIsNaN(value) {
return typeof value === 'number' && isNaN(value);
}
// 更可靠
function myIsNaN(value) {
return value !== value;
}
很多項(xiàng)目約定 JavaScript 語(yǔ)言的字符串只使用單引號(hào)?
因?yàn)镠TML 語(yǔ)言的屬性值使用雙引號(hào),使用雙引號(hào)的話需要轉(zhuǎn)義威兜。
如何把長(zhǎng)字符串分成多行销斟?
在每一行的尾部使用反斜杠
字符串與數(shù)組的關(guān)系?
字符串可以被視為字符數(shù)組椒舵,因此可以使用數(shù)組的方括號(hào)運(yùn)算符蚂踊,用來(lái)返回某個(gè)位置的字符,但是無(wú)法改變字符串之中的單個(gè)字符和length屬性笔宿。
什么是對(duì)象犁钟?
對(duì)象就是一組“鍵值對(duì)”(key-value)的集合,是一種無(wú)序的復(fù)合數(shù)據(jù)集合泼橘。
對(duì)象的所有鍵名加不加引號(hào)都可以?
因?yàn)閷?duì)象的所有鍵名都是字符串
如何理解對(duì)象的引用涝动?
如果不同的變量名指向同一個(gè)對(duì)象,那么它們都是這個(gè)對(duì)象的引用炬灭,也就是說(shuō)指向同一個(gè)內(nèi)存地址醋粟。修改其中一個(gè)變量,會(huì)影響到其他所有變量重归。
如果行首是一個(gè)大括號(hào)米愿,它到底是表達(dá)式還是語(yǔ)句?
JavaScript 引擎的做法是鼻吮,如果遇到這種情況育苟,無(wú)法確定是對(duì)象還是代碼塊,一律解釋為代碼塊椎木。如果要解釋為對(duì)象违柏,最好在大括號(hào)前加上圓括號(hào)。
為何數(shù)值鍵名不能使用點(diǎn)運(yùn)算符拓哺?
因?yàn)闀?huì)被當(dāng)成小數(shù)點(diǎn)勇垛,只能使用方括號(hào)運(yùn)算符。
什么時(shí)候delete命令會(huì)返回false士鸥?
該屬性存在,且不得刪除
delete命令可以刪除對(duì)象的所有屬性嗎谆级?
只能刪除對(duì)象本身的屬性烤礁,無(wú)法刪除繼承的屬性,即使delete返回true肥照,該屬性依然可能讀取到值脚仔。
in運(yùn)算符的問(wèn)題?
不能識(shí)別哪些屬性是對(duì)象自身的舆绎,哪些屬性是繼承的鲤脏。可以使用對(duì)象的hasOwnProperty方法判斷一下,是否為對(duì)象自身的屬性猎醇。
for...in循環(huán)有使用注意點(diǎn)有窥突?
- 它遍歷的是對(duì)象所有可遍歷(enumerable)的屬性,會(huì)跳過(guò)不可遍歷的屬性硫嘶。
- 它不僅遍歷對(duì)象自身的屬性阻问,還遍歷繼承的屬性。
什么是函數(shù)沦疾?
函數(shù)是一段可以反復(fù)調(diào)用的代碼塊称近。函數(shù)還能接受輸入的參數(shù),不同的參數(shù)會(huì)返回不同的值哮塞。
JavaScript 三種聲明函數(shù)的方法刨秆?
- function 命令
- 函數(shù)表達(dá)式
- Function 構(gòu)造函數(shù)(非常不直觀,幾乎無(wú)人使用)
什么是遞歸忆畅?
函數(shù)調(diào)用自身
為何凡是可以使用值的地方衡未,就能使用函數(shù)?
因?yàn)镴avaScript 語(yǔ)言將函數(shù)看作一種值邻眷,與其它值(數(shù)值眠屎、字符串、布爾值等等)地位相同肆饶。
如果同時(shí)采用function命令和賦值語(yǔ)句聲明同一個(gè)函數(shù)改衩?
總是采用賦值語(yǔ)句的定義
函數(shù)name屬性和函數(shù)的length屬性的作用?
獲取參數(shù)函數(shù)的名字和參數(shù)個(gè)數(shù),函數(shù)的length屬性與實(shí)際傳入的參數(shù)個(gè)數(shù)無(wú)關(guān)驯镊,只反映函數(shù)預(yù)期傳入的參數(shù)個(gè)數(shù)葫督。
函數(shù)的toString方法
返回一個(gè)字符串,內(nèi)容是函數(shù)的源碼板惑。
什么是作用域?
指的是變量存在的范圍
如果在函數(shù)體內(nèi)修改參數(shù)值橄镜,會(huì)不會(huì)影響到函數(shù)外部?
- 如果是原始類型的值(數(shù)值冯乘、字符串洽胶、布爾值),傳遞方式是傳值傳遞裆馒,不影響姊氓;
- 如果是復(fù)合類型的值(數(shù)組、對(duì)象喷好、其他函數(shù))翔横,傳遞方式是傳址傳遞。在函數(shù)內(nèi)部修改參數(shù)梗搅,將會(huì)影響到原始值;
- 如果函數(shù)內(nèi)部修改的禾唁,不是參數(shù)對(duì)象的某個(gè)屬性效览,而是替換掉整個(gè)參數(shù),這時(shí)不會(huì)影響到原始值;
為何要有arguments對(duì)象荡短?
由于 JavaScript 允許函數(shù)有不定數(shù)目的參數(shù)丐枉,所以需要一種機(jī)制,可以在函數(shù)體內(nèi)部讀取所有參數(shù)肢预。arguments對(duì)象包含了函數(shù)運(yùn)行時(shí)的所有參數(shù)矛洞,arguments[0]就是第一個(gè)參數(shù),arguments[1]就是第二個(gè)參數(shù)烫映,以此類推沼本。這個(gè)對(duì)象只有在函數(shù)體內(nèi)部,才可以使用锭沟。
如何理解閉包抽兆?
定義在一個(gè)函數(shù)內(nèi)部的函數(shù),本質(zhì)上族淮,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁辫红。
閉包的用處?
- 讀取函數(shù)內(nèi)部的變量
- 讓這些變量始終保持在內(nèi)存中
- 封裝對(duì)象的私有屬性和私有方法
為何不能濫用不能濫用閉包祝辣?
內(nèi)存消耗會(huì)很大贴妻,造成網(wǎng)頁(yè)的性能問(wèn)題。
使用立即執(zhí)行的函數(shù)表達(dá)式的目的蝙斜?
- 一是不必為函數(shù)命名名惩,避免了污染全局變量;
- 二是 IIFE 內(nèi)部形成了一個(gè)單獨(dú)的作用域孕荠,可以封裝一些外部無(wú)法讀取的私有變量娩鹉。
數(shù)組需要注意的是?
- 由于數(shù)組本質(zhì)上是一種對(duì)象稚伍,所以可以為數(shù)組添加屬性弯予,但是這不影響length屬性的值
- 如果數(shù)組的鍵名是添加超出范圍的數(shù)值,該鍵名會(huì)自動(dòng)轉(zhuǎn)為字符串个曙,且length屬性沒(méi)有發(fā)生變化锈嫩。
- for...in不僅會(huì)遍歷數(shù)組所有的數(shù)字鍵,還會(huì)遍歷非數(shù)字鍵垦搬;
- 使用delete命令刪除一個(gè)數(shù)組成員祠挫,會(huì)形成空位,并且不會(huì)影響length屬性悼沿;
數(shù)組的某個(gè)位置是空位與某個(gè)位置是undefined的區(qū)別?
如果是空位骚灸,使用數(shù)組的forEach方法糟趾、for...in結(jié)構(gòu)、以及Object.keys方法進(jìn)行遍歷,空位都會(huì)被跳過(guò)义郑。