1欺缘、基礎(chǔ)類型有哪些栋豫?復(fù)雜類型有哪些?有什么特征谚殊?
- 基礎(chǔ)類型:number,string,boolean,null,undefined;
- 復(fù)雜類型:對(duì)象丧鸯,數(shù)組(數(shù)組其實(shí)也是對(duì)象)等。
兩者最大的區(qū)別在于存儲(chǔ)方式的不同
- 基礎(chǔ)類型將內(nèi)容直接存儲(chǔ)在棧中嫩絮,記錄的是該數(shù)據(jù)類型的值丛肢,即直接訪問围肥;
- 復(fù)雜類型將內(nèi)容存儲(chǔ)在堆中,棧中記錄的是指針(堆的地址)摔踱,外部訪問時(shí)先引出地址虐先,再通過地址去找到值所存放的位置。
如圖所示派敷,可以理解為A,B,C,D這些變量名代表了一個(gè)盒子:
- 基礎(chǔ)類型盒子里裝的是真實(shí)的值蛹批,以A,B為例:
- 復(fù)雜類型盒子里裝的是地址(當(dāng)然地址具體的值我們是不知道的圖中地址的值只是假設(shè))
2篮愉、如下代碼的輸出? 為什么?
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);
- 第一個(gè)是false腐芍;問題一已經(jīng)解釋了對(duì)象的存儲(chǔ)方式,obj1與obj2代表了兩個(gè)不同的對(duì)象试躏,盡管它們的內(nèi)容相同猪勇,但其內(nèi)部的地址,以及地址所指引的空間都不相同颠蕴,所以它們是兩個(gè)對(duì)象泣刹。
- 第二個(gè)輸出的是obj2的內(nèi)容,把obj1中的地址數(shù)據(jù)賦值為obj2中的地址犀被,從而讓obj1指向obj2的對(duì)象椅您。
- 第三為true;既然兩個(gè)對(duì)象一致了寡键,輸出結(jié)果自然為true掀泳。
3、寫一個(gè)函數(shù)getIntv西轩,獲取從當(dāng)前時(shí)間到指定日期的間隔時(shí)間
function getIntv(time){
var definit = new Date(time).getTime();
var now = new Date().getTime();
var x = definit - now;
var day = Math.floor(x/1000/3600/24);
var hour = Math.floor(x%(1000*3600*24)/3600/1000);
var min = Math.floor(x%(1000*3600*24)%(3600*1000)/(60*1000));
var sec = Math.floor(x%(1000*3600*24)%(3600*1000)%(60*1000)/1000);
return "距離" + time + "還有" + day + "天" + hour + "小時(shí)" + min +"分" + sec +"秒";
}
4员舵、把數(shù)字日期改成中文日期
function getChsDate(time){
var CN=["零","一","二","三","四","五","六","七","八","九"];
var d = new Date(time),
year = d.getFullYear(),
month = d.getMonth(),
day = d.getDate();
var str="";
function printYear(year){
var yearArr = year.toString().split("");
for(var i = 0; i < 4; i++){
str += CN[yearArr[i]];
}
str += "年";
}
function printMonth(month) {
if (month > 9){
str += "十";
str += CN[month-9];
}
else {
str += CN[month+1];
}
str += "月";
}
function printDay(day) {
if (day < 11) {
str += CN[day];
}
else if(day < 20){
str += "十";
str += CN[day-10]
}
else if(day < 30){
str += "二十";
str += CN[day-20]
}
else {
str += "三十";
str += CN[day-30]
}
str += "日"
}
printYear(year);
printMonth(month);
printDay(day);
return str;
}
console.log(getChsDate('2015-01-08'));
console.log(getChsDate('2015-11-28'));
4、寫一個(gè)函數(shù)獲取n天前的日期
function getLastNDays(n) {
var now = new Date().getTime();
var destination = new Date(now - n * 3600 * 1000 * 24);
var month = destination.getMonth()+1;
return destination.getFullYear() + "-" + month + "-" + destination.getDate();
}
console.log(lastWeek = getLastNDays(7));
console.log(lastMonth = getLastNDays(31));
5藕畔、獲取執(zhí)行時(shí)間
var Runtime = (function(){
var startTime,endTime;
var obj = {
start: function(){
startTime = new Date().getTime();
},
end: function(){
endTime = new Date().getTime();
},
get: function(){
var time = endTime - startTime;
return time + "ms"
}
};
return obj;
}());
Runtime.start();
for(var i=0;i<10000;i++){
console.log(1)
}
Runtime.end();
console.log( Runtime.get() );
6马僻、樓梯有200級(jí),每次走1級(jí)或是2級(jí)注服,從底走到頂一共有多少種走法韭邓?用代碼(遞歸)實(shí)現(xiàn)
依照題意代碼應(yīng)該是這樣的:
function method(num){
var s = 0;
if(num == 1){
return 1;
}
else if(num == 2){
return 2;
}
else {
s= method(num-2) + method(num-1);
}
return s;
method(200);
在控制臺(tái)運(yùn)行時(shí),會(huì)發(fā)現(xiàn)一個(gè)問題——無法得出結(jié)果祠汇,并且網(wǎng)頁卡死了仍秤。那是不是這個(gè)算法有問題呢?其實(shí)不是可很,如果運(yùn)行method(10)
能得到結(jié)果(89)诗力。既然代碼沒問題,那又為什么會(huì)出現(xiàn)這樣的情況呢?
這時(shí)就需要知道一個(gè)概念:函數(shù)的堆棧溢出苇本,它出現(xiàn)的場(chǎng)合不少袜茧,但最常見的,沒錯(cuò)瓣窄,就是函數(shù)的大量遞歸笛厦。
簡單的說就是,堆和棧(主要是棧)是存在處理上限的俺夕,一旦需要待處理的函數(shù)中的(局部變量裳凸,傳遞參數(shù),返回值等等)超過其上限后劝贸,計(jì)算機(jī)就罷工了姨谷。而函數(shù)的遞歸的思路正好是:哥們:“這個(gè)問題我不會(huì),你幫我解決”映九,然后這個(gè)哥們?cè)絹碓蕉嗝蜗妫竭_(dá)一定閥值之后,程序就GG了件甥。所以解決這類由于遞歸出現(xiàn)的堆棧溢出的最好辦法就是即使釋放捌议,即使用閉包法:
function method(num){
var s = 0;
if(num == 1){
return 1;
}
else if(num == 2){
return 2;
}
else {
(function sum(){
return method(n-1) + method(n-2);
}())
return sum;
}
method(200);
當(dāng)然針對(duì)本題有一個(gè)更好的思路,很明顯就能發(fā)現(xiàn)這個(gè)題的一個(gè)特征:f(n) = f(n-1) + f(n-2);沒錯(cuò)引有,就是斐波拉契數(shù)列瓣颅。所以可以這樣
function method(num){
var s1=1,s2=2,temp;
if(num == 1){
return s1;
}
if(num == 2){
return s2;
}
for(var i = 0; i < num - 2; i++){
temp = s2;
s2 = s1 +s2;
s1 = temp;
}
return s2;
}
method(200); // 4.53973694165308e+41
7、寫一個(gè)json對(duì)象深拷貝的方法轿曙,json對(duì)象可以多層嵌套弄捕,值可以是字符串僻孝、數(shù)字导帝、布爾、json對(duì)象中的任意項(xiàng)
深淺拷貝的區(qū)別在于:
對(duì)象里的引用類型保存的指針是新的(深拷貝)穿铆,還是舊的(淺拷貝)您单。
jquery中的Object.extend()方法和ES6的Object.assign()方法就是淺拷貝;
function jsonCopy(obj){
var newJSON = {};
for(var key in obj){
if(typeof(obj[key]) == "object"){
newJSON[key] = jsonCopy(obj[key]);
}
else newJSON[key] = obj[key];
}
return newJSON;
}