js题集1
1.两个function区别
function foo1()
{
return { // 返回对象{}留有一个大括号跟return在同一行
bar: "hello"
};
}
function foo2()
{
return
{ // {}没跟return同一行,所以返回的是undefined
bar: "hello"
};
}
浏览器会自动加分号
2:为什么结果是undefined
if (!("a" in window)) {
var a = 1;
}
alert(a);
所有的全局变量都是window的属性,语句var a = 1;等价于window.a = 1
所有的变量声明都在范围作用域的顶部
变量声明被提前了,但变量赋值没有,当变量声明和赋值在一起时,JavaScript引擎会自动将变量预编译,但变量值不会,因为赋值步骤提前可能影响代码执行出不可预期的结果。
以上代码等价于:
var a; // 声明a
if (!("a" in window)) { // 判断a是否存在,如不存在就赋值为1,因为a永远在window里存在,
a = 1; // 所以这个赋值永远不会执行
}
alert(a); // 所以结果为undefined
3:
var a = 1,
b = function a(x) {
x && a(--x);
};
alert(a);
结果为1,因为已经先有了变量a,那么重复声明并不会使他被重新初始化,也不会使它的值丢失。
1)变量声明在进入执行上下文就完成了;
2)函数声明也是提前的,所有的函数声明都在执行代码之前都已经完成了声明,和变量声明一样。
函数表达式没有提前,相当于变量赋值。
3)函数声明会覆盖变量声明,但不会覆盖变量赋值。
function value(){
return 1;
}
var value;
console.log(typeof value); // function
尽管变量声明在下面定义,但变量value依然是function
这种情况下,函数声明的优先级高于变量声明的优先级
function value(){
return 1;
}
var value = 1;
console.log(typeof value); // number
该value赋值后,变量赋值初始化就覆盖了函数声明
重新回到题目,这个函数其实是一个有名函数表达式,函数表达式不像函数声明一样可以覆盖变量声明,但你可以注意到,变量b是包含了该函数表达式,而该函数表达式的名字是a;不同的对a这个名词处理有点不一样,在IE里,会将a认为函数声明,所以它被变量初始化覆盖了,就是说如果调用a(–x)的话就会出错,而其它浏览器在允许在函数内部调用a(–x),因为这时候a在函数外面依然是数字。基本上,IE里调用b(2)的时候会出错,但其它浏览器则返回undefined。 理解上述内容之后,该题目换成一个更准确和更容易理解的代码应该像这样: var a = 1, b = function(x) { x && b(--x); }; alert(a); 这样的话,就很清晰地知道为什么alert的总是1了。
4:
function a(x) {
return x * 2;
}
var a;
alert(a);
遇到同名的函数声明,不会重新定义
5:
function b(x, y, a) {
arguments[2] = 10;
alert(a); // 10
}
b(1, 2, 3);
活动对象在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。arguments属性的值是Arguments对象。
6:
function a() {
alert(this); // object Window
}
- call(null);
call调用一个对象的一个方法,以另一个对象替换当前对象。
格式call(thisObj, arg1, arg2…argN);
根据ECMAScript262规范规定:如果call第一个参数传入的对象调用者是null或undefined,call方法将把全局对象(window)作为this的值。所以不管什么时候传入null,其this都是全局对象window,题目可以理解为如下代码:
function a() {
alert(this);
}
a.call(window);
7:
找出数字数组中最大的元素(使用Match.max函数)
var a = [111, 2, 6, 4, 22, 5, 99, 3];
console.log(Math.max.apply(null, a));
8:
转化一个数字数组为function数组(每个function都弹出相应的数字)
var a = [111, 2, 6, 4, 22, 5, 99, 3];
a = a.map(function (value) {
return function () {
return value;
}
})
console.log(a[2]());
9:
给object数组进行排序(排序条件是每个元素对象的属性个数)
var b =[
{a: 1, b: 2},
{a: 1, b: 2, c: 3, d: 5},
{a: 1},
{a: 1, b: 2, c: 3, d: 4}
];
// 拓展count方法
Object.prototype.count = (
Object.prototype.hasOwnProperty('_count_') ?
function () {
return this._count_;
}
:
function () {
var p, count = 0;
for (p in this) {
if (this.hasOwnProperty(p)) {
count++;
}
}
return count;
}
);
function compare(obj1, obj2) {
return obj1.count() - obj2.count();
}
console.log(b.sort(compare));
10:
利用JavaScript打印出Fibonacci数(不使用全局变量)
function fibo(n) {
var self = arguments.callee;
return n < 2 ? n : (self(n - 1) + self(n - 2));
}
console.log(fibo(6));
11:
实现如下语法的功能:var a = (5).plus(3).minus(6); //2
Number.prototype.plus = function(a) {
return this + a;
}
Number.prototype.minus = function(a) {
return this - a;
}
console.log((5).plus(3).minus(6)); // 2
12:
实现如下语法的功能:var a = add(2)(3)(4); //9
function add(x) {
var result = x;
var fn = function(x) {
result += x;
return fn;
};
fn.toString = fn.valueOf = function() {return result};
return fn;
}
console.log(add(2)(3)(4));