第23道
[1 < 2 < 3, 3 < 2 < 1]
解析:如果加上括号就清楚了许多。
(1 < 2) < 3 => (true) < 3 => 1 < 3 => true
(3 < 2) < 1 => (false) < 1 => 0 < 3 => true
所以结果为 [true, true]
第24题
2 == [[[2]]] //是真还是假?
解析:让我们来看看类型转换。
引用类型转换为基本类型(所有的引用类型转换为布尔值都是true)
引用类型转换为字符串
1.优先调用toString方法(如果有),看其返回结果是否是原始类型,如果是,转化为字符串,返回。 2.否则,调用valueOf方法(如果有),看其返回结果是否是原始类型,如果是,转化为字符串,返回。 3.其他报错。
引用类型转化为数字
1.优先调用valueOf方法(如果有),看其返回结果是否是基本类型,如果是,转化为数字,返回。 2.否则,调用toString方法(如果有),看其返回结果是否是基本类型,如果是,转化为数字,返回。 3.其他报错。
valueOf()
得到的都是对象本身,toString()
方法转为字符串就不用说了.
以下来自犀牛书:
1,null和undefined,相等。
2,数字和字符串,转化为数字再比较。
3,如果有true或false,转换为1或0,再比较。
4,如果有引用类型,优先调用valueOf。
5,其余都不相等。
回到本题,调用valueOf()返回的是本身不是基本类型,然后调用toString()得到"2",然后变成了字符串和数字("2" == 2)进行比较。
所以结果为 true
第25题
3.toString();
3..toString();
3...toString();
解析:.
在JS里是方法的调用的一种写法,但是数字也是可以有小数点的。你用3.toString()会将其解析为一个带小数点的数字,不会调用。
以下可以成功转换
(3).toString();
3..toString();
'' + 3;
String(3);
所以结果为 error '3' error
第26题
(function () {
var x = y =1;
})();
console.log(y);
console.log(x);
解析:此时x是局部变量但是y是全局变量。在外部试图访问内部变量x时会出现错误。
所以结果为 1 error
第27题
var a = /123/,
b = /123/;
a == b;
a === b;
解析:ab都是正则,正则也是对象。
2个引用的是同一个对象、函数、数组,则它们相等,如果引用的不是同一个对象、函数、数组,则不相同,即使这2个对象、函数、数组可以转换成完全相等的原始值。
所以结果为 false false
第28题
var a = [1, 2, 3],
b = [1, 2, 3],
c = [1, 2, 4];
a == b
a === b
a > c
a < c
解析:同上题。比较大小时,就按照字典序比较。
所以结果为 false false false true
第29题
var a = {}, b = Object.prototype;
[a.prototype === b, Object.getPrototypeOf(a) === b]
解析:只有函数才会有prototype属性,所以a.prototype为udnefined。Object.getPrototypeOf(obj)
返回一个具体对象的原型(该对象的内部[[prototype]]值)
所以结果为 false true
第30题
function f() {}
var a = f.prototype,
b = Object.getPrototypeOf(f);
a === b;
解析:var f1 = new f()
此时f1是一个从f.prototype继承而来的对象(f1是一个实例对象),f.prototype是使用new创建的实例(f1)的原型。所以a是实例的原型,而b是f的原型。所以a不同于b。
参考:继承与原型链
var o = {a: 1}; //o这个对象继承了Object.prototype上面的所有属性
//原型链如下o > Object.prototype > null
var a = ['uo', 'waht']; //数组都继承Array.prototype
//原型链如下a > Array.prototype > Object.prototype > null
function f() {} //函数都继承Function.prototype
//原型链如下f > Function.prototype > Object.prototype > null
所以结果为 false
第31题
function foo() { }
var oldName = foo.name;
foo.name = "bar";
[oldName, foo.name] //输出什么?
解析:(╯‵□′)╯︵┻━┻。name属性返回所属函数的函数名称。Bloody Hell!
var object = {
firstMethod: function first() {},
secondMethod: function () {}
};
console.log(object.firstMethod.name); //first
console.log(object.secondMethod.name); //""
另外函数的name属性不能被更改,因为它是只读的。
所以结果为 ['foo', 'foo']
第32题
"1 2 3".replace(/\d/g, parseInt)
解析:和第一题还是很类似的。
str.replace(/\d/g, function ($0, $1, $2.. , index, string) { }) //$0匹配的子串 $1第一个括号匹配的字符串 。。。类推
由于没有分组,所以相当于
parseInt("1", 0); //1
parseInt("2", 2); //NaN
parseInt("3", 4); //3
所以结果为 [1, NaN, 3]
第33题
function f() {}
var parent = Object.getPrototypeOf(f);
f.name // ?
parent.name // ?
typeof eval(f.name) // ?
typeof eval(parent.name) // ?
解析:由30题和31题,可以得到答案。parent === Function.prototype
所以答案为 "f", "", "function", error
第34题
var lowerCaseOnly = /^[a-z]+$/;
[lowerCaseOnly.test(null), lowerCaseOnly.test()]
解析:test函数会将参数转换为字符串。"null"和"undefined"。
所以结果为 [true, true]
第35题
[,,,].join(", ")
解析:真恶心还允许最后一个元素后跟一个,
!长度为3的稀疏数组,但是并没有属性。
所以结果为 [, , ]
第36题
var a = {class: "Animal", name: 'Fido'};
a.class
解析:与浏览器有关。Chrome下结果为"Animal"
第37题
var a = new Date("epoch")
解析:Date()可以接受一个字符串,该字符串应该能被Date.parse()方法识别。
//正确字符串
Date.parse("Wed, 09 Aug 1995 00:00:00")
//如果格式错误 构造函数返回的仍是一个Date 的实例 Invalid Date.
所以结果为 Invalid Date
第38题
var a = Function.length,
b = new Function().length;
a === b; //?
解析:一个function的length属性就是参数的个数。另外Function.length定义为1
所以结果为 false
第39题
var a = Date(0);
var b = new Date(0);
var c = new Date();
[a === b, b === c, a === c]
解析:不传入参数获得当前时间。b的结果Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
,c获得当前时间是个对象,a是获得当前时间是个字符串。
所以结果为 [false, false, false]
第40题
var min = Math.min(), max = Math.max()
min < max //?
解析:Math.min()不传参数返回Infinity,Math.max()不传参数返回-Infinity
所以结果为 false
结束
终于结尾了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。