您真的了解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()方法返回对象的原型。

posted @ 2017-04-22 11:28  kiera  阅读(213)  评论(0编辑  收藏  举报