
NUM 19
<h4>1.基礎(chǔ)類(lèi)型有哪些?復(fù)雜類(lèi)型有哪些?有什么特征?</h4>
基礎(chǔ)類(lèi)型:
<li>數(shù)字(Number)
<li>字符串(String)
<li>布爾值(bollean)
<li>null
<li>undefined
</br>
復(fù)雜類(lèi)型:
<li>數(shù)組(Array)
<li>對(duì)象(object)
<li>函數(shù)(function)
<li>正則
</br>
特征:
<li>基礎(chǔ)類(lèi)型變量時(shí)存的是值,而復(fù)雜類(lèi)型變量時(shí)存的是內(nèi)存地址。
<li>因此基礎(chǔ)類(lèi)型在賦值的時(shí)候是拷貝值,而復(fù)雜類(lèi)型在賦值時(shí)是拷貝內(nèi)存地址。
圖片解釋?zhuān)?/h5>
簡(jiǎn)單類(lèi)型.jpg
復(fù)雜類(lèi)型.jpg

簡(jiǎn)單類(lèi)型.jpg

復(fù)雜類(lèi)型.jpg
<h4>2.如下代碼的輸出? 為什么?</h4>
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //flase;
console.log(obj1 = obj2); //Object{a:1,b:2};
console.log(obj1 == obj2); //ture
解釋?zhuān)?br>
首先,obj1和obj2是復(fù)雜類(lèi)型,在賦值時(shí),分別賦予不同內(nèi)存的地址,所以,console.log(obj1 == obj2)即是比較兩個(gè)內(nèi)存地址是否相等,因此輸出flase,而console.log(obj1 = obj2)是將obj2的內(nèi)存地址賦值在obj1上,而obj2的內(nèi)存地址保存著{a:1,b:2},因此輸出Object{a:1,b:2},而最后一個(gè)console.log(obj1 == obj2),因此前obj1已經(jīng)賦值了obj2的內(nèi)存地址,因此返回ture。
</br>
<h3>2.代碼</h3>
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(time){
var t1 = Date.parse(time)-Date.now();
var t2 = t1/(24*60*60*1000);
var d = Math.floor(t2);
var h = Math.floor((t2-d)*24);
var m = Math.floor(((t2-d)*24)-h)*60;
var s = Math.floor(((t2-d)*24)*60-m)*60;
return time = "距離" + time + "還有" + d + "天" + h+"小時(shí)" + m+ "分鐘" + s +"秒";
}
var str = getIntv("2017/11/30");
str;

</br>
#####2.把數(shù)字日期改成中文日期
var str = getChsDate('2015-01-08');
console.log(str); // 二零一五年一月八日
代碼:
function getChsDate(time){
var date = ['零','一','二','三','四','五','六','七','八','九','十','十一','十二','十三','十四','十五','十六','十七','十八','十九','二十','二十一','二十二','二十三','二十四','二十五','二十六','二十七','二十八','二十九','三十','三十一'];
var a = new Date(time);
var b = a.getFullYear()+'';
var year = '' ;
for(var i=0 ; i<b.length;i++){
year = year + date[b[i]];
};
var month = date[a.getMonth()+1 ];
var day = date[a.getDate()];
return year + '年' + month + '月' + day + '日';
}
執(zhí)行結(jié)果:

#####5.寫(xiě)一個(gè)函數(shù)獲取n天前的日期
var lastWeek = getLastNDays(7); // ‘2016-01-08’
var lastMonth = getLastNDays(30); //'2015-12-15'
代碼:
function getLastDays(time){
var a = Date.now();
var b = time*(24*60*60*1000)
var d = a - b ;
var ld = new Date(d);
return ld.getFullYear()+'-'+(ld.getMonth()+1)+'-'+ld.getDate()
}
執(zhí)行結(jié)果:

#####6.完善如下代碼,用于獲取執(zhí)行時(shí)間如:

var Runtime = (function(){
var st; var ed; var rt;
var obj = {
start : function(){
st = Date.now();
},
end : function(){
ed =Date.now();
},
get : function(){
return rt = ed - st;
}
};
return obj;
}());
Runtime.start();
for(var i=0;i<1000;i++){
console.log(1);
};
Runtime.end();
console.log( Runtime.get() );
執(zhí)行結(jié)果:

#####7.樓梯有20級(jí),每次走1級(jí)或是2級(jí),從底走到頂一共有多少種走法?用代碼(遞歸)實(shí)現(xiàn)
function getWay(n){
if(n === 1){
return 1;
}else if(n === 2){
return 2;
}
else{
return getWay ( n - 1 ) + getWay ( n - 2);
}
}
//測(cè)試
var num5 = getWay(5);
var num20 = getWay(20);
console.log(num5);
console.log(num20);
#####8.寫(xiě)一個(gè)json對(duì)象深拷貝的方法,json對(duì)象可以多層嵌套,值可以是字符串、數(shù)字、布爾、json對(duì)象中的任意項(xiàng)(PS:嘗試另外一種方法 `var obj2 = JSON.parse( JSON.stringify(obj1)`)
JSON深拷貝一:
var west = {
name :'Westbook',
age : 26,
sex : 'man',
other:{
name: 'Durant',
agr : 27,
sex : 'man'
}
};
function copyObject(obj){
var obj2 = {};
for(key in obj){
if(typeof obj[key] == 'object'){
obj2[key] = copyObject(obj[key]);
}else{
obj2[key] = obj[key];
}
};
return obj2;
};
JSON深拷貝二:
var west = {
name :'Westbook',
age : 26,
sex : 'man',
other:{
name: 'Durant',
agr : 27,
sex : 'man'
}
};
function copyObj(obj){
var str = JSON.stringify(obj);
return JSON.parse(str);
};
參考資料:
<a >javascript遞歸函數(shù)理解和說(shuō)明</a>
<a >javascript中的淺拷貝和深拷貝</a>
<a >阮一峰JS教程</a>
**版權(quán)歸饑人谷peter和饑人谷所有,若有轉(zhuǎn)載,請(qǐng)注明來(lái)源**
感謝瓜子板凳觀眾:
