1. What’s the result of: //string
typeof typeof(null)
================Q1 Answer===============
typeof 是操作符,会返回一个字符串结果表示操作数的类型。typeof(null)返回 "object”,所以 typeof "object"的结果是string
2. Are the algorithms of the following checks completely equvalent? //Yes
typeof foo == 'undefined'
and
typeof foo === 'undefined'
==========Q2 Answer======================
无论使用==或者===,typeof都会返回字符串"boolean"
3. What’s the result of: // 1
100['toString']['length']
===========Q3 Answer=====================
我们知道java中有boxing和unboxing的概念,同样,js中也有这种概念。所以上面的100['toString']['length'] 等价于new Number(100)['toString']['length'] 。所以这里的意思是求Number示例的toString方法的参数个数。 我们还知道对于数字类型的toString方法是可以传入一个数字,返回N进制的数字。例如100.toString(2)的意思是返回100的2进制数据格式。 所以toString方法是有一个形式参数的。所以调用toString函数的length属性为1。
4. What’s the result of: //8
var a = (1,5 - 1) * 2
=================Q4 Answer==============
括号内是分组运算,返回最后一组的结果,就是5-1,然后乘以2,等于8
5. What’s the result of: //20,20,10,10
var x = 10;
var foo = {
x: 20,
bar: function () { var x = 30; return this.x; }
};
console.log(
foo.bar(),
(foo.bar)(),
(foo.bar = foo.bar)(),
(foo.bar, foo.bar)()
);
=====================Q5 Answer==============
这个解释起来真费劲,自己看规范去吧。。。。。
6. What’s the result of: //undefined, undefined
function f(x, y) {
x = 10;
console.log( arguments[0], arguments[1] );
}
f();
=============Q6 Answer============
在不传入参数时,arguments不会和形参x,y关联。所以无论怎么修改x,arguments的length一直是0,所以arguments[0], arguments[1]都是undefined
7. What’s the result of: //20
var b = 10, c = ( 20, function (x) { return x + 100}, function () { return arguments[0]} );
a = b + c
({x: 10}).x
=============Q7 Answer============
注意这里不要被换行迷惑,这里实际是在求 a = b + c ({x: 10}).x 表达式里的a值。c是函数function () { return arguments[0]} 所以,这个表达式等价于:
a = 10 +{x:10}.x 。 所以结果是20
8. What’s the result of: //undefined
1..z
=============Q8 Answer============
首先参考Q3的boxing和unboxing概念,这里等价于new Number(1.).z 。
Number的原型上没有z属性,所以是undefined。这里为什么要用两个点,是因为一个点会被解析成小数点。不会解析成取属性操作符
9. What’s the result of: //undefined, 30, 20
({ x: 10, foo: function () {
function bar() {
console.log(x);
console.log(y);
console.log(this.x);
}
with (this) {
var x = 20;
var y = 30;
bar.call(this);
}
}
}).foo();
10. What’s the result of: //ReferenceError or possibly no error
foreach (k in {a: 10, b: 20}) { // ... }
=============Q10 Answer============
这里如果foreach是个函数,并且k被定义,就不会有错。否则会报
ReferenceError: k is not defined