1 求c的值
var a,b,c;
a = "2";
b = 2;
c = a + b;
‘22’
字符串跟数字相加,数字转成字符串
2 求c的值
var a = 0;
var b = 9;
var c = a || b;
9
0做布尔运算,为false,所以取后面的值
3 求t.obj.name
var f = function(){};
f.prototype.obj = {name:"jack",age:18};
var s = new f();
s.obj = {name:"tom"};
var t = new f();
jack
s.obj指向了一个新的对象
这个时候s.obj.name是’tom’,t.obj.name是’jack’
但是如果s.obj.name = ‘tom’,那么s.obj.name是’tom’,t.obj.name是’tom’
4.1 语法题
要求:
建立长度为100的数组arr,并且在arr中push函数元素,使得
arr0调用的时候返回值0;
arr1调用的时候返回值1;
…
arr 99调用的时候返回值99;
提示:请看清arr里的元素显然是函数类型的
var arr = [];
for(var i =0;i<100;i++){
arr[i] = (function(i){
return function(){
return i;
};
})(i);
}
4.2 求多层数组的和
var arr=[1,2,3,[4,5],[6],[[0,1],[1,1]]];
提示:答案是24=1+2+3+4+5+6+0+1+1+1
递归
var arr=[1,2,3,[4,5],[6],[[0,1],[1,1]]];
var sum = function(arr){
return arr.reduce(function(memo,n,i){
return memo+(n.length!=undefined?sum(n):n);
},0);
};
var rst = sum(arr);
迭代它当然也是可以的
4.3 生成一个0-9999的随机数,要求补位(如果随机数是89,则要补成0089)
举例:
1234 ->1234
0 ->0000
123 ->0123
考语法糖
var fn = function(n){
return (~~(Math.random()*Math.pow(10,n+1))+Math.pow(10,n+1)+'').slice(-n);
};
fn = fn.bind(null,4);
fn();
4.4 兔子数列
1,1,2,3,5,8,13…
第一个数是1
第二个数是1
从第三个数开始,是前两个数字之和
请手写函数fn(index),要求函数返回第index个数的值
可以递归,可以迭代
如果是递归方式,若能写出memory方式,可以加分
var testnum = 30;
var fab = function(n) {
if (n == 0 || n == 1) {
return 1;
} else {
return fab(n - 1) + fab(n - 2);
}
};
console.time("fab");
console.log(fab(testnum));
console.timeEnd("fab");
var fabpro = function(n) {
var map = {
0: 1,
1: 1
};
var _fn = function(n) {
if (map[n] != undefined) {
return map[n];
} else {
map[n] = _fn(n - 1) + _fn(n - 2);
return map[n];
}
}
return _fn(n);
};
console.time("fabpro");
console.log(fabpro(testnum));
console.timeEnd("fabpro");
后一个版本是递归的加速版本,可以从运行时间上看出
4.5 数组排序
数组格式如下:
var arr = [
{name:"jack",sex:"man",age:18},
{name:"lili",sex:"woman",age:21},
{name:"tom",sex:"man",age:13},
{name:"lucy",sex:"woman",age:12}
];
要求:
1 使用js数组自带的sort方法进行排序
2 排序规则:
要求man在前,woman在后
如果性别一致,则年龄小的靠前
排序之后,arr中的结果应该如下:
var arr = [
{name:"tom",sex:"man",age:13},
{name:"jack",sex:"man",age:18},
{name:"lucy",sex:"woman",age:12},
{name:"lili",sex:"woman",age:21}
];
考sort方法
arr.sort(function(a,b){
return b.sex == a.sex ? a.age - b.age : (b.sex =='man' && a.sex == 'woman' ? 1 : -1);
});
另外一个简单方法是给sex一个数字权重
arr.sort(function(a,b){
var weight = function(person){
return (person.sex == 'man' ? 10000 : 0) + (-person.age);
}
return weight(b)-weight(a);
});
4.6 附加题:求最大和的子数组,返回起止下标
例如:
[1, 15, -19, 5, 3, 5, -7, 3, 5, -1]最大和子串是[1,15]
[1, 3, -9, 5, 3, 5, -9, 3, 5, -1]最大和子数组是[5,3,5]
var cal = function(arr){
var curr = 0;
var max = -Number.MAX_VALUE;
var sum =0 ;
var negative =0 ;
var ls =s =le =e =0;
while(curr<arr.length){
var currValue = arr[curr];
sum+=currValue;
e = curr;
if(sum>max){
max = sum;
ls=s;
le=e;
}
if(sum<0){
sum =0;
s=e=curr+1;
}
curr++;
}
return {
start:ls,
end:le
};
}