群里讨论过的题目,分享一下。
function test(){ var m=n=1; alert(m); } alert(n);
//因为test函数没有执行,程度控制流不能进入进行解析,里面的东西对外面不可见,因此报错
function test(){ var m=n=1; alert(m); } test(); alert(n);
//当test执行后,统统变成全局变量
function test() { return 1 +2 } alert(test())
类似的还有,由群里的abcd提供
function test() { return 1 2 } alert(test())
类似的还有,由群里的abcd提供
function test() { return 2 } alert(test())
类似的还有,由群里的abcd提供
function test() { 1 +2- 3 } alert(test())
//考察JavaScript的EOS(分号)问题,注意操作符是否存在
上面这题也可以引出这么一题,由群里的abcd提供
function test() { try { return 1; } finally { return 2; } } alert(test())
//一个函数执行后必定返回(return)一个结果,如果原函数体没有return语句必返回undefined。 //如果里面存在异常处理,finally块中的return 的优先级高于try 块中的return
alert(Number())
类似的还有,由群里的abcd提供
alert(+" 3 ")
//参见ECMA3-5th的第9.3节与15.7.1节。如果Number([value])的value不存在,则返回0 //一个字符串被执行了“+”,“-”等操作,相当于调用了Number(str),这时亦即相当于调用了toNumber函数 //这是一个内建函数,只存在于JS引擎中,对于这个str它会执行trim操作,再执行数字转换, //如果能转换基本上转换为十进制(如0x12转为18),如果数字过大会使用指数, //如果trim后得到的为Infinity,则直接转换它,如: var a = +' Infinity '; alert(typeof a) //number //如果不能转换则返回NaN
var add = function(el){ alert(el === el+1) } //求el的值,让el === el+1成立!
//考察javascript的数值范围 add(Infinity) add(Number.MAX_VALUE) add(Number.POSITIVE_INFINITY) add(Number.NEGATIVE_INFINITY)
alert([1,2,3,4,5][0..toString.length])
//0..相当于0.0.,这里不能直接写0.toString, //因为如果一个点会提示错误 ,JS引擎无法判断是小数点还是"."操作符 //http://www.cnblogs.com/rubylouvre/archive/2009/11/23/1608601.html //接着就是取数字的toString方法的length属性,注意这里并没有执行toString //所有函数都一个length属性,为其形参的个数,如 var fn = function(a,b){}; fn.length; // 2 //toString函数的形参为1,自己翻书吧,因此相当于[1,2,3,4,5][1]
alert('foo'.split('') + [])
//注意空函数的toString
类似的还有,
alert({a: 1, b: 2}[["b"]])
类似的还有,
alert(Array(2).join())
alert(i); var i = 1; function i(){} alert(i);
//优先级问题
try { alert(a); } catch (e) { alert(e); } var a = 10; alert(a);
try { alert(b); } catch (e) { alert(e); } b = 20; alert(b);
//预编译问题
var x = 10; alert(delete x); try { alert(x); } catch (e) { alert(e); }
eval('var y = 20'); alert(delete y); try { alert(y); } catch (e) { alert(e); }
//delete操作符,只能正确删除 没有用var 声明的变量 var x = 10; alert(delete x); // false, as has {DontDelete} alert(x); // 10 eval("var y = 20"); alert(delete y); // true alert(y); // ReferenceError
var a = Function.prototype.call.apply(function (c) {return c}, [1,4,3]); alert(a)
//相当于 var b = (function(a) { return a; }).call(0, 4, 3);
压轴,由群里的abcd提供
Number.prototype.a = Number.prototype.b = Number.prototype.c = Number.prototype; function f1() { return 1..a.b.c } alert(f1())
//先看Number.prototype.a = Number.prototype; //Number.prototype为Number的一个实例 //相当于 new Number 得0 //相当于1..a为0 //接着是0..b //而b也是Number.prototype.b = Number.prototype; //因此0..b为0 //最后的0..c为一样,为0
//delete操作符,只能正确删除 没有用var 声明的变量 var x = 10; alert(delete x); // false, as has {DontDelete} alert(x); // 10 eval("var y = 20"); alert(delete y); // true alert(y); // ReferenceError
alert(1 == '1.')
后面调用了Number("1.") ==> parseInt("1.")