一些 Javascript 题目
(2012-03-14 11:57:01)
标签:
笔试numbertostringdelete闭包arguments括号引用类型值函数组it |
分类: Javascript |
这些时间做了一些关于javascript的题目,里面有些似懂非懂没理解透的知识点,有些题目别出心裁,题目很细,整理出来,附上个人搜索理解出来的答案,希望对自己对大家都有帮助。
1、
var a = 1234['toString']['length'];alert(a);
这道题目我原本的理解是1234.toString().length,把数字类型的 1234 转成字符串类型的 "1234",然后再读取字符串的长度,所以觉得答案是4,但是不是,如果是这样写的话:
1234['toString']()['length'];
就会弹出 4 ,因为 1234['toString'] 这一步仅仅是获取了一个数字类型转字符串类型的toString函数,但并未运行。1234['toString']['length'] 这句的正确理解应该是这样的:
获取把数字类型的 1234 转成字符串类型的 "1234" 的toString函数的参数个数。
大家可以百度下toString的方法详细介绍,里面有一句是这样的:
function toString( [radix : Number] ) : String
所以这道题目的答案是 1 ;
2、
(function(x){delete x; console.log(x);return x;})(1);
这个我个人觉得是一个闭包以及删除元素的问题,(function(){})()这样的一种形式很常见,前面的小括号是将函数括起来作为一个表达式函数值,后面的小括号是对前面这个函数值的调用运行,把 1 传给 x ,而函数里面delete了x ,x这个变量被删除,所以console不出 x 来,觉得结果会是undefined,但是这是错误的。
delete操作符通常用来删除对象的属性,如:
var o = { x: 1 };
delete o.x; //true
o.x; // undefined
而不是一般的变量,或者函数,如:
var x = 1;
delete x; // false
x; // 1
而delete在无法删除的情况下会返回false。
所以这道题目的答案是 1 ;
3、
(function(){console.log(typeof arguments);return typeof arguments;})();
网上好像没有特别准确的定义,我查了下JScript的api文档,在索引下打Arguments,会得到比较详细的说明:
不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。函数的 arguments 对象并不是一个数组,访问单个参数的方式与访问数组元素的方式相同。索引 n 实际上是 arguments 对象的 0…n 属性的其中一个参数。
由上面可以知道arguments不是一个数组,只不过元素的访问方式与数组相同,它是一个使用于函数体中的对象,用来管理函数的实际参数。
所以这道题目的答案是 object ;
4、
var c = (1,5-2)*2;
console.log(c);
var a=1,b=2,c=3,d=4;
var e = (a,b,c,d);
console.log(d===e);
这个还是一个括号让我困惑,记得以前大学的时候有个这样的分解式:(a,b)*c=a*c+b*c,于是乎我又错了,这货压根不是公式,而是 表达式 ;
能够出现这种格式的在我印象里面只有函数的参数function(a,b,c),所以在查资料的时候老是百度javascript function、javascript 参数、匿名函数括号 等等,结果百出来的东西都不靠谱,又想到[a,b,c]数组的格式也差不多,结果依然不靠谱,最后想到以前java课的时候好像有这东西出现过,还好我大学上课不全都睡过的,有时候还会失眠...哇咔咔...然后就百了下 表达式 ,结果就有答案了,看到这篇文章:
《javascript小括号表达式》
里面有详细的介绍,不过我这里还是写下:
1)javascript的小括号“()”表达式可以帮助我们把javascript语句组合分块并且每对小括号都会返回一个值且在同一语句中具有优先执行权。
这个是最基本的用法,只要学过数学的都知道哈。
2)小括号内不能声明变量并且不会改变括号内所执行语句的域。
3)小括号表达式可以执行多条语句,每条语句用逗号结束,会返回最后一条语句执行结果的返回值。
所以上面的 var c = (1,5-2)*2; (1,5-2)返回的是5-2=3,再*2后,c的值应该是 6 。
注意上面写的是“返回”,所以下面的console会是 true ;
然后因为我之前有百出所谓的“不靠谱”的东西,里面有个比较好玩的点,这里也说下:
我们知道下面这句会弹出个“long”的对话框
(function(){alert("long");})()
但是如果这样呢:
function(){alert("long");}()
会弹出“function statement requires a name”,那么就给它一个name:
function long(){alert("long");}()
这次会弹出“syntax error”,语法错误,因为系统不知道function long(){alert("long");}其实是个函数,所以不会运行,甚至弹出了语法错误,而用小括号把函数括起来后,像上面所说的,是将函数括起来作为一个表达式函数值,所以系统便知道它是一个函数。
但其实不一定需要用()括起来才可以,我们只要用任意运算符,"~","+","-"等等,告诉浏览器这是一个函数,都可以实现,如
~function(){alert("long");}()
+function(){alert("long");}()
-function(){alert("long");}()
而
var long = function(){alert("long");}()
"=" 右边写函数,是告诉引擎右边的匿名函数是一个能执行的函数,所以直接()也能执行。
5、
var x=10;
var foo = {
x:20,
bar:function(){
var x =
30;
return
this.x;
}
}
var a = foo.bar();
var b = (foo.bar)();
var c = (foo.bar=foo.bar)();
var d = (foo.bar,foo.bar)();
console.log(a,b,c,d);
这里主要是分析this的指向,全局or对象。
a) 很明显是foo对象调用bar(),所以this指向foo,打印出的是foo.x 20,这个没异议。
然后下面我就凌乱了,小括号()是什么意思,因为上面那些题目已经让我凌乱了,这里理不出个头绪。
b) (foo.bar)(),这里参考:ECMA语言规范
c) (foo.bar=foo.bar) 这是一个表达式,得出的是返回的值 value,即foo.bar的函数对象,而不是引用 Reference,就像这样一个写法:
var x = 10; (function() { return this.x; })();
,括号里面是函数的值,this指向是window(可以通过上面的ECMA语言规范链接查看原理),所以打印出来的是 10;
d) (foo.bar,foo.bar)这个是一个小括号表达式,举个例子:
表达式会自左向右依次执行,然后把最后一个的“值”返回,所以有此可以知道,这里其实跟c)是一样的,得到的是值 value,而不是引用 Reference,所以打印出来的是 10。
具体你可以查看这篇文章《What is "this"》了解。
6、
var a=5,b=10;
var c = a+++b;
console.log(a,b,c);
看了下面那么精彩的题目之后,这道题就有点基础平淡了,只是对一个运算符的分析。
把c的表达式看成(a++)+b就可以得出正确答案:6,10,15,
而我2B pencil了,以为会有优先级存在,多此一举的把表达式看成a+(++b),错误得到5,11,16。
目前能回忆起我印象比较深的题目就这么多,昨天下午去书城逛了一圈,又买了两本JS的书:《Javascript 权威指南》(封面印了只不知道叫什么棕褐色的牛 不语说,这是一头gnu,牛羚、角马)、《html5 canvas基础教程》,本来还想买多本《测试驱动的Javascript》不过看了下,感觉里面内容有点深,感觉都不错,推荐给大家...
1、
var a = 1234['toString']['length'];
这道题目我原本的理解是1234.toString().length,把数字类型的 1234 转成字符串类型的 "1234",然后再读取字符串的长度,所以觉得答案是4,但是不是,如果是这样写的话:
1234['toString']()['length'];
就会弹出 4 ,因为 1234['toString'] 这一步仅仅是获取了一个数字类型转字符串类型的toString函数,但并未运行。1234['toString']['length'] 这句的正确理解应该是这样的:
获取把数字类型的 1234 转成字符串类型的 "1234" 的toString函数的参数个数。
大家可以百度下toString的方法详细介绍,里面有一句是这样的:
function toString( [radix : Number] ) : String
- radix 可选项。为将数字值转换为字符串指定一个基数。此值仅用于数字。
所以这道题目的答案是 1 ;
2、
(function(x){delete x; console.log(x);return x;})(1);
这个我个人觉得是一个闭包以及删除元素的问题,(function(){})()这样的一种形式很常见,前面的小括号是将函数括起来作为一个表达式函数值,后面的小括号是对前面这个函数值的调用运行,把 1 传给 x ,而函数里面delete了x ,x这个变量被删除,所以console不出 x 来,觉得结果会是undefined,但是这是错误的。
delete操作符通常用来删除对象的属性,如:
var o = { x: 1 };
delete o.x; //true
o.x; // undefined
而不是一般的变量,或者函数,如:
var x = 1;
delete x; // false
x; // 1
而delete在无法删除的情况下会返回false。
所以这道题目的答案是 1 ;
3、
(function(){console.log(typeof arguments);return typeof arguments;})();
网上好像没有特别准确的定义,我查了下JScript的api文档,在索引下打Arguments,会得到比较详细的说明:
不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。函数的 arguments 对象并不是一个数组,访问单个参数的方式与访问数组元素的方式相同。索引 n 实际上是 arguments 对象的 0…n 属性的其中一个参数。
由上面可以知道arguments不是一个数组,只不过元素的访问方式与数组相同,它是一个使用于函数体中的对象,用来管理函数的实际参数。
所以这道题目的答案是 object ;
4、
var c = (1,5-2)*2;
console.log(c);
var a=1,b=2,c=3,d=4;
var e = (a,b,c,d);
console.log(d===e);
这个还是一个括号让我困惑,记得以前大学的时候有个这样的分解式:(a,b)*c=a*c+b*c,于是乎我又错了,这货压根不是公式,而是 表达式 ;
能够出现这种格式的在我印象里面只有函数的参数function(a,b,c),所以在查资料的时候老是百度javascript function、javascript 参数、匿名函数括号 等等,结果百出来的东西都不靠谱,又想到[a,b,c]数组的格式也差不多,结果依然不靠谱,最后想到以前java课的时候好像有这东西出现过,还好我大学上课不全都睡过的,有时候还会失眠...哇咔咔...然后就百了下 表达式 ,结果就有答案了,看到这篇文章:
《javascript小括号表达式》
里面有详细的介绍,不过我这里还是写下:
1)javascript的小括号“()”表达式可以帮助我们把javascript语句组合分块并且每对小括号都会返回一个值且在同一语句中具有优先执行权。
这个是最基本的用法,只要学过数学的都知道哈。
2)小括号内不能声明变量并且不会改变括号内所执行语句的域。
3)小括号表达式可以执行多条语句,每条语句用逗号结束,会返回最后一条语句执行结果的返回值。
所以上面的 var c = (1,5-2)*2; (1,5-2)返回的是5-2=3,再*2后,c的值应该是 6 。
注意上面写的是“返回”,所以下面的console会是 true ;
然后因为我之前有百出所谓的“不靠谱”的东西,里面有个比较好玩的点,这里也说下:
我们知道下面这句会弹出个“long”的对话框
(function(){alert("long");})()
但是如果这样呢:
function(){alert("long");}()
会弹出“function statement requires a name”,那么就给它一个name:
function long(){alert("long");}()
这次会弹出“syntax error”,语法错误,因为系统不知道function long(){alert("long");}其实是个函数,所以不会运行,甚至弹出了语法错误,而用小括号把函数括起来后,像上面所说的,是将函数括起来作为一个表达式函数值,所以系统便知道它是一个函数。
但其实不一定需要用()括起来才可以,我们只要用任意运算符,"~","+","-"等等,告诉浏览器这是一个函数,都可以实现,如
~function(){alert("long");}()
+function(){alert("long");}()
-function(){alert("long");}()
而
"=" 右边写函数,是告诉引擎右边的匿名函数是一个能执行的函数,所以直接()也能执行。
5、
var x=10;
var foo = {
}
var a = foo.bar();
var b = (foo.bar)();
var c = (foo.bar=foo.bar)();
var d = (foo.bar,foo.bar)();
console.log(a,b,c,d);
这里主要是分析this的指向,全局or对象。
a) 很明显是foo对象调用bar(),所以this指向foo,打印出的是foo.x 20,这个没异议。
然后下面我就凌乱了,小括号()是什么意思,因为上面那些题目已经让我凌乱了,这里理不出个头绪。
b) (foo.bar)(),这里参考:ECMA语言规范
11.1.6 The Grouping Operator The production PrimaryExpression : ( Expression ) is evaluated as follows:这是对组操作符的描述,说明得到的结果是一个 Reference 引用类型,那么就跟foo.bar()其实是一样的,this指向foo,从而打印出 20 ;
1. Evaluate Expression. This may be of type Reference.
2. Return Result(1).
c) (foo.bar=foo.bar) 这是一个表达式,得出的是返回的值 value,即foo.bar的函数对象,而不是引用 Reference,就像这样一个写法:
var x = 10; (function() { return this.x; })();
,括号里面是函数的值,this指向是window(可以通过上面的ECMA语言规范链接查看原理),所以打印出来的是 10;
d) (foo.bar,foo.bar)这个是一个小括号表达式,举个例子:
var
a, b, c, result;
result = (
function
() { a = 2;
}(),
function
() { b = 3; }(),
function
() { c = 4; }(),
function
() {
return
a
* (b + c); }());
alert(result);
小括号表达式内依次创建匿名函数并执行,共创建了四个匿名函数且都运行了,最后一个匿名函数运行后会返回运算的值且小括号表达式也会把此值返回并赋给变量result。
表达式会自左向右依次执行,然后把最后一个的“值”返回,所以有此可以知道,这里其实跟c)是一样的,得到的是值 value,而不是引用 Reference,所以打印出来的是 10。
具体你可以查看这篇文章《What is "this"》了解。
6、
var a=5,b=10;
var c = a+++b;
console.log(a,b,c);
看了下面那么精彩的题目之后,这道题就有点基础平淡了,只是对一个运算符的分析。
把c的表达式看成(a++)+b就可以得出正确答案:6,10,15,
而我2B pencil了,以为会有优先级存在,多此一举的把表达式看成a+(++b),错误得到5,11,16。
目前能回忆起我印象比较深的题目就这么多,昨天下午去书城逛了一圈,又买了两本JS的书:《Javascript 权威指南》(封面印了只不知道叫什么棕褐色的牛 不语说,这是一头gnu,牛羚、角马)、《html5 canvas基础教程》,本来还想买多本《测试驱动的Javascript》不过看了下,感觉里面内容有点深,感觉都不错,推荐给大家...