前端路上的各种问题-javascript—4

来源:互联网 发布:阿里云备案幕布ps 编辑:程序博客网 时间:2024/06/05 19:21

1.delete删除属性问题:

      (1)对于window.name虽然delete输出true,但是window.name的值依然存在!因为name属性是window对象本身就具有的属性。window.sex确实可以删除掉的!

     window.name="qin";                
     alert(delete window.name);//返回true
     alert(window.name);//返回qin

   var name="xx";
  alert(delete name);//返回tue,和上面的解释一样,name是window本身的属性
  alert(name);//返回xx

   var sex="xx";
  alert(delete sex);//返回false
  alert(sex);//返回xx

    bar="xx";//差别在于:这里没有var声明
   alert(delete bar);//返回true
   alert( typeof bar);//undefined

   window.sex="xx";
  alert(delete sex);//返回true
  alert(typeof sex);//返回undefined

window.sex=function(){}
  alert(delete sex);//返回true
  alert(typeof sex);//返回undefined

//不是通过“.”这种属性赋值的方式,而是直接定义的方式是不能删除的!

function F(){}
alert(delete F);
alert(F);

也就是说:全局对象上面的属性和方法可以被彻底删除(直接定义函数形式除外),但全局对象本身具有的属性,如name会有残余,即delete返回true,但是该值依然存在!

     (2)可以删除函数的length

      function f(name,sex){} 
           alert(f.length);//输出2
          alert(delete f.length); // true表示可以删除
          alert(f.length); // "0"删除后的length为0 

  (3)arguments不能删除,实参不能删除,全局属性和函数不能删除

             function(){alert(delete arguments); }//返回false

           function f(name){alert(delete name)} f();//返回false

            function f(){} alert(delete f);alert(f);//返回false,function(){}表示全局函数不能删除

             var f="name"; delete f;//表示不能删除全局属性

 (4)如果一开始的就不能被删除,那么即使重新赋值以后的值如果可以被删除,该属性也不能被删除

    function F(){} //不能被删除

     F="123";//window.F是全局属性,可以被删除

     alert(delete F);//依然不能被删除

    alert(F);//返回123,也就是重新赋值后,重新赋的值虽然应该可以删除,但是由于被赋值之前不能删除,所以还是不能删除!这也说明了,同名重新赋值会发送覆盖!


(5)Eval函数中的变量可以被删除。

            eval("var x = 1;"); 
            alert(delete x);//返回true
            alert(typeof x);//undefined

      eval("function test(){ var x=1; alert(delete x);/*返回false */;return 1;}"); 
    alert(test()); // 1 
    alert(delete test); 
   alert(typeof test); // undefined

  (6)prototype中声明的属性也不能delete

function F(name){this.name=name;};
F.prototype.x="liubei";
//构建对象
var f=new F("zhangfei");
//对象的原型属性,虽然输出为true,但是没有真正删除!
alert(delete f.x);
//多次delete,也不会删除原型里面的属性
delete f.x;
delete f.x;
//输出“liubei”
alert(f.x); 

(6)数组中的元素可以被delete,但是会留下空洞,因为只是删除值,没有把键删除,因此只是用undefined替换掉。如果要彻底删除数组元素用splice方法

       splice(1,2)//下标1开始删除两个

      splice(1,0,“red”,"green")//下标1开始插入两个数

    splice(1,1,"red","green");//删除位置1,然后再插入两个

2.用escape方法判断单字节和双字节

 for(var i=0;i<l;i++)

{

   var c=this.charAt(i);

   if(escape(c).length>4)//为什么双字节的escape函数输出的长度大于4呢?“年”被编码成为“%u5E74

        {

b+=2;

      }else if(c!="\r")

        {

           b++;

      }

}
















0 0
原创粉丝点击