★★★★★
- call和apply的含義和區(qū)別
- apply----應(yīng)用某一對象的一個方法,用另一個對象替換當(dāng)前對象
B.apply(A, arguments);即A對象應(yīng)用B對象的方法。
- call----調(diào)用一個對象的一個方法,以另一個對象替換當(dāng)前的對象
B.call(A, args1,args2);即A對象調(diào)用B對象的方法。
- 區(qū)別在于:傳參形式不同,apply只能接收兩個參數(shù),對象和一個數(shù)組,如果沒有提供這兩個參數(shù),thisObj=global對象,并且無法傳參;call可以接收多個參數(shù),使當(dāng)前this實例指針保持一致,或者在特殊情況下需要改變this指針。如果沒有提供thisObj參數(shù),那么 Global 對象被用作thisObj。
- javascript的數(shù)據(jù)類型 和內(nèi)存存儲
- 基本數(shù)據(jù)類型和引用數(shù)據(jù)類型;number、string、boolean、NaN、undefined;對象數(shù)據(jù)類型和函數(shù)數(shù)據(jù)類型;
- 基本類型就是保存在棧內(nèi)存中的簡單數(shù)據(jù)段,而引用類型指的是那些保存在堆內(nèi)存中的對象。
-
基本類型數(shù)據(jù)在內(nèi)存中分別占有固定大小的空間,他們的值保存在??臻g,我們通過按值來訪問的;
引用數(shù)據(jù)類型,值大小不固定,存放在堆內(nèi)存中,地址存放在棧內(nèi)存中,是按引用訪問的。
內(nèi)存存儲
- 如何解決跨域?
想要訪問其他網(wǎng)站上的js腳本,使用ajax會遇到跨域問題,跨域問題來源于同源策略,為了數(shù)據(jù)安全,ajax規(guī)定不能跨域訪問。
-
jsonp解決跨域
首先<script>標(biāo)簽對是不受同源策略限制的,它可以載入任意地方的js文件,并不要求同源。
jsonp理念就是,我和服務(wù)器端約定好一個函數(shù)名,當(dāng)我請求文件的時候,服務(wù)器返回一段JavaScript代碼,這段代碼調(diào)用了我們約定好的函數(shù),并將數(shù)據(jù)以參數(shù)的形式傳入。數(shù)據(jù)以json的格式返回
你需要獲取數(shù)據(jù)的頁面 index.html:
<script>
function getWeather(data) {
console.log(data);
}
</script>
<script src="http://x.y.com/xx.js">
------------------[http://x.y.com/xx.js](http://x.y.com/xx.js) 文件內(nèi)容: getWeather({ "城市": "北京", "天氣": "大霧" });
服務(wù)端代理解決跨域
接收到客戶端請求以后,經(jīng)由本域服務(wù)器代理向目標(biāo)服務(wù)器發(fā)送請求,并將響應(yīng)數(shù)據(jù)返回客戶端。
- 同步和異步的區(qū)別?
JavaScript將任務(wù)的執(zhí)行模式分為:同步(Synchronous)和異步(Asynchronous)。
JavaScript語言的執(zhí)行環(huán)境是"單線程",就是指一次只能完成一個任務(wù)。如果有多個任務(wù)就必須排隊,前面一個任務(wù)完成,再執(zhí)行后面的任務(wù),一次類推。這便是"同步模式",程序的執(zhí)行順序和排列順序是一致的,同步的;"異步模式"則完全不同,每一個任務(wù)有一個或多個回調(diào)函數(shù),前一個任務(wù)結(jié)束后,不是執(zhí)行后一個任務(wù),而是執(zhí)行回調(diào)函數(shù),后一個任務(wù)則是不等待前一個任務(wù)結(jié)束就執(zhí)行,程序的執(zhí)行順序和排列順序不是一致的,異步的。鍋里正煲著湯,同時我在為下一道菜做著準(zhǔn)備。
- 同步模式,任務(wù)耗時長,常見的瀏覽器無響應(yīng),卡住其他任務(wù)無法進(jìn)行
- 異步模式,非常重要,在瀏覽器端,耗時很長的操作都應(yīng)該異步執(zhí)行,避免瀏覽器失去響應(yīng),最好的例子就是Ajax操作。在服務(wù)器端,"異步模式"甚至是唯一的模式,因為執(zhí)行環(huán)境是單線程的,如果允許同步執(zhí)行所有http請求,服務(wù)器性能會急劇下降,很快就會失去響應(yīng)。
-
字符串函數(shù)和數(shù)組函數(shù)
(1) 字符串函數(shù)str.charAt(下標(biāo))----返回指定位置的字符
str.charCodeAt(下標(biāo))----返回指定位置字符的ASCII值
str.fromCharCode(編碼1,編碼2,…)----接收一個或多個ASCII值,返回對應(yīng)的字符-
查找類型
- str.indexOf(字符)----返回該字符在字符串中首次出現(xiàn)的位置,若字符不存在則返回-1;
- str.lastIndexOf(字符)----返回該字符在字符串中最后一次出現(xiàn)的位置,若字符不存在則返回-1;
- str.match(字符)----在字符串中查找字符,若存在則返回該字符,若不存在則返回null;
- str.replace(被替換的字符串,新字符串)----返回替換后的新字符串,不會影響原來的字符串。
-
截取類型
- str.splice(start,end)----從指定的位置開始,到指定的位置結(jié)束,返回截取的字符串,不會影響原來的字符串。支持負(fù)數(shù),從后往前數(shù)。
- str.substring(start,end)----不支持負(fù)數(shù)
- str.substr(start,length)----從指定的位置開始,到指定的長度結(jié)束,不支持負(fù)數(shù)。
-
轉(zhuǎn)換類型
- str.split("分隔符",length)----將字符串按指定的分隔符轉(zhuǎn)換為數(shù)組
- str.toLowerCase()/str.toUpperCase()----將字符串中英文字母轉(zhuǎn)換為小寫/大寫
(2) 數(shù)組函數(shù)
* 添加刪除類
* arr.push()----在數(shù)組后面添加元素,返回數(shù)組的長度,會影響原數(shù)組
* arr.pop()----在數(shù)組后面刪除一個元素,返回被刪除的元素,會影響
* arr.unshift()----從前面添加元素,返回值為數(shù)組的長度,會影響原數(shù)組
* arr.shift()----從數(shù)組的前面刪除一個元素,返回值為刪除的元素,會影響原數(shù)組
* arr.splice(index,數(shù)量,添加的元素1,2,...)----萬能的添加刪除函數(shù),index表示要操作的元素位置下標(biāo),數(shù)量:0表示添加,返回值空白,0以外數(shù)字表示刪除的個數(shù),返回刪除的元素
- 轉(zhuǎn)換類型
- arr.join("分隔符")----返回值為新字符串,參數(shù)不傳時默認(rèn)為","
- 數(shù)組連接
- arr.concat(arr1,arr2)----不會影響原數(shù)組
- 數(shù)組截取
- arr.slice(start,end)
- 數(shù)組排序
- myarr.sort([callback])----callback省略時,默認(rèn)按ASCLL排序;升序降序
- 事件委派
- 事件冒泡(event bubbling),即事件開始時由最具體的元素(文檔中嵌套層次最深的那個節(jié)點(diǎn))接收,然后逐級向上傳播到較為不具體的節(jié)點(diǎn)(文檔)。
- 利用事件冒泡這一特性,指定一個事件處理程序,管理這一類的所有事件,在他的父元素或更高元素設(shè)置事件處理程序,將子元素事件委托給父元素事件。達(dá)到省時省力的效果。
- document load 和document ready的區(qū)別
- ready----表示文檔結(jié)構(gòu)已經(jīng)加載完成(不包含圖片等非文字媒體文件)
$(function(){})===$(document).ready(function(){}) - load----表示頁面包含圖片等文件在內(nèi)的所有元素都加載完畢
window.onload=function(){}
- 一個接口為ajax/api.jsp,請求方式為GET,有一個名為ulr的參數(shù)。值為當(dāng)前頁面的URl,正常情況下,返回到內(nèi)容是{result:true,mes:"success"},請用ajax組件,寫一段在正常瀏覽器可以運(yùn)行的代碼,將結(jié)果解析成json的對象格式
★★★★
- JavaScript的基本命名規(guī)范
- 首先區(qū)分大小寫,命名可以以字母、字母下劃線或
$
開頭,不能使用關(guān)鍵字和保留字,習(xí)慣駝峰命名法,首字母大寫命名法。命名一定要有意義。中文也是合法的標(biāo)識符,可以用作變量名。
- JavaScript的原型和原型鏈,有什么特點(diǎn)?
- 每個對象都會在其內(nèi)部初始化一個屬性,就是
prototype
屬性,當(dāng)我們訪問一個對象的屬性時,如果這個對象內(nèi)部不存在這個屬性,那么他就會去prototype
中去找這個屬性,這個prototype
又有自己的prototype
,于是就這樣一直找下去(這樣一直找下去就是Object
內(nèi)置對象),這就是原型鏈。 - 特點(diǎn):JavaScript對象是通過引用來傳遞的,當(dāng)我們修改原型對象時,與之相關(guān)的對象也會繼承這一改變。
- JavaScript如何實現(xiàn)繼承?
- 構(gòu)造繼承
- 原型繼承
- 實例繼承
- 拷貝繼承
- 原型
prototype
機(jī)制或apply
和call
方法去實現(xiàn)較簡單,一般使用構(gòu)造函數(shù)與原型混合方式
- JavaScript作用域鏈
- 全局作用域和局部作用域
- 當(dāng)需要從局部函數(shù)查找某一屬性或方法時,如果當(dāng)前作用域沒有找到,就會上溯到上層作用域查找,直至全局函數(shù),這種組織形式就是作用域鏈。
- 子對象會一級一級地向上尋找所有父對象的變量
- 代碼優(yōu)化:盡量少使用全局變量,盡可能使用局部變量。
//這個函數(shù)引用了兩次全局變量document,查找該變量必須遍歷整個作用域鏈,
//直到最后在全局對象中才能找到。
function changeColor(){
var doc=document;
doc.getElementById("btnChange").onclick=function(){
doc.getElementById("targetCanvas").style.backgroundColor="red";
};
}
- null和undefined的區(qū)別
- null對象----表示"沒有對象",此處不應(yīng)該有值。
(1) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對象。
(2) 作為對象原型鏈的終點(diǎn)。 - undefined----表示"缺少值",此處應(yīng)該有值但沒有定義
(1)變量被聲明了,但沒有賦值時,就等于undefined。
(2) 調(diào)用函數(shù)時,應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
(3)對象沒有賦值的屬性,該屬性的值為undefined。
(4)函數(shù)沒有返回值時,默認(rèn)返回undefined。
- 什么是閉包,為什么使用它?
- JavaScript的作用域,從外部無法調(diào)用函數(shù)內(nèi)的局部變量
- 閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),由于在JavaScript語言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量,因此可以簡單的理解為:定義在一個函數(shù)內(nèi)部的函數(shù)。
- 作用:可以從外部調(diào)用函數(shù)內(nèi)的局部變量;將這些變量的值始終保存在內(nèi)存中。
- new操作符究竟干了些什么?
function New (f) {
/1. 創(chuàng)建對象并設(shè)置原型鏈/
var n = { 'proto': f.prototype };
return function () {
/2. 設(shè)置this指向/
f.apply(n, arguments);
/3. 返回函數(shù)/
return n;
};
} - 寫一個js函數(shù),將地址參數(shù)解析為一個對象
- 刪除數(shù)組中的重復(fù)元素
- 如何判斷某個對象是否是某個類的實例化?
- 添加事件的方式?
- IE和doms事件的區(qū)別
- DOM 節(jié)點(diǎn)的所有操作和方法
- 強(qiáng)轉(zhuǎn)和隱式類型轉(zhuǎn)化
★★★
- JavaScript創(chuàng)建對象的幾種方式
- 字面量方式(json格式)
- new關(guān)鍵字
- 構(gòu)造函數(shù)function
- 混合型創(chuàng)建
function+prototype+new
- 什么是window對象? 什么是document對象?
- window對象----瀏覽器中一個打開的窗口對象,是一個頂層對象
document對象----html文檔對象,可用來訪問頁面中的所有元素,是window對象的成員對象子對象
- ["a","b","c"].map(parseInt)的結(jié)果是什么?
- javascript 中的“use strict”是什么意思?使用它區(qū)別是什么?
- 求兩個正整數(shù)的最大公約數(shù)
- ”==”和“===”的不同
- json和jsonp有什么差異?
- ajax 和jsonp的區(qū)別
- j延遲加載的方式
- 如何用js實現(xiàn)類,成員,私有變量?
- eval的作用
- js的兼容性問題
- 繼承的順序
- 解釋jsonp的原理,以及為什么不是真正的ajax
- javascript的本地對象,內(nèi)置對象和宿主對象
★★
- document.write 和innerHTML的區(qū)別?
- 使用閉包的例子
- 什么是cookie隔離?
- 所有可以在瀏覽器保存數(shù)據(jù),然后下次訪問的方式
- cookie
- sessionStorage 會話級本地存儲
- localStorage 永久級本地存儲
- 本地數(shù)據(jù)庫 瀏覽器端的數(shù)據(jù)庫支持
http://www.cnblogs.com/fly_dragon/p/3946012.html
http://blog.csdn.net/lxcao/article/details/52809939#comments
http://www.cnblogs.com/linguoguo/p/5106618.html
- 哪些操作會造成內(nèi)存泄露?
內(nèi)存泄露可以定義為應(yīng)用程序不再需要的內(nèi)存,因為某種原因其不會返回到操作系統(tǒng)或可用內(nèi)存池。 會導(dǎo)致遲緩,崩潰,高延遲等應(yīng)用問題。 - 聲明變量忘記使用關(guān)鍵字var創(chuàng)建一個意外的全局變量
* 為了防止這些錯誤發(fā)生,添加'use strict'; 在您的JavaScript文件的開頭。 這使得能夠更嚴(yán)格地解析JavaScript以防止意外的全局變量。
- 被遺忘的事件函數(shù)或回調(diào)函數(shù)
- 脫離 DOM 的引用
- 閉包
- javascript的同源策略
- 首先同源是指兩個url的協(xié)議,域名和端口相同
- 同源策略是瀏覽器上為安全性考慮實施的安全策略,限制了來自不同源的"document"或腳本,對當(dāng)前"document"讀取或設(shè)置某些屬性。
- 比如一個惡意網(wǎng)站的頁面通過iframe嵌入了銀行的登錄頁面(二者不同源),如果沒有同源限制,惡意網(wǎng)頁上的javascript腳本就可以在用戶登錄銀行的時候獲取用戶名和密碼。同源策略就是為了解決這類問題而出現(xiàn)的。
- 在瀏覽器中,<script>、< img>、<iframe>、<link>等標(biāo)簽都可以加載跨域資源,而不受同源限制,但瀏覽器限制了JavaScript的權(quán)限使其不能讀、寫加載的內(nèi)容。
- 另外同源策略只對網(wǎng)頁的HTML文檔做了限制,對加載的其他靜態(tài)資源如javascript、css、圖片等仍然認(rèn)為屬于同源。
- 本地對象,內(nèi)置對象,宿主對象
- 本地對象----
獨(dú)立于宿主環(huán)境的ECMAScript實現(xiàn)提供的對象
需要實例化的對象都為本地對象
Function Object Array Number String Boolean Date() 正則RegExp()
- 內(nèi)置對象----
由ECMAScript實現(xiàn)提供的、獨(dú)立于宿主環(huán)境的所有對象,在ECMAScript程序開始執(zhí)行時出現(xiàn)。
global對象和math對象 - 宿主對象----
由ECMAScript實現(xiàn)的宿主環(huán)境提供的對象,即我們網(wǎng)頁的運(yùn)行環(huán)境(操作系統(tǒng)和瀏覽器)
,所有的BOM和DOM都是宿主對象。
- this 的情況
- 在普通函數(shù)中,this指向的window對象
- 在構(gòu)造函數(shù)中,this指向的是實例化的對象
- 在方法中,this指向的是調(diào)用該方法的對象
- 在事件中,this指向的是事件觸發(fā)的對象
- 下面哪種寫法會報錯?
A: var a=();
B: var a={};
C: var a=[];
D: var a=/ /;
★
- 如果你手動實現(xiàn)動畫,你認(rèn)為最小的時間間隔是多少?
- 十六進(jìn)制顏色轉(zhuǎn)化為rgb顏色
var sRgb = "RGB(23, 245, 56)" , sHex = "#34538b";
var sHexColor = sRgb.colorHex(); //rgb顏色轉(zhuǎn)換為十六進(jìn)制顏色
var sRgbColor = sHex.colorRgb(); //十六進(jìn)制顏色轉(zhuǎn)換為rgb顏色 - 下面哪種寫法可以匹配一個正整數(shù)
A: ^[1-9]\d1.$;
B: ^[1-9]+$;
C: ^[0-9]\d1.$;
D: ^[1-9]\d+$;