时间对象、引用类型

问题

基础类型有哪些?复杂类型有哪些?有什么特征?

基本数据类型包括 Undefined 、 Null 、 Boolean 、 Number 和 String 。

复杂类型包括 Object、 Array 、DateRegExp 、Function

  • 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
  • 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;
  • 引用类型的值是对象,保存在堆内存中;
  • 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
  • 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;
  • 确定一个值是哪种基本类型可以使用 typeof 操作符,而确定一个值是哪种引用类型可以使用instanceof 操作符

代码

1.写一个函数getIntv,获取从当前时间到指定日期的间隔时间

var str = getIntv("2016-01-08");
console.log(str);  // 距除夕还有 20 天 15 小时 20 分 10 秒
        // var str = getIntv("2016-01-08");
        // console.log(str);  // 距除夕还有 20 天 15 小时 20 分 10 秒
        function getIntv(argument) {
            var time=Date.parse(argument),now=Date.now(),min=time-now-8*60*60*1000;
            min=min>0?min:-min;
            day=Math.floor(min/86400000);
            hour=Math.floor(min/3600000-day*24);
            mins=Math.floor(min/60000-hour*60-day*24*60);
            s=Math.floor(min/1000-mins*60-hour*60*60-day*24*60*60);

            if ((time-now)>0) {
                console.log('距'+argument+'还有 '+day+'天'+ hour+'小时' + mins+'分'  +s+'秒' );
                
            }
            else {
                console.log('距'+argument+'过去了 '+day+'天'+ hour+'小时' + mins+'分'  +s+'秒' );
            }
            
        }
         getIntv("2016-04-08");

2. 把数字日期改成中文日期

var str = getChsDate('2015-01-08');console.log(str); // 二零一五年一月八日
// 把数字日期改成中文日期
    // var str = getChsDate('2015-01-08');
    // console.log(str);  // 二零一五年一月八日
    function getChsDate(str) {
        var Num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
        var Name = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
        var arrs = str.split('-');

        function toArr(arri) {
            var arr = [
                [],
                [],
                []
            ];
            for (var i = 0; i < arri.length; i++) {
                for (var j = 0; j < arri[i].length; j++) {
                    arr[i].push(Name[arri[i][j]]);
                }
            }
            return arr;

        }
        arrs = toArr(arrs);
        console.log(arrs);

        function cutdown(arr) {

            switch (arr[0]) {
                case Name[0]:
                    arr.splice(0, 1);
                    break;
                case Name[1]:
                    arr.splice(0, 1, '十');
                    break;
                case Name[2]:
                    arr.splice(1, 0, '十');
                    break;
            }

            return arr;
        }
        for (var i = 1; i < arrs.length; i++) {
            arrs[i] = cutdown(arrs[i]);
        }

        arrs[0].push('年');
        arrs[1].push('月');
        arrs[2].push('日');

        var newstr = '';
        for (var i = 0; i < arrs.length; i++) {
            newstr += arrs[i].join('');
        }

        console.log(newstr);

    }

    getChsDate('2015-11-28');

3.写一个函数获取n天前的日期

var lastWeek = getLastNDays(7); // ‘2016-01-08’
var lastMonth = getLastNDays(30); //'2015-12-15'
//写一个函数获取n天前的日期
    var lastWeek =  getLastNDays(7); 
    var lastMonth = getLastNDays(30);
    function getLastNDays(num) {      
        var day=new Date(Date.now()-num*24*3600*1000);
        year=day.getFullYear();
        mouth=day.getMonth()+1;
        date=day.getDate();
        var arr=[year,mouth,date];
        return str=arr.join("-");      
        }
         
  
    console.log(lastWeek);
    console.log(lastMonth);

4.完善如下代码,如:

var Runtime = (function(){
    //code here ...
    return {
        start: function(){
              //code here ...
        },
        end: function(){
             //code here ...
        },
        get: function(){
             //code here ...
        }
    };
}());
Runtime.start();
//todo somethint
Runtime.end();
console.log(  Runtime.get() );
 var Runtime = (function() {
        var startTime;
        var endTime;
        var passTime;
        return {
            start: function() {
                startTime = Date.now();
                return startTime;
            },
            end: function() {
                endTime = Date.now();
                return endTime;
            },
            get: function() {

                passTime = (endTime - startTime) / 1000;
                return '程序运行耗时 ' + passTime + ' s';
            }
        };
    }());
    Runtime.start();
    function fn(num) {
        if (num==0||num==1) {
            return 1;
        }
        else {
            return fn(num-1)+fn(num-2);
        }
    }
    console.log(fn(40)) ;
    Runtime.end();
    console.log(Runtime.get()); //程序运行耗时 1.757 s

    Runtime.start();
    var f=[];
    function count(num) {
        f[1]=1;
        f[2]=2;
        for (var i = 3; i < num+1; i++) {
            f[i]=f[i-1]+f[i-2];
        }
        return f[num];
    }
    console.log(count(90));
    Runtime.end();
    console.log(Runtime.get());//程序运行耗时 0 s

5.楼梯有200级,每次走1级或是2级,从底走到顶一共有多少种走法?用代码(递归)实现

递归实现

function fn(num) {
        if (num==0||num==1) {
            return 1;
        }
        else {
            return fn(num-1)+fn(num-2);
        }
    }
console.log(fn(20));

非递归实现

var f=[];
    function count(num) {
        f[1]=1;
        f[2]=2;
        for (var i = 3; i < num+1; i++) {
            f[i]=f[i-1]+f[i-2];
        }
        return f[num];
    }
    console.log(count(20));

6.写一个json对象深拷贝的方法,json对象可以多层嵌套,值可以是字符串、数字、布尔、json对象中的任意项

function jsonDeepCopy(json) {
        var newjson = {};
        for (i in json) {
            if (typeof json[i] === 'object') {
                newjson[i] = jsonDeepCopy(json[i]);
            } else {
                newjson[i] = json[i];
            }
        }
        return newjson;
    }
    json1 = {
        name: 'John',
        age: 34,
        boolean: true,
        hobby: {
            food: 'water',
            color: 'red'
        }
    };
    var json2 = jsonDeepCopy(json1);
    console.log(json2);
    json2.hobby.color = 'blue';
    console.log(json2);
    console.log(json1);

7.写一个数组深拷贝的方法,数组里的值可以是字符串、数字、布尔、数组中的任意项目

function arrDeepCopy(arr) {
        var newarr = [];
        for (i in arr) {
            if (arr[i] instanceof Array) {
                newarr[i] = arrDeepCopy(arr[i]);
            } else {
                newarr[i] = arr[i];
            }
        }
        return newarr;
    }
    arr1 = [
    'John',
    34,
    true,
    ['water','red']
    ]

    var arr2 = arrDeepCopy(arr1);
    console.log(arr2);
    arr2[3][1] = 'blue';
    console.log(arr2);
    console.log(arr1);

8.写一个深拷贝的方法,拷贝对象以及内部嵌套的值可以是字符串、数字、布尔、数组、json对象中的任意项

function DeepCopy(obj) {
        var newobj = {};
        for (i in obj) {
            if (typeof obj[i] === 'object') {
                newobj[i] = (obj[i] instanceof Array) ? [] : {};
                newobj[i] = DeepCopy(obj[i]);
            } else {
                newobj[i] = obj[i];
            }
        }
        return newobj;
    }
    json1 = {
        name: 'John',
        age: 34,
        boolean: true,
        hobby: {
            food: 'water',
            color: 'red'
        },
        arr: ['arr1', 'arr2']
    };
    var json2 = DeepCopy(json1);
    console.log(json2);
    json2.hobby.color = 'blue';
    json2.arr[0] = 'newarr';
    console.log(json2);
    console.log(json1);

推荐阅读更多精彩内容