escape()、encodeURI()、encodeURIComponent()
3,能对unicode符号编码,而1,只能对ascii编码

拿asp.net来说, 你最后通过属性查询得到的会是空格, 加号和空格的关系 ,很多网站包括腾讯某些网站,也有这个问题。内容里有个加号都变成了空格。 在比较早的get的实现中, 加号就是用来表示空格的 ,空格都替换成加号 ,而加号本身是要转义的 ,post里面怎么样我还没注意过, 不过反正get这方面是沿袭了下来,因为我一直是用encodeURIComponent的, 所以没注意过escape有这个问题.. ,用encodeURIComponent,提交后,后台需要解码是吗? 平台自己就解 ,用encodeURIComponent和直接用表单提交没啥区别 .

Unicode标准定义了17个字符平面,每个平面包含了大约64K个代码位,这样总共大约是1M多个代码位,也就是说在Unicode中,总共可以表示1M多个不同的字符,但是大部分系统的内部实现是双字节的UTF-16,UTF-16最多能使用65536个代码位, 显然不足以完全表示Unicode中定义的那么多字符,所以Unicode中定义了一个代码位区间, 专门用来在UTF-16中组合表示,UTF-16通常无法表示的代码位这个区间是从U+D800到U+D8FF,总共2048个代码位,其中从U+D800到U+DBFF是『高代理项』,从U+DC00到U+DFFF是『低代理项』,一个高代理项和一个低代理项连续出现的时候,表示了一个在扩展平面上的字符,比方说\uD800\uDC01表示的是第一个扩展平面上的偏移为1的字符, 也就相当于U+10001两个代理项区间分别包含1024个代理项, 这样总共就是1M个组合, 正好可以用于表示扩展字符平面上的东西,但是当『高代理项』和『低代理项』没有按照预期设计成对出现的时候,比方说只有单独的一个代理项或者连续的两个『高代理项』、连续的两个『低代理项』又或者是两个代理项顺序颠倒了这个时候,它们就不能表示出任何含义,这表示数据被损坏了,encodeURIComponent的行为也遵从这个,因为js的内部实现中使用的是UTF-16,而大部分情况下encodeURIComponent会以UTF-8为基础进行转义,所以它要先把UTF-16转成UTF-8,而如果你的js字符串中包含了组合正确的代理对,也就是从\uD800到\uDFFF之间的『字符』,那么在这个编码转换的过程中就会出问题,因为你提供的数据不正确,实际上通常我们很少会用到代理对,也很少用到扩展平面上的字符,所以这个问题一般是忽略掉的.

如果你真的需要用到扩展平面上的字符,只要你的数据是正确的, encodeURIComponent就能正常处理, 

 var text = '';  
for (var i = 0; i < 0xD800; i++)    
text += String.fromCharCode(i); 
 for (var i = 0xE000; i < 0x10000; i++)  
 text += String.fromCharCode(i);
把中间从D800到DFFF的部分跳过去就ok了,实际应用场合完全不用管,

escape对128到255之间的代码位会完全忽略...  当成『不可识别字符』 ,我搞不懂是为什么, 总之用encodeURIComponent就对了, 其它的别想太多 ,用escape的话除了加号以外, 万一用户输入了欧洲字符也一样出问题,都不用欧洲字符... NBSP都搞不定。


用escape的话除了加号以外, 万一用户输入了欧洲字符也一样出问题
都不用欧洲字符... NBSP都搞不定
āáǎàōóǒò这些就出问题了。 



用闭包,然后设置特权方法。js只读常量.
 setKey : function( v , key ){      
 if ( key === this.key){                
this.value =v     
  }} 

js类型的默认转换:

" "==0 //true   这个咋解释啊?
+" "" "==0 //true  因为通过隐十类型装换后两个都是false,
1. If Type(x) is different from Type(y), go to step 14.
14. If Type(x) is String and Type(y) is Number, 
return the result of the comparison ToNumber(x) == y. 
number是最终的转换,但是" "为什么不转换成NAN呢?
ToNumber applied to strings applies the following grammar to the input string.
If the grammar cannot interpret the string as an expansion of StringNumericLiteral, then the result of ToNumber is NaN.
它会进行trimLeft,
?  The MV of StringNumericLiteral ::: [empty] is 0. 
?  The MV of StringNumericLiteral ::: StrWhiteSpace is 0.
?  The MV of StringNumericLiteral ::: StrWhiteSpaceopt, 
StrNumericLiteral StrWhiteSpaceopt, is the MV of StrNumericLiteral, no matter whether white space is present or not.
单独的空格等于0,任何前置或者后置的空格都不影响数值.

 

=js   dom==垃圾回收=============

所谓高级语言会自动回收是因为这些『高级语言』有能力管理在其上实现的所有对象
但是你调用个外部组件试试,照样没法回收,js本身是高级语言, 但问题是在IE上js的对象和DOM对象是由两套独立的系统管理的,有循环引用的时候, js尝试回收, 会发现DOM那边在调用, 所以不敢回收,DOM尝试回收, 会发现js那边在调用, 也不敢,并不是js有问题, 是IE的技术结构决定js不可能自动回收这种循环引用,其它浏览器就没这问题,别扯到js上,
高级浏览器DOM与js引擎标记清除清除算法,而IE DOM是计数器算法。
而ie这么设计的时候还没什么人会写复杂的js程序, 所以没能预知未来发展也是很正常的,
IE的DOM也不是纯粹的计数器法,应该说IE的问题是JS和DOM两边的标记系统是独立的, 都不了解对方的内部情况,所以JS的回收系统不能标记DOM对象, DOM的回收系统不能标记JS对象,IE当初这么设计的时候是因为发现JS有作为脱离浏览器使用的语言的潜力, 所以分开设计,但是当时完全没有想到以后会带来这样的麻烦,
IE678的VBScript和JScript通过COM和DOM交互的,分离的很清楚。
所以一般大家说到『JavaScript』的时候其潜在含义是包含DOM的, 不包含DOM的纯粹语言严格意义上应该叫『ECMAScript』... 
不过对于给网页编写js的人来说这个不了解也没什么关系
object array2=original.Eval("[253,void 0, null]");
dynamic dArray2=array2;
dynamic wArray2=array2.ToDynamicScriptObject();
Console.WriteLine(dArray2.length);
Console.WriteLine(wArray2[0]);
Console.WriteLine(wArray2.length);

 

4,对象引用指向 alert({}==={});//指向的是不通的对象,所以false;
5, var o = {

        x: 8,

        valueOf: function(){

            return this.x + 2;

        },

        toString: function(){

            return this.x.toString();

        }

    },result = o < "9";//与字符串比较o先进行toString,字符串比较大小从首字符开始一一对应比较大小、先后顺序。

alert(0);//默认执行o的toString方法

6,操作符属性.与浮点数.在js中无法区分

 100['toString']['length'];
length是参数值个数的那个length,toString拥有一个参数,用于指定其进制,如:100['toString'](2),
函数的length就是指明确的写在小括号里面的参数个数,function.length是定义函数时括号里面的参数的个数
100..toString.length; 
js没整型和浮点型的区别,编译器无法区分 1.xx 是数字还是对象的属性访问,所以用 1.toString 基本上应该会被报个语法错误,他不知道你是一个语句还是一个数字量, 默认你这样是一个数字表示, 那么没有数字可以是这样的形态,多加一个点,1. === 1.0 的意思,1..toString 实际上是 1.0.toString,(1).toString 这样, 他就知道括号里面是一个值对象了.
alert(1.2.3);这样不能,是 (1.2).3 还是 1.(2.3) 还是其他什么,前面一种是无法区分, 后一种是他不是一个函数,基本上来说就是编译器没具体设定好规则...然后解析失败
 
7,判断一个对象是否是 NaN :NaN不会等于自己 
var is_nan = function( a ) { return a !== a; };alert('a'*1);
 tar + '' === 'NaN'        !tar && tar + '' === 'NaN'
8,单引号双引号嵌套 
9,位运算符
js里位操作始终用32位有符号整数来进行计算,js里没有无符号类型,数值始终是有符号的,
>>> 表示的意思就是把所有位整体右移,数字是用补码存的, >>> 连带着 第一个符号位也一起移动了
http://www.cnblogs.com/oneword/archive/2009/12/23/1631039.html
10,vs提示行尾不一致

 visual studio 2008的“行尾不一致,要将行尾标准化吗”的问题产生的原因:这是由Windows和

Unix不同的标准引起的,即“回车”和“换行”的问题。“回车”和“换行”是ASCII字符集中两个不可

见的控制符。“回车”就是CHAR(13),即\r;“换行”就是CHAR(10),即\n。至于“回车”和“换行”是

来源于打字机,没见过打字机或没见过DOS时代的光标恐怕不好理解,因为GUI时代光标都是自由移动的不

再有回车的意义。

      在Unix中“回车”不换行,“换行”才换行,行尾只需要一个“换行”,而在Windows中,“回车

”和“换行”都换行,“回车”+“换行”才是行尾,所以符合Windows开发标准的文本编辑器才会提醒你

当前编辑的文本不符合Windows行尾标准。

 
 
 www.LcKey.com 提供支持  

 

 
posted on 2011-05-29 00:13  LcKey  阅读(842)  评论(0编辑  收藏  举报