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++;
}
}