另一个javascript小测验

测试题来自《Another JavaScript quiz》Posted in 'JavaScript' by James on April 27th, 2010

共25道题,测试内容包括运算符,表达式,语句,javascript语言特性,JSON语法,数组,正则等。

大家可以测一测自己在这方面知识掌握的程度。

在题后有我参考原博主文章和评论的题目解析,大家竞相拍砖,转载请注明。

The quiz:

1:

   1:  1 && 3 

2:

   1:  1 && "foo" || 0 

3:

   1:  1 || "foo" && 0 

4:

   1:  (1,2,3) 

5:

   1:  x = {shift:[].shift};
   2:  x.shift();
   3:  x.length; 

6:

   1:  {foo:1}[0] 

7:

1: [true, false][+true, +false]

8:

   1:  ++'52'.split('')[0] 

9:

   1:  a: b: c: d: e: f: g: 1, 2, 3, 4, 5; 

10:

1: {a: 1, b: 2}[["b"]]

11:

   1:  "b" + 45 

12:

   1:  {a:{b:2}} 

13:

   1:  (function(){}()) 

14:

1: [1,2,3,4,5][0..toString.length]

15:

1: ({} + 'b' > {} + 'a')

16:

   1:  Number.prototype.x = function(){ return this === 123; };
   2:  (123).x(); 

17:

   1:  Array(2).join() 

18:

   1:  vars: var vars = vars;

19:

   1:  { foo = 123 } 

20:

1: x = 1; (function(){return x; var x = 2;}())

21:

1: delete [].length;

22:

   1:  RegExp.prototype.toString = function() {return this.source};
   2:  /3/-/2/; 

23:

   1:  {break;4;} 

24:

1: 'foo' == new function(){ return String('foo'); };

25:

1: 'foo'.split('') + []

解析:

   1:  #1. //3 : 1为true,进而&&运算继续执行右边的表达式,结果为3
   2:  #2. //"foo" : 逻辑运算符,和上面的一样,当运算至"foo"时,表达式已经成功,不再执行||右边的表达式
   3:  #3. //1 : 1转换为bool为true,直接返回,不再往下执行
   4:  #4. //3 : 总返回最后一个值
   5:  #5. //0 : 当x执行过shift()方法后,x就会拥有length属性,并且返回的值就是0
   6:  #6. //[0] : 两个表达式,返回最后一个表达式的结果
   7:  #7. //true : 对bool+运算,结果是1或者0于是[true,false][1,0],而这种式子总是取最后一个,[true,false][0]
   8:  #8. //6 : .运算符优先级大于++运算符,'52'.split('')->['5','2'];取[0]得5;++得6
   9:  #9. //5 : 忽略掉前面所有的:x 得到:a:1,2,3,4,5 结果:5
  10:  #10. //SyntaxError。也许你会惊讶,这不是json格式的数据么,肿么会报错?我刚开始也很诧异,实际上这里不是javascript object
而是块级结构的语句执行,因为没有赋值语句。而作为普通语句执行的时候,{a:1;b:2}这样才对。或者a={a:1,b:2}
  11:  #11. //"b45" : 字符串与数字加法运算,总是返回字符串
  12:  #12. //2 : 只不过是两个语句块而已,跟第9题实际上是一种情况a:b:2,返回2
  13:  #13. //undefined : 匿名空函数自执行,由于没有显示return语句,自动返回undefined。
  14:  #14. //2 : 这个很有意思。分两部分来说,先说0..toString。如果在一个整数后面加".",那么javascript会认为这是浮点数的点,
而不是属性调用的点,如果在浮点数后面加点,那么javascript就会认为是属性调用,因为javascript无法区分此时用户到底是想进行。于是0..
就变成了调用属性,(这是偶的猜测)这时会把0.转换成对象,调用其toString函数。倘若直接0.toString是会出现语法错误的。你可以测试一
下1.1.toString;.0.toString等,都是可以调用的。再说0..toString.length的结果:1,为啥子是1捏,调用函数的length属性返回的结果是函
数的形参个数,javascript默认number.toString函数的形参个数为1。所以,[1,2,3,4,5][1]结果是2。

15: #15. //true : {}+"b" 对象和字符串相加 –> "[object Object]b",之后再进行逻辑比较,"b" > "a"。请不要直接测试{}+"b"这样你会

得到NaN,为什么呢,如果这样的话就是先执行{}这个语句块,再执行 +"b" 结果自然是NaN。

  16:  #16. //false 严格比较,左边对象,右边数字,类型不匹配。
  17:  #17. //'','' : 数组使用join后转换为字符串,但是是空数组,所以得到上述结果。
  18:  #18.  //undefined : 都是咸鱼,再怎么翻身,还是咸鱼。都是undefined,最后当然还是undefined。
  19:  #19. //123 : 块语句执行。跟对象神马的有半点儿毛线关系。
  20:  #20. //undefined : 据说javascript每引入一个块作用域都会扫描块作用域中的"var",并且将有var 生命的变量值设置为undefined,
而不管之前是否有过之类的声明,包括函数体外。

21: #21. //false : 删毛啊,这能删么?【delete only returns false when a property can not be deleted.】

参考:http://perfectionkills.com/understanding-delete/ 文中说的很清楚,内置函数的某些属性是不能被删除的,类似于arguments,

length,函数的局部变量(function(){ var a = 1; return delete a })()等。

  22:  #22. //1 : 先修改正则表达式的原型链上的toString函数,返回当前正则实例对象的文本形式。然后就是字符串相减了,这时候会自
动转换为number进行运算。
  23:  #23. // SyntaxError : break语句只能放在循环和switch分支语句中
  24:  #24. //false : 借用Damian Wielgosik非常经典的解释(new function(){ return String('foo'); }).toString() != 'foo'

25: #25. //"f,o,o" : 字符串转换成数组之后和数组相加再转换成字符串,可以找两个数组相加试试,借用Damian Wielgosik的解释

Just consider e.g. [1, 2] + [3, 4] and see how arrays are casted to string.

posted @ 2011-07-26 18:54  像阳光一样  阅读(671)  评论(0编辑  收藏  举报