您真的了解javaScript?(2)
点击下面链接,来测测您的javaScript水平吧。
JavaScript Puzzlers!
11.
[]==[]
当两个值都是对象 (引用值) 时, 比较的是两个引用值在内存中是否是同一个对象。因为此 [] 非彼 [], 这是两个互不相关的空数组。
从这个题引申另外一个:
[] == ![] //true
==号引起隐式转换,js是这么干的:
!优先级最高,先看 ![],它的结果是false,所以这个推导式变成 []==false 。==号有布尔值,false就会转换数字 0,true转换成1,于是 []==0. 此时一边是对象,一边是数字,==又把对象转换成原始值。
先用valueOf()方法,[].valueOf() 还是 [] ;那就下一个办法,[].toString(), 返回 "", 空字符串是一个原始值。ok,现在要比较的就是 "" == 0 。(如果两个方法都得不到原始值,就会抛出一个TypeError)
隐式转换的工作还没结束,当==号两边,一边是字符串,一个是数字时候,==号又把字符串转换成数字。空字符串""被转换成 0. 最终我们计算的就是 0 == 0,因此结果是true。
而我们看三等号,就不会引发类型转换:
[] === ![] //false
妥妥的。
12.
var a = [0]; if ([0]) { console.log(a == true); } else { console.log("wut"); }
解题思路同上。
13. what a great fun...
1 + - + + + - + 1
相当于1+空格-空格+空格+空格+空格-空格+1;在js中空格是不参与计算
14.
var ary = Array(3); ary[0]=2 ary.map(function(elem) { return '1'; });
嗯,map()方法不对空数组进行调用。所以,结果是 ["1", undefined*2]
15.
function sidEffecting(ary) { ary[0] = ary[2]; } function bar(a,b,c) { c = 10 sidEffecting(arguments); return a + b + c; } bar(1,1,1)
这题其实挺简单。结果是21,但是怎么用大白话解释出来呢...
16.
var x = [].reverse; x();
实际上,我的chrome浏览器抛出一个TypeError。
如果这样写:
var x = [].reverse; x.call([1, 2]);
就可以返回[2, 1]
17.
Number.MIN_VALUE > 0
结果:true
MIN_VALUE 属性是 JavaScript 中可表示的最小的数(接近 0 ,但不是负数)。它的近似值为 5 x 10-324。
18.
[1 < 2 < 3, 3 < 2 < 1]
用计算机的眼光来计算这个题:
1<2 =>true;
true < 3 => true转换成1,于是 1 < 3, 所以结果是 true。
3 < 2 => false;
false < 1 => false转换成0,于是 0 < 1,所以结果也是true。
19.
3.toString() 3..toString() 3...toString()
原来3. 和 .3 都是js的合法数字。所以3.toString()实际就是(3.)toString(),自然会抛出一个TypeError。少一个点多一个点都是,抛出错误。
20.
var a = {}, b = Object.prototype; [a.prototype === b, Object.getPrototypeOf(a) === b]
只有 Function 拥有一个 prototype 的属性,其他对象并没有. 所以 a.prototype 为 undefined.
getPrototypeOf()方法返回对象的原型。