多读书,多运动,多到远处走走,再看看不一样的世界。
去定义一个方法,传入一个string类型的参数,然后将string的每个字符间加个空格返回
String.prototype.spacify = function(){
return this.split('').join(' ');
};
定义一个未定义的log方法,它可以代理console.log的方法
function log(){
console.log.apply(console, arguments);
};
每一个log消息添加一个"(app)"的前辍
function log(){
var args = Array.prototype.slice.call(arguments);
args.unshift('(app)');
console.log.apply(console, args);
};
上下文和this的理解
var User = {
count: 1,
getCount: function() {
return this.count;
}
};
console.log(User.getCount());
var func = User.getCount;
console.log(func());
var func = User.getCount.bind(User);
console.log(func());
==> 1
==> undefined
==> 1
老版本的浏览器兼容 bind
Function.prototype.bind = Function.prototype.bind || function(context){
var self = this;
return function(){
return self.apply(context, arguments);
};
}
弹出窗口(Overlay library)
.overlay {
position: fixed;
left: 0;
right: 0;
bottom: 0;
top: 0;
background: rgba(0,0,0,.8);
}
.overlay article {
position: absolute;
left: 50%;
top: 50%;
margin: -200px 0 0 -200px;
width: 400px;
height: 400px;
}
检查事件的触发对象和绑定对象是否一致,从而确定事件不是从子元素里面冒泡上来的。
$('.overlay').click(function(e){
if (e.target == e.currentTarget)
closeOverlay();
});
设计一个函数返回第n行的杨辉三角。
1
1 1
1 2 1
1 3 3 1
...
杨辉三角也叫Pascal’s Triangle
function triangle(r) {
var arr =[], n = 1;
for (var i = 1; n <= r; i+=n) {
arr[i] = arr[i - 1] = 1;
for (var j = 1; j < n - 1; j++) {
arr[i - j -1] = arr[i - j - n - 1] + arr[i - j - n]
}
n += 1;
}
return arr.splice(arr.length - r - 1, r);
}
triangle(5);
上面是收集的其他人的答案,一眼看上去乱七八糟并且也不符合我的习惯,遂自己写了一个↓↓↓
function triangle(r) {
var arr = new Array(r);
for(var i=0;i<r;i++){
var _arr=new Array(i+1);
_arr[0]=_arr[i]=1;
for(var j=1;j<i;j++){
_arr[j]= arr[i-1][j-1]+arr[i-1][j]
}
arr[i]=_arr;
}
return arr;
}
triangle(2);
设计一个函数,返回一串字符串中重复次最多的单词。
使用递归打印长度为n的费波那契数列。
Scope作用范围
考虑下面的代码:
(function() {
var a = b = 5;
})();
console.log(b);
==> 5
给字符串对象定义一个repeatify功能。当传入一个整数n时,它会返回重复n次字符串的结果。
String.prototype.repeatify = String.prototype.repeatify || function(times) {
var str = '';
for (var i = 0; i < times; i++) {
str += this;
}
return str;
};
console.log('hello'.repeatify(3));
==> hellohellohello
声明提升(Hoisting)
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();
==> undefined
==> 2
this在JavaScript中如何工作的
var fullname = 'John Doe';
var obj = {
fullname: 'Colin Ihrig',
prop: {
fullname: 'Aurelio De Rosa',
getFullname: function() {
return this.fullname;
}
}
};
console.log(obj.prop.getFullname());
var test = obj.prop.getFullname;
console.log(test());
==> Aurelio De Rosa
==> John Doe
↑↑↑使最后的console.log() 打印 Aurelio De Rosa。
console.log(test.call(obj.prop));
13 道题目
(function(){
return typeof arguments;
})();
==> "object"
var f = function g(){
return 23;
};
typeof g();
==> Error
(function(x){
delete x;
return x;
})(1);
==> 1
var y = 1, x = y = typeof x;
x;
==> "undefined"
(function f(f){
return typeof f();
})(function(){ return 1; });
==> "number"
var foo = {
bar: function() {
return this.baz;
},
baz: 1
};
(function(){
return typeof arguments[0]();
})(foo.bar);
==> "undefined"
var foo = {
bar: function(){
return this.baz;
},
baz: 1
}
typeof (f = foo.bar)();
==> "undefined"
var f = (
function f(){
return "1";
},
function g(){
return 2;
}
)();
typeof f;
==> "number"
var x = 1;
if (function f(){}) {
x += typeof f;
}
x;
==> "1number"
var x = [typeof x, typeof y][1];
typeof typeof x;
==> "string"
(function(foo){
return typeof foo.bar;
})({ foo: { bar: 1 } });
==> "undefined"
(function f(){
function f(){ return 1; }
return f();
function f(){ return 2; }
})();
==> 2
function f(){ return f; }
new f() instanceof f;
==> false
with (function(x, undefined){}) length;
==> 2