Ruby's Louvre

每天学习一点点算法

导航

一些javascript题目

群里讨论过的题目,分享一下。

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(parseInt(0.0000001)) alert((0.0000001)) alert(parseInt(0.000001))//Ecma toString 当超过1e-6 就会科学计数法 否则就会 原本显示 alert(parseInt('0.0000001'))//parseInt(变量) 这个变量是number型 就有这个陷阱了 alert((0.000001)) alert(null>-0.5)//转换数字 alert(11<'12')

alert(1 == '1.')
后面调用了Number("1.") ==> parseInt("1.")

posted on 2010-05-15 16:35  司徒正美  阅读(3080)  评论(10编辑  收藏  举报