js时间对象与引用类型

javascript数据类型中的基础类型有哪些?复杂类型有哪些?有什么特征?

  • 基本类型有number,boolean,string,null,undefined,它们的值存储在一块连续的栈内存中,单个数据占用内存较小。
  • 复杂类型有:object,Array,函数,正则,它们的值存储在堆内存中,变量中保存的只是一个指针,由指针指向存储值的堆内存。

如下代码的输出? 为什么?

1
2
3
4
5
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);

输出:1.false:因为obj1和obj2的类型书对象,一引用类型,里面存储的是一个指向存储在一块区域(堆内存)的指针,这两个存储的指针是不同的,所以 console.log(obj1 == obj2)输出false
2.Object {a: 1, b: 2}:第二句obj1=obj2是一个赋值语句,即把obj2的指针赋值给boj1,然后输出obj1,即obj1指针指向的内容:Object {a: 1, b: 2}
3.true:obj1里面存储的指针是obj2的指针,这两个变量名的内容是相等的,输出true。

代码

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function getIntv (date) {

    var inter = Date.parse(date) - Date.now();
    var days = Math.floor(inter/(24*60*60*1000));
    var hours = Math.floor((inter%(24*60*60*1000))/(60*60*1000));
    var minutes = Math.floor(((inter%(24*60*60*1000))%(60*60*1000))/(60*1000));
    var seconds = Math.floor((((inter%(24*60*60*1000))%(60*60*1000))%(60*1000))/1000);
    return "距除夕还有 "+ days + " 天 " + hours +" 小时 " + minutes + " 分 " + seconds + " 秒";
    }
    var str = getIntv("2017-01-27");
    console.log(str); // 距除夕还有 250 天 17 小时 38 分 50 秒
  • 把数字日期改成中文日期

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    function getChsDate (str) {
    var arr = str.split("-");
    var year = arr[0];
    var month = arr[1];
    var day = arr[2];
    var switchDate = {"0":"零","1": "一", "2": "二", "3": "三","4": "四",
    "5": "五","6": "六","7": "七", "8": "八", "9": "九",
    "10": "十", "11": "十一", "12": "十二","13": "十三",
    "14": "十四", "15": "十五", "16": "十六", "17": "十七",
    "18": "十八", "19": "十九","20": "二十","21": "二十一",
    "22": "二十二", "23": "二十三", "24": "二十四", "25": "二十五",
    "26": "二十六", "27": "二十七", "28": "二十八", "29": "二十九",
    "30": "三十", "31": "三十一"};

    return switchDate[year[0]] + switchDate[year[1]] + switchDate[year[2]] + switchDate[year[3]] + "年" + switchDate[Number(month)] +"月"+ switchDate[Number(day)] +"日";
    }
    var str = getChsDate('2015-01-08');
    console.log(str); // 二零一五年一月八日

修改后(上面json对象的方式明显复杂了):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getChsDate (str) {
var arr = str.split("-");
var year = arr[0];
var month = arr[1];
var day = arr[2];
var switchDate = ["零","一","二","三", "四","五", "六", "七", "八", "九",
"十", "十一", "十二","十三", "十四", "十五", "十六", "十七",
"十八", "十九", "二十", "二十一", "二十二", "二十三","二十四",
"二十五","二十六","二十七","二十八","二十九","三十","三十一"];

return switchDate[year[0]] + switchDate[year[1]] + switchDate[year[2]] + switchDate[year[3]] + "年" + switchDate[Number(month)] +"月"+ switchDate[Number(day)] +"日";
}
var str = getChsDate('2016-03-08');
console.log(str);

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function getLastNDays (n) {
    var during = n*24*60*60*1000,
    lastDay = new Date(Date.now()-during),
    year = lastDay.getFullYear(),
    day = lastDay.getDate(),
    month;
    if (lastDay.getMonth()<9) {
    month = "0"+(lastDay.getMonth()+1);
    }else{
    month = (lastDay.getMonth()+1);
    };
    return year +"-"+ month +"-"+ day;
    }
    var lastWeek = getLastNDays(7); // ‘2016-05-13’
    var lastMonth = getLastNDays(30); //'2015-04-20'
  • 完善如下代码,用于获取执行时间如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    var Runtime = (function(){

    return {
    start: function(){
    time1 = Date.now(); //code here ..., 当前时间

    },
    end: function(){
    time2 = Date.now();//code here ... 结束时间

    },
    get: function(){
    return (time2-time1);//code here ... 获取执行时间
    }
    };
    }());
    Runtime.start();

    for (var i = 0; i < 10000; i++) {
    var j=4+5;
    console.log(j);
    };
    Runtime.end();
    console.log(Runtime.get());//5332ms
  • 楼梯有200级,每次走1级或是2级,从底走到顶一共有多少种走法?用代码(递归)实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function countSteps(num){

    if(num === 1){
    return 1;
    }
    if(num === 2){
    return 2;
    }
    return countSteps(num-1)+countSteps(num-2);
    };
    console.log(countSteps(5));//200级数量太大,浏览器被卡住
  • 写一个json对象深拷贝的方法,json对象可以多层嵌套,值可以是字符串、数字、布尔、json对象中的任意项

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function jsonCopy(json){
    var newJson = {};
    for (var k in json) {
    if (typeof json[k] === 'object') {
    newJson[k] = jsonCopy(json[k]);
    }
    newJson[k] = json[k];
    }
    return newJson;
    }

    var json = {"name":"word","info":{"age":10,"sex":"男","favorite":"walk"}};
    console.log(jsonCopy(json));
  • 写一个数组深拷贝的方法,数组里的值可以是字符串、数字、布尔、数组中的任意项目

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function arrCopy (arr) {
    var newArr = [];
    for(k in arr){
    if (typeof arr[k] === "object") {
    newArr = arrCopy(arr[k]);
    };
    newArr[k] = arr[k];
    }
    return newArr;
    }

    var arr = ["djhgjb",890,["dfe",77,"0k0"],true];
    console.log(arrCopy(arr));
  • 写一个深拷贝的方法,拷贝对象以及内部嵌套的值可以是字符串、数字、布尔、数组、json对象中的任意项

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function deepCopy (obj) {
    var newObj = {};
    for (k in obj) {
    if(typeof obj[k] === "object"){
    newObj[k] = deepCopy(obj[k]);
    };
    newObj[k] = obj[k];
    };
    return newObj;
    }

    var obj = ["string",["arr",950,["arr","true",'0994']],
    {"name":"word","info":{"age":10,"sex":"男","favorite":"walk"}}
    ];
    console.log(deepCopy(obj));
文章目录
  1. 1. javascript数据类型中的基础类型有哪些?复杂类型有哪些?有什么特征?
  2. 2. 如下代码的输出? 为什么?
  • 代码
  • ,