1.js中有哪些數據類型,並解釋清楚原始數據類型和引用數據類型javascript
js中共有null
,undefined
, string
,number
,boolean
,object
六種數據類型。html
原始數據類型: null
,undefined
, string
,number
,boolean
java
引用數據類型:object
web
二者的區別:
1)值存儲方式不一樣:ajax
原始數據類型:將變量名和值都存儲在棧內存中正則表達式
引用數據類型:將變量名存儲在棧內存中,將值存儲在堆內存中,並在棧內存中存儲值的地址,該地址指向堆內存中的值。
數組
2)賦值方式不一樣:服務器
當給b賦予另外一個a的值
若a值爲原始數據類型,直接在棧內存中生成b值,兩個變量之後進行值改變不會相互影響閉包
若a值爲引用數據類型,賦予b變量的是值地址,經過這個地址,二者指向的實際上是堆內存中的同一個值,因此之後a,b任一變量對值進行改變,會直接影響另外一個變量的值
app
2. 解釋清楚 null 和 undefined
null
表示一個標識被賦值了,且該標識賦值爲「空值」,從邏輯角度來看,null值表示空對象指針;
undefined
表示聲明瞭標識,但沒有給標識賦值。
3. 如何複製一個對象的值?
function cloneObject(object){ var newObject = new Object(); for(var i in object){ newObject[i] = object[i]; } return newObject; }
4. js在何時會進行隱式類型轉換,轉換的結果?
數值運算
if
.
調用方法或屬性
!和!!
5. 類型識別的方法?
typeof a
能夠判別標準類型,除了null以外typeof 1
返回結果:"number" typeof {}
返回結果:"object"
不能判別具體的對象類型,除了function以外typeof [1]
返回結果:"object" typeof function(){}
返回結果:"function"
a instanceof b
能夠判別內置對象類型[] instanceof Array
返回結果:true new String() instanceof String
返回結果:true
不能判別原始類型值'a' instanceof String
返回結果:false
能夠判別自定義對象類型
function Point(x,y){ this.x = x; this.y = y } var c = new Point(1,2) c instanceof Point
返回結果:true
a.constructor
能夠判別標準數據類型(undefined和null除外)'123'.constructor == String
返回結果:true
能夠判別具體的內置對象類型[1,2].constructor == Array
返回結果:true
能夠判別自定義對象類型
function Point(x,y){ this.x = x; this.y = y } var c = new Point(1,2) c.constructor == Point
返回結果:true
Object.prototype.toString.call(a)
能夠判別標準數據類型Object.prototype.toString.call(1)
返回結果:"[object Number]" Object.prototype.toString.call(undefined)
返回結果:"[object Undefined]"
能夠判別內置對象類型 Object.prototype.toString.call([a])
返回結果:"[object Array]"
不能判別自定義對象類型
function Point(x,y){ this.x = x; this.y = y } var c = new Point(1,2) Object.prototype.toString.call(c)
返回結果:"[object Object]"
工做中能夠寫一個函數方便斷定
function type(obj){ return Object.prototype.toString.call(obj).slice(8,-1) }
type('a')
返回結果: "String" type([a])
返回結果: "Array"
1. 函數裏的this什麼含義,什麼狀況下,怎麼用?
誰調用的方法或者屬性,this就指向誰
若是沒有被誰調用,this指向window
2. bind,call,apply方法的使用,什麼區別?何時用?
3. 函數curry化
函數curry化是什麼意思?
把接受多個參數的函數轉換爲接受單一參數的函數,且函數能夠持續接收參數
將一個複雜的問題片斷化,使之進行簡化
3. 數組和對象有哪些原生方法,列舉一下,分別是什麼含義,好比連接兩個數組用哪一個方法,刪除數組的指定項。
1. 講一下 prototype 是什麼東西,原型鏈的理解,何時用 prototype?
proto
構造函數
1.什麼是閉包?
2.閉包的做用和使用場景
閉包的做用一:隱藏、封裝
閉包的做用二:記憶函數
1.講解原生Js實現ajax的原理。
Ajax 的全稱是Asynchronous JavaScript and XML,其中,Asynchronous 是異步的意思,它有別於傳統web開發中採用的同步的方式。
Ajax的原理簡單來講經過XmlHttpRequest對象來向服務器發異步請求,從服務器得到數據,而後用javascript來操做DOM而更新頁面。
XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是javascript能夠及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。
XMLHttpRequest這個對象的屬性有:
onreadystatechange 每次狀態改變所觸發事件的事件處理程序。
responseText 從服務器進程返回數據的字符串形式。
responseXML 從服務器進程返回的DOM兼容的文檔數據對象。
status 從服務器返回的數字代碼,好比常見的404(未找到)和200(已就緒)
status Text 伴隨狀態碼的字符串信息
readyState 對象狀態值
0 (未初始化) 對象已創建,可是還沒有初始化(還沒有調用open方法)
1 (初始化) 對象已創建,還沒有調用send方法
2 (發送數據) send方法已調用,可是當前的狀態及http頭未知
3 (數據傳送中) 已接收部分數據,由於響應及http頭不全,這時經過responseBody和responseText獲取部分數據會出現錯誤,
4 (完成) 數據接收完畢,此時能夠經過經過responseXml和responseText獲取完整的迴應數據
Question: How would you make this work?
add(2, 5); // 7 add(2)(5); // 7
function addto(){ var length = arguments.length; var sum = 0; for(var i = 0;i<length;i++){ sum += arguments[i] } return sum; } function add(){ var value = addto.apply(add,arguments); var helper = function(next){ typeof next == "number" ? value+=next:value; return helper } helper.valueOf = function(){ return value; } return helper; }
Make this work: duplicate([1,2,3,4,5]); // [1,2,3,4,5,1,2,3,4,5]
function duplicate(arr){ var length = arr.length; for(var i=0;i<length;i++) arr.push(arr[i]) return arr; }
3.如何獲取一個大於等於0且小於等於9的隨機整數?.
function randomNum(){ return Math.floor(Math.random()*10) }
4.想要去除一個字符串的第一個字符,有哪些方法能夠實現.
str.slice(1) str.substr(1) str.substring(1) str.replace(/./,'') str.replace(str.charAt(0),'')
5.對一個數組(每項都是數值)求和,有哪些方法?
6.If you have var y = 1, x = y = typeof x; What is the value of x?Answer: "undefined"