问题
基础类型有哪些?复杂类型有哪些?有什么特征?
基本数据类型包括 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);