一举娩,問(wèn)答
1析校,基礎(chǔ)類(lèi)型有哪些?復(fù)雜類(lèi)型有哪些铜涉?有什么特征智玻?
基礎(chǔ)類(lèi)型:指的是保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段。主要包括:數(shù)值芙代,布爾值吊奢,null,undefined纹烹。
特征:解釋如下圖页滚,定義房間一,并在房間一內(nèi)放入a=1,铺呵。然后定義房間二裹驰,房間二完全等于房間一。這是將房間一中的a重新復(fù)制為2片挂,并不會(huì)改變房間二中a=1幻林。
- 復(fù)雜類(lèi)型(引用類(lèi)型):指的是保存在堆內(nèi)存中的對(duì)象,變量中保存的實(shí)際只是指針音念,指針執(zhí)行內(nèi)存中另一個(gè)位置保存的對(duì)象沪饺。主要包括:對(duì)象,數(shù)組闷愤,函數(shù)整葡,正則。
- 特征:解釋如下圖肝谭,定義任意門(mén)一掘宪,里面放name=valley,再定義任意門(mén)二完全等于任意門(mén)一蛾扇,但是他們所放到內(nèi)容都被放入空地上,這時(shí)魏滚,改變?nèi)我忾T(mén)一中的name值镀首,任意門(mén)二中的內(nèi)容也被改變。
兩種訪問(wèn)方式:
基本類(lèi)型值:按值訪問(wèn)鼠次,操作的是他們實(shí)際保存的值更哄;
引用類(lèi)型值:按引用訪問(wèn),當(dāng)查詢(xún)時(shí)腥寇,我們需要先從棧中讀取內(nèi)存地址成翩,然后再順藤摸瓜地找到保存在堆內(nèi)存中的值;
基本類(lèi)型變量的復(fù)制:從一個(gè)變量向一個(gè)變量復(fù)制時(shí)赦役,會(huì)在棧中創(chuàng)建一個(gè)新值麻敌,然后把值復(fù)制到為新變量分配的位置上;
引用類(lèi)型變量的復(fù)制:復(fù)制的是存儲(chǔ)在棧中的指針掂摔,將指針復(fù)制到棧中未新變量分配的空間中术羔,而這個(gè)指針副本和原指針執(zhí)行存儲(chǔ)在堆中的同一個(gè)對(duì)象;復(fù)制操作結(jié)束后乙漓,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象级历;因此改變其中的一個(gè),將影響另一個(gè)叭披;
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);
- 答案:
false;
object{a:1; b=1}
true
解釋?zhuān)?/p>
false是因?yàn)閮蓚€(gè)對(duì)象保存的地址不同,相當(dāng)于存在兩個(gè)空地上涩蜘,即使存放的東西相同嚼贡。
object{a:1; b=1}是因?yàn)槎xobj1=obj2;
true是因?yàn)樯蠗l命令生效,obj1=obj2皱坛,存放地址相同编曼,因此true。
一剩辟,代碼
1,寫(xiě)一個(gè)函數(shù)getIntv往扔,獲取從當(dāng)前時(shí)間到指定日期的間隔時(shí)間
var str = getIntv("2016-01-08");
console.log(str); // 距除夕還有 20 天 15 小時(shí) 20 分 10 秒
- 答案:
function getIntv(data){
var distance = Date.parse(data)-Date.now();
var days = Math.floor(distance/1000/60/60/24);
var hours = Math.floor((distance-days*1000*60*60*24)/1000/60/60);
var minutes = Math.floor((distance-days*1000*60*60*24-hours*1000*60*60)/1000/60);
var secounds = Math.floor((distance-days*1000*60*60*24-hours*1000*60*60-minutes*1000*60)/1000);
return "距離除夕還有"+days+"天"+hours+"小時(shí)"+minutes+"分"+secounds+"秒";
}
var str = getIntv("2017-01-27");
console.log(str);
2贩猎,把數(shù)字日期改成中文日期
var str = getChsDate('2015-01-08');
console.log(str); // 二零一五年一月八日
- 答案:
function getChsDate(data){
var array = data.split('-');
var year = "";
var hanzi = ['零','一','二','三','四','五','六','七','八','九'];
for(i=0; i<4; i++){
year += hanzi[array[0][i]];
}
function m_d(sth){
if(sth.length==1){
sth = "0"+sth;
};
if(sth[0]==0){
return hanzi[sth[1]];
};
if(sth[0]==1){
return "十" + hanzi[sth[1]];
};
if(sth[0]==2){
return "二十" + hanzi[sth[1]];
};
if(sth[0]==3){
if(sth[1]==0){
return "三十";
};
return "三十"+ hanzi[sth[1]];
}
}
return year+"年"+m_d(array[1])+"月"+m_d(array[2])+'日';
}
var str = getChsDate('2015-05-31');
console.log(str); // 二零一五年一月八日
另一種想法:
function getChsDate(data){
var array = ['零','一','二','三','四','五','六','七','八','九'];
dataArr = data.split('-').join('').split('');
if(dataArr[4]=="0"){
dataArr.splice(4,1);
}else{
return dataArr;
};
if(dataArr[dataArr.length-2]=="0"){
dataArr.splice(length-2,1);
}else{
return dataArr;
};
console.log(dataArr)
var result=[];
for(i=0; i<9; i++){
result.push(array[dataArr[i]]);
}
console.log(result)
return result;
}
tip:
字符串可以直接加上數(shù)組,得到字符串萍膛;
字符串擁有長(zhǎng)度吭服,下標(biāo)等屬性;
3蝗罗,寫(xiě)一個(gè)函數(shù)獲取n天前的日期
var lastWeek = getLastNDays(7);
// ‘2016-01-08’
var lastMonth = getLastNDays(30);
//'2015-12-15'
- 答案:
function getLastNDays(data){
var time1 = Date.now() - data*1000*60*60*24;
var time2 = new Date(time1);
return time2.getFullYear()+'-'+(time2.getMonth()+1)+'-'+time2.getDate();
}
var lastWeek = getLastNDays(7);
// ‘2016-01-08’
var lastMonth = getLastNDays(30);
//'2015-12-15'
console.log(lastWeek)
console.log(lastMonth)
- 之前的想法:
4艇棕,完善如下代碼蝌戒,用于獲取執(zhí)行時(shí)間如:
var Runtime = (function(){
//code here ...
var obj = {
start: function(){
//code here ..., 當(dāng)前時(shí)間
},
end: function(){
//code here ... 結(jié)束時(shí)間
},
get: function(){
//code here ... 獲取執(zhí)行時(shí)間
}
};
return obj;
}());
Runtime.start();
//todo somethintRuntime.end();
console.log( Runtime.get() );
- 答案:
5沼琉,樓梯有20級(jí)北苟,每次走1級(jí)或是2級(jí),從底走到頂一共有多少種走法打瘪?用代碼(遞歸)實(shí)現(xiàn)
6友鼻,寫(xiě)一個(gè)json對(duì)象深拷貝的方法,json對(duì)象可以多層嵌套闺骚,值可以是字符串彩扔、數(shù)字、布爾僻爽、json對(duì)象中的任意項(xiàng)(PS:嘗試另外一種方法 var obj2 = JSON.parse( JSON.stringify(obj1)
)
- 答案:
7 實(shí)現(xiàn)n!
var sum = 1;
function recursion(n){
if(n !== 1){
sum *= n *(n-1);
recursion(n-2);
}else{
return sum;
}
return sum;
}
console.log(recursion(5))