JS基礎(chǔ)知識(shí)知多少(四)--時(shí)間對(duì)象、引用類型

一、基礎(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)源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 基礎(chǔ)類型有哪些?復(fù)雜類型有哪些?有什么特征?5種簡(jiǎn)單數(shù)據(jù)類型(基本數(shù)據(jù)類型):Undefined、Null、Boo...
    coolheadedY閱讀 375評(píng)論 0 0
  • 一、問(wèn)題 1、基礎(chǔ)類型有哪些?復(fù)雜類型有哪些?有什么特征? 基礎(chǔ)類型包括:Undefined,Number,Str...
    該帳號(hào)已被查封_才怪閱讀 434評(píng)論 0 0
  • 老師罰站我,不開(kāi)心, 老師罰站你,不開(kāi)心, 老師罰站我們,好開(kāi)心呀。
    邪楓少閱讀 224評(píng)論 1 0
  • 0.2.5 關(guān)注用戶體驗(yàn) 用戶體驗(yàn)影響產(chǎn)品口碑,口碑影響產(chǎn)品成敗,產(chǎn)品成敗影響產(chǎn)品經(jīng)理的利益。 0.2.6 管理項(xiàng)...
    慎思明辨_ym閱讀 451評(píng)論 0 1
  • 轉(zhuǎn)身離開(kāi)的周媚兒,剛好與進(jìn)來(lái)的美麗女子撞個(gè)照面。 都是些下賤貨色!然后冷哼一聲就離開(kāi)。下人也識(shí)趣地退下,并關(guān)好大門...
    清薇憶閱讀 470評(píng)論 0 0

友情鏈接更多精彩內(nèi)容