一、基礎(chǔ)類型有哪些?復(fù)雜類型有哪些?有什么特征?
基礎(chǔ)類型值(數(shù)值、布爾值、null和undefined):指的是保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段;
var a=1;
var b=a;//將a的值賦給b,b的值變?yōu)?,
a=2;//重新給a賦值,a的值改變,但b的值不變
console.log(b);//1
復(fù)雜類型包括:對(duì)象、數(shù)組、函數(shù)、正則,指的是那些保存在堆內(nèi)存中的對(duì)象,變量中保存的實(shí)際上只是一個(gè)指針,這個(gè)指針執(zhí)行內(nèi)存中的一個(gè)位置,由該位置保存對(duì)象。
var arr1=[1,2,3],
arr2=arr1;//將arr1的地址傳給arr2
arr1.push(4);
console.log(arr2);
2.如下代碼的輸出? 為什么?
var obj1={a:1,b:2};
var obj2={a:1,b:2};
console.log(obj1==obj2);//false,obj1和obj2指向的地址不同
console.log(obj1=obj2);//將obj2的地址賦給obj1,輸出結(jié)果為{a:1,b:2}
console.log(obj1==obj2);//true,obj1和obj2指向的地址相同
代碼題:
1.寫一個(gè)函數(shù)getIntv,獲取從當(dāng)前時(shí)間到指定日期的間隔時(shí)間
var str=getIntv("2016-01-08");
console.log(str);//距除夕還有20天15小時(shí)20分10秒
實(shí)現(xiàn):
function getInv(newDate){
var endDate=new Date(newDate).getTime();
var startDate=Date.now();
var a=endDate-startDate;
var b=Math.floor(a/(24×60×60×1000));
var c=Math.floor((a-(b×24×60×60×1000))/(60×60×1000));
var d=Math.floor((a-(b×24×60×60×1000+c×60×60×1000))/(60×1000));
var e=Math.floor((a-(b×24×60×60×1000+c×60×60×1000+d×60×1000))/1000);
return ("距離國(guó)慶節(jié)還有"+b+"天"+c+"時(shí)"+d+"分"+e+"秒");
}
var str=getInv("2016-10-01");
console.log(str);//距離國(guó)慶節(jié)還有89天10時(shí)51分7秒
2.把數(shù)字日期改成中文日期
function getChsDate(str){
var arr=['零','一','二','三','四','五','六','七','八','九','十','十一','十二','十三','十四','十五','十六','十七','十八','十九','二十','二十一','二十二','二十三','二十四','二十五','二十六','二十七','二十八','二十九','三十','三十一'];
var date=new Date(str);
var year=date.getFullYear().toString();//將年份轉(zhuǎn)化成字符串
var month=date.getMonth();
var day=date.getDate();
var str=[];
for(var i=0;i < year.length;i++){//循環(huán)遍歷字符串
str+=arr[year[i]];
}
str+="年"+arr[month+1]+"月"+arr[day]+"日";
return str;
}
var str=getChsDate('2015-01-08');
console.log(str);//二零一五年一月八日
3.寫一個(gè)函數(shù)獲取n天前的日期
<pre>
var lastWeek=getLastNDays(7);//'2016-06-26'
var lastMonth=getLastNDay(30);//'2016-06-03'
</pre>
實(shí)現(xiàn):
function getLastNDays(days){
var dateNow=Date.now();
var day=days*24*60*60*1000;
var result=new Date(dateNow-day);
console.log(result.getFullYear()+'-'+(result.getMonth()+1)+'-'+result.getDate());
}
var lastWeek=getLastNDays(7);//'2016-06-26'
var lastMonth=getLastNDays(30);//'2016-06-03'
4.完善如下代碼,用于獲取執(zhí)行時(shí)間如:
var Runtime = (function(){
var startDate,endDate;
return {
start: function(){
startDate=Date.now();
return startDate;
},
end: function(){
endDate=Date.now();
return endDate;
},
get: function(){
return endDate-startDate;
}
};
}());
Runtime.start();
for(i=0;i<1000;i++){
console.log(i);
}
Runtime.end();
console.log( Runtime.get() );
5.樓梯有200級(jí),每次走1級(jí)或是2級(jí),從底走到頂一共有多少種走法?用代碼(遞歸)實(shí)現(xiàn)
分析:設(shè)n是階數(shù),f(n)是上n階的不同走法,則第一步可以走一階或者兩階,那么這兩種情況下剩余的階數(shù)分別是n-1、n-2,所以f(n)=f(n-1)+f(n-2).
function f(n){
if(n==1){//如果最后一步剩下一步就只有一種走法
return 1;
}else if(n==2){//如果最后一步剩下兩步就有兩個(gè)走法
return 2;
}else{
return f(n-1)+f(n-2);
}
}
在做下面的題目之前,我們首先理解下淺拷貝和深拷貝
javascript基于對(duì)象,對(duì)象的創(chuàng)建可以采用拷貝的方式來(lái)做。但是分為淺拷貝和深拷貝兩種。
淺拷貝:只拷貝基本類型,不拷貝引用類型
實(shí)例:
function simpleClone(copy){
var obj={};
for(var i in copy){
if(copy.hasOwnProperty(i)){
obj[i]=copy[i];
}
}
return obj;
}
var copy={
name:"張三",
say:function(){
return "我要做有思想的程序員";
},
children:["小明","小紅"],
position:{
x:10,
y:20
}
}
var result=simpleClone(copy);
console.log(result.name);//張三
console.log(result.say());//我要做有思想的程序員
console.log(result.position.x);//10
console.log(result.children.toString());//小明,小紅
//對(duì)原值進(jìn)行修改,看是否影響拷貝后的值
copy.name="李四";
copy.say=function(){
return "我喜歡旅游";
}
copy.position.x=50;
copy.children[0]="小黑";
console.log(result.name);//張三 淺拷貝 只拷貝屬性,方法,不拷貝引用。
console.log(result.say());//張三說(shuō)話了
console.log(result.position.x);//50 說(shuō)明對(duì)原值的更改會(huì)影響拷貝后的元素
console.log(result.children.toString());//小黑,小紅
//說(shuō)明對(duì)原值的更改會(huì)影響拷貝后的元素
深拷貝指的是基本類型和引用類型都拷貝。
6.寫一個(gè)json對(duì)象深拷貝的方法,json對(duì)象可以多層嵌套,值可以是字符串、數(shù)字、布爾、json對(duì)象中的任意項(xiàng)
function deepClone(copy){
var obj={};
for(var i in copy){
if(typeof(copy[i])==="object"){
obj[i]=deepClone(copy[i]);
}else{
obj[i]=copy[i];
}
}
return obj;//一個(gè)新的對(duì)象,和原來(lái)的對(duì)象沒(méi)有關(guān)系
}
var copy={
name:"張三";
children:["小明","小紅"],
position:{
x:10,
y:20
}
}
var result=deepClone(copy);
console.log(result.name);//張三
console.log(result.position.x);//10
console.log(result.children.toString());//小明,小紅
//對(duì)原值進(jìn)行修改,看是否影響拷貝后的值
copy.name = "李四";
copy.position.x= 50;
console.log(result.name);//張三
console.log(result.position.x);//10
console.log(result.children.toString());//小明,小紅
//對(duì)原值的修改不會(huì)影響復(fù)制后的值
7.寫一個(gè)數(shù)組深拷貝的方法,數(shù)組里的值可以是字符串、數(shù)字、布爾、數(shù)組中的任意項(xiàng)目
function deepClone(arr){
var newArr=[];
for(var i in arr){
if(typeof(arr[i])==="object"){
newArr[i]=deepClone(arr[i]);
}else{
newArr[i]=arr[i];
}
}
return newArr;
}
var arr=[1,2,3,"jirengu",false];
var result=deepClone(arr);
console.log(result);//[1,2,3,"jirengu",false]
8.寫一個(gè)深拷貝的方法,拷貝對(duì)象以及內(nèi)部嵌套的值可以是字符串、數(shù)字、布爾、數(shù)組、json對(duì)象中的任意項(xiàng)
function deepClone(copy) {
var obj = {};
for ( var i in copy) {
if(typeof(copy[i]) === Object){
obj[i] = deepClone(copy[i]);
}else{
obj[i] = copy[i];
}
}
return obj;
}
var copy = {
name : "張三",
say:function(){
return "我要做有思想的程序員";
},
children:["小明","小紅"],
position:{
x:10,
y:20
}
}
var result = deepClone(copy);
console.log(result);
輸出結(jié)果為:

總結(jié)下:
js中的賦值都為引用傳遞.就是說(shuō),在把一個(gè)對(duì)象賦值給一個(gè)變量時(shí),那么這個(gè)變量所指向的仍就是原來(lái)對(duì)象的地址.引用就是淺拷貝。深拷貝就是不僅復(fù)制對(duì)象的基本類,同時(shí)也復(fù)制原對(duì)象中的對(duì)象.就是說(shuō)完全是新對(duì)象產(chǎn)生的,新對(duì)象所指向的不是原來(lái)對(duì)像的地址。
參考文章:
1.javascript 深拷貝和淺拷貝
2.Object.prototype.hasOwnProperty()
版權(quán)歸本人所有,如有轉(zhuǎn)載,請(qǐng)注明來(lái)源