❶ javascript面試題級答案
這個可以到網上找一下呀!
=========================================
1、談談javascript數組排序方法sort()的使用回,重點介紹sort()參數的使用及其內答部機制
2、簡述DIV元素和SPAN元素的區 別。
3、結合text這段結構,談談innerHTML outerHTML innerText之間的區別。
4、說幾條XHTML規范 的內容(至少3條)
5、對Web標准化(或網站重構)知道哪些相關的知識,簡述幾條你知道的Web標准?
答案:
1、 sort的實現的功能類似JAVA的比較器,數據排序從多維數組的第一維開始排序,可以自己定義排序方法,很不多的函數
2、DIV有回 車,SPAN沒有
3、 innerHTML對象裡面的HTML
outerHTML包括對象和裡面的HTML
innerText對象裡面的文本
4、屬性加引號,不能有不匹配的標簽,加定義
5、W3C標准等
❷ js基礎面試題71-80道題目
71.IE 和標准下有哪些兼容性的寫法
參考答案:
參與互動
72.變數提升
參考答案:
A、js 代碼執行的過程
B、變數提升發生的環境:發生在代碼所處的當前作用域。
解析:
對應面試題
參與互動
73.如何阻止冒泡與默認行為
參考答案:
解析:
當需要阻止冒泡行為時,可以使用
當需要阻止默認行為時,可以使用
參與互動
74.js 中 this 閉包 作用域
參考答案:
this:指向調用上下文
閉包:定義一個函數就開辟了一個局部作用域,整個 js 執行環境有一個全局作用域
作用域:一個函數可以訪問其他函數中的變數(閉包是一個受保護的變數空間)
參與互動
75.javascript 的本地對象,內置對象和宿主對象
參考答案:
1.本地對象
ECMA-262 把本地對象(native object)定義為「獨立於宿主環境的 ECMAScript 實現提供的對象"。簡單來說,本地對象就是 ECMA-262 定義的類(引用類型)。它們包括:Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError
2.內置對象
JS中內置了17個對象,常用的是Array對象、Date對象、正則表達式對象、string對象、Global對象
3.宿主對象
由ECMAScript實現的宿主環境提供的對象,可以理解為:瀏覽器提供的對象。所有的BOM和DOM都是宿主對象。
參與互動
76.javascript 的同源策略
參考答案:一段腳本只能讀取來自於同一來源的窗口和文檔的屬性
解析:
同源策略:限制從一個源載入的文檔或腳本如何與來自另一個源的資源進行交互。這是一個用於隔離潛在惡意文件的關鍵的安全機制。(來自 MDN 官方的解釋)
簡單來說就是:一段腳本只能讀取來自於同一來源的窗口和文檔的屬性,這里的同一來源指的是主機名、協議和埠號的組合 具體解釋:
(1)源包括三個部分:協議、域名、埠(http 協議的默認埠是 80)。如果有任何一個部分不同,則源不同,那就是跨域了。
(2)限制:這個源的文檔沒有權利去操作另一個源的文檔。這個限制體現在:(要記住)
Cookie、LocalStorage 和 IndexDB 無法獲取。
無法獲取和操作 DOM。
不能發送 Ajax 請求。我們要注意,Ajax 只適合同源的通信。
同源策略帶來的麻煩:ajax 在不同域名下的請求無法實現,需要進行跨域操作
參與互動
77.事件冒泡與事件捕獲
參考答案:
事件冒泡:由最具體的元素(目標元素)向外傳播到最不具體的元素
事件捕獲:由最不確定的元素到目標元素
參與互動
78.foo = foo||bar ,這行代碼是什麼意思?為什麼要這樣寫?
參考答案:
這種寫法稱為短路表達式
解析:
相當於
常用於函數參數的空判斷
參與互動
79.復雜數據類型如何轉變為字元串
參考答案:
參與互動
80.javascript 中 this 的指向問題
參考答案:
解析:
全局環境下,this 始終指向全局對象(window),無論是否嚴格模式;
2.1 普通函數
普通函數內部的 this 分兩種情況,嚴格模式和非嚴格模式。
(1)非嚴格模式下,沒有被上一級的對象所調用, this 默認指向全局對象 window。
(2)嚴格模式下,this 指向 undefined。
2.2 函數作為對象的方法
(1)函數有被上一級的對象所調用,那麼 this 指向的就是上一級的對象。
(2)多層嵌套的對象,內部方法的 this 指向離被調用函數最近的對象(window 也是對象,其內部對象調用方法的 this 指向內部對象, 而非 window)。
特殊例子
2.3 原型鏈中的 this
(1)如果該方法存在於一個對象的原型鏈上,那麼 this 指向的是調用這個方法的對象,就像該方法在對象上一樣。
上述例子中,對象 p 沒有屬於它自己的 f 屬性,它的 f 屬性繼承自它的原型。當執行 p.f()時,會查找 p 的原型鏈,找到 f 函數並執行。因為 f 是作為 p 的方法調用的,所以函數中的 this 指向 p。
(2)相同的概念也適用於當函數在一個 getter 或者 setter 中被調用。用作 getter 或 setter 的函數都會把 this 綁定到設置或獲取屬性的對象。
(3)call()和 apply()方法:當函數通過 Function 對象的原型中繼承的方法 call() 和 apply() 方法調用時, 其函數內部的 this 值可綁定到 call() & apply() 方法指定的第一個對象上, 如果第一個參數不是對象,JavaScript 內部會嘗試將其轉換成對象然後指向它。
(4)bind()方法:由 ES5 引入, 在 Function 的原型鏈上, Function.prototype.bind。通過 bind 方法綁定後, 函數將被永遠綁定在其第一個參數對象上, 而無論其在什麼情況下被調用。
2.4 構造函數中的 this
當一個函數用作構造函數時(使用 new 關鍵字),它的 this 被綁定到正在構造的新對象。
構造器返回的默認值是 this 所指的那個對象,也可以手動返回其他的對象。
特殊例子
當 this 碰到 return 時
2.5 setTimeout & setInterval
(1)對於延時函數內部的回調函數的 this 指向全局對象 window;
(2)可以通過 bind()方法改變內部函數 this 指向。
3.1 作為一個 DOM 事件處理函數
當函數被用作事件處理函數時,它的 this 指向觸發事件的元素(針對 addEventListener 事件)。
3.2 作為一個內聯事件處理函數
(1)當代碼被內聯處理函數調用時,它的 this 指向監聽器所在的 DOM 元素;
(2)當代碼被包括在函數內部執行時,其 this 指向等同於 普通函數直接調用的情況,即在非嚴格模式指向全局對象 window,在嚴格模式指向 undefined:
4.1 全局環境中
在全局代碼中,箭頭函數被設置為全局對象:
4.2 this 捕獲上下文
箭頭函數沒有自己的 this,而是使用箭頭函數所在的作用域的 this,即指向箭頭函數定義時(而不是運行時)所在的作用域。
4.2 this 捕獲上下文
箭頭函數沒有自己的 this,而是使用箭頭函數所在的作用域的 this,即指向箭頭函數定義時(而不是運行時)所在的作用域。
在 setTimeout 中的 this 指向了構造函數新生成的對象,而普通函數指向了全局 window 對象。
4.3 箭頭函數作為對象的方法使用
箭頭函數作為對象的方法使用,指向全局 window 對象;而普通函數作為對象的方法使用,則指向調用的對象。
4.4 箭頭函數中,call()、apply()、bind()方法無效
4.5 this 指向固定化
箭頭函數可以讓 this 指向固定化,這種特性很有利於封裝回調函數
上面代碼的 init 方法中,使用了箭頭函數,這導致這個箭頭函數裡面的 this,總是指向 handler 對象。如果不使用箭頭函數則指向全局 document 對象。
4.6 箭頭函是不適用場景
(1)箭頭函數不適合定義對象的方法(方法內有 this),因為此時指向 window;
(2)需要動態 this 的時候,也不應使用箭頭函數。
參與互動
❸ js基礎面試題1-10道
1.document load 和 document ready 的區別
參考答案:文檔解析過程中,ready在載入圖片等外部資源前觸發,load在之後觸發。如果頁面中要是沒有圖片之類的媒體文件的話ready與load是差不多的,但是頁面中有文件就不一樣了,所以還是推薦大家在工作中用ready
解析:
DOM文檔解析:
頁面載入完成有兩種事件
1.load是當頁面所有資源全部載入完成後(包括DOM文檔樹,css文件,js文件,圖片資源等),執行一個函數
缺點:如果圖片資源較多,載入時間較長,onload後等待執行的函數需要等待較長時間,所以一些效果可能受到影響
代碼形式:
2.$(document).ready()是當DOM文檔樹載入完成後執行一個函數 (不包含圖片,css等)所以會比load較快執行
在原生的jS中不包括ready()這個方法,Jquery才有,jquery中有 $().ready(function)。
代碼形式為:
參與互動
2.JavaScript 中如何檢測一個變數是一個 String 類型?
參考答案:三種方法(typeof、constructor、Object.prototype.toString.call())
解析:
參與互動
3.請用 js 去除字元串空格?
參考答案:replace 正則匹配方法、str.trim()方法、JQ 方法:$.trim(str)方法
解析:
方法一:replace 正則匹配方法
去除字元串內所有的空格:str = str.replace(/s*/g, "");
去除字元串內兩頭的空格:str = str.replace(/^s*|s*$/g, "");
去除字元串內左側的空格:str = str.replace(/^s*/, "");
去除字元串內右側的空格:str = str.replace(/(s*$)/g, "");
示例:
方法二:str.trim()方法
trim()方法是用來刪除字元串兩端的空白字元並返回,trim 方法並不影響原來的字元串本身,它返回的是一個新的字元串。
缺陷:只能去除字元串兩端的空格,不能去除中間的空格
示例:
方法三:JQ 方法:$.trim(str)方法
$.trim() 函數用於去除字元串兩端的空白字元。
注意:$.trim()函數會移除字元串開始和末尾處的所有換行符,空格(包括連續的空格)和製表符。如果這些空白字元在字元串中間時,它們將被保留,不會被移除。
示例:
參與互動
4.js 是一門怎樣的語言,它有什麼特點
參考答案:
1.腳本語言。JavaScript 是一種解釋型的腳本語言, C、C++等語言先編譯後執行, 而 JavaScript 是在程序的運行過程中逐行進行解釋。
2.基於對象。JavaScript 是一種基於對象的腳本語言, 它不僅可以創建對象, 也能使用現有的對象。
3.簡單。JavaScript 語言中採用的是弱類型的變數類型, 對使用的數據類型未做出嚴格的要求, 是基於 Java 基本語句和控制的腳本語言, 其設計簡單緊湊。
4.動態性。JavaScript 是一種採用事件驅動的腳本語言, 它不需要經過 Web 伺服器就可以對用戶的輸入做出響應。
5.跨平台性。JavaScript 腳本語言不依賴於操作系統, 僅需要瀏覽器的支持。
參與互動
5.== 和 === 的不同
參考答案: == 是抽象相等運算符,而 === 是嚴格相等運算符。 == 運算符是在進行必要的類型轉換後,再比較。 === 運算符不會進行類型轉換,所以如果兩個值不是相同的類型,會直接返回 false 。使用 == 時,可能發生一些特別的事情,例如:
如果你對 == 和 === 的概念不是特別了解,建議大多數情況下使用 ===
參與互動
6.怎樣添加、移除、移動、復制、創建和查找節點?
參考答案:
1)創建新節點
2)添加、移除、替換、插入
3)查找
參與互動
7.事件委託是什麼
參考答案:利用事件冒泡的原理,讓自己的所觸發的事件,讓他的父元素代替執行!
解析:
1、那什麼樣的事件可以用事件委託,什麼樣的事件不可以用呢?
2、為什麼要用事件委託
3、事件冒泡與事件委託的對比
4、事件委託怎麼取索引?
拓展:
參考
參與互動
8.require 與 import 的區別
參考答案:兩者的載入方式不同、規范不同
第一、兩者的載入方式不同,require 是在運行時載入,而 import 是在編譯時載入
require('./a')(); // a 模塊是一個函數,立即執行 a 模塊函數
var data = require('./a').data; // a 模塊導出的是一個對象
var a = require('./a')[0]; // a 模塊導出的是一個數組 ======> 哪都行
import $ from 'jquery'
import * as _ from '_'
import {a, b, c} from './a'
import {default as alias, a as a_a, b, c} from './a' ======>用在開頭
第二、規范不同,require 是 CommonJS/AMD 規范,import 是 ESMAScript6+規范
第三、require 特點:社區方案,提供了伺服器/瀏覽器的模塊載入方案。非語言層面的標准。只能在運行時確定模塊的依賴關系及輸入/輸出的變數,無法進行靜態優化。
import 特點:語言規格層面支持模塊功能。支持編譯時靜態分析,便於 JS 引入宏和類型檢驗。動態綁定。
參與互動
9.javascript 對象的幾種創建方式
參考答案:
第一種:Object 構造函數創建
這行代碼創建了 Object 引用類型的一個新實例,然後把實例保存在變數 Person 中。
第二種:使用對象字面量表示法
對象字面量是對象定義的一種簡寫形式,目的在於簡化創建包含大量屬性的對象的過程。也就是說,第一種和第二種方式創建對象的方法其實都是一樣的,只是寫法上的區別不同
在介紹第三種的創建方法之前,我們應該要明白為什麼還要用別的方法來創建對象,也就是第一種,第二種方法的缺點所在:它們都是用了同一個介面創建很多對象,會產生大量的重復代碼,就是如果你有 100 個對象,那你要輸入 100 次很多相同的代碼。那我們有什麼方法來避免過多的重復代碼呢,就是把創建對象的過程封裝在函數體內,通過函數的調用直接生成對象。
第三種:使用工廠模式創建對象
在使用工廠模式創建對象的時候,我們都可以注意到,在 createPerson 函數中,返回的是一個對象。那麼我們就無法判斷返回的對象究竟是一個什麼樣的類型。於是就出現了第四種創建對象的模式。
第四種: 使用構造函數創建對象
對比工廠模式,我們可以發現以下區別:
1.沒有顯示地創建對象
2.直接將屬性和方法賦給了 this 對象
3.沒有 return 語句
4.終於可以識別的對象的類型。對於檢測對象類型,我們應該使用 instanceof 操作符,我們來進行自主檢測:
同時我們也應該明白,按照慣例,構造函數始終要應該以一個大寫字母開頭,而非構造函數則應該以一個小寫字母開頭。
那麼構造函數確實挺好用的,但是它也有它的缺點:
就是每個方法都要在每個實例上重新創建一遍,方法指的就是我們在對象裡面定義的函數。如果方法的數量很多,就會佔用很多不必要的內存。於是出現了第五種創建對象的方法
第五種:原型創建對象模式
使用原型創建對象的方式,可以讓所有對象實例共享它所包含的屬性和方法。
如果是使用原型創建對象模式,請看下面代碼:
當為對象實例添加一個屬性時,這個屬性就會屏蔽原型對象中保存的同名屬性。
這時候我們就可以使用構造函數模式與原型模式結合的方式,構造函數模式用於定義實例屬性,而原型模式用於定義方法和共享的屬性
第六種:組合使用構造函數模式和原型模式
解析: 參考
參與互動
10.JavaScript 繼承的方式和優缺點
參考答案:六種方式