Ruby's Louvre

The Crankiness of Belief achieves Great , not the Trick of Regulation.

全世界最短的IE判定

以前最短的IE判定借助于IE不支持垂直制表符的特性搞出来的。

var ie = !+"\v1"; 

仅仅需要7bytes!参见这篇文章,《32 bytes, ehr ... 9, ehr ... 7!!! to know if your browser is IE》,讲述外国人是如何把IE的判定从32 bytes一步步缩简成7 bytes!的故事

但这纪录今年1月8日被一个俄国人打破了,现在只要6 bytes!它利用了IE与标准浏览器在处理数组的toString方法的差异做成的。对于标准游览器,如果数组里面最后一个字符为逗号,JS引擎会自动剔除它。详见这里 恭喜你,Aleko ,你真是我的偶像!

var ie = !-[1,];

如果从非IE的角度判定,可以省一个比特,因为我们做兼容时,绝大多数情况都是IE与非IE地开工。

var notIE = -[1,]; 

标签: javascript

posted on 2010-01-28 13:16 司徒正美 阅读(13363) 评论(66) 编辑 收藏

评论

#1楼 2010-01-28 13:22 麒麟      

 回复 引用 查看   

#2楼 2010-01-28 13:24 BlueDream      

哈哈 楼主挖掘的东西 果然好啊..  回复 引用 查看   

#3楼 2010-01-28 13:26 传说中的宝玉      

-[1,] 前面的减号是什么意思啊? 小弟新手 不要砸  回复 引用 查看   

#4楼 2010-01-28 13:31 侯伯薇      

什么时候浏览器能统一标准啊。  回复 引用 查看   

#5楼 2010-01-28 13:33 古道轻风      

厉害。
初一看还以为是正则表达式。
 回复 引用 查看   

#6楼 2010-01-28 13:35 cokkiy      

@侯伯薇
never
 回复 引用 查看   

#7楼[楼主] 2010-01-28 13:41 司徒正美      

[1,]在标准浏览器会返回字符串"1",相当于调用[1,].toString,
,IE则返回"1,"。但是这样IE与标准都会通过检测,因此使用负号强制转换为数字,标准能成功转换为1,1会在if中自动转换为true,而IE则转换为NaN,再自动转换为false!
 回复 引用 查看   

#8楼 2010-01-28 13:46 幸存者      

bit和byte是有区别的。
7bits连一个ascii字符都装不下。
 回复 引用 查看   

#9楼 2010-01-28 13:52 莫耶      

牛人  回复 引用 查看   

#10楼 2010-01-28 13:55 webaspx      

好强~~  回复 引用 查看   

#11楼 2010-01-28 14:05 clefoo      

还可以  回复 引用 查看   

#12楼 2010-01-28 14:11 补丁      

我怎么觉得这样会留下无尽的后患...  回复 引用 查看   

#13楼 2010-01-28 14:15 假正经哥哥      

物质是运动di,所以变化是一定的,这种以已知来推断未知是不合理的。。  回复 引用 查看   

#14楼[楼主] 2010-01-28 14:17 司徒正美      

@补丁
应该不会,IE总是向前兼容,主要不是bug它就不会修正。
 回复 引用 查看   

#15楼 2010-01-28 14:18 白发先生      

@司徒正美
[1,]在标准浏览器会返回字符串"1",相当于调用[1,].toString,
,IE则返回"1,"。但是这样IE与标准都会通过检测,因此使用负号强制转换为数字,标准能成功转换为1,1会在if中自动转换为true,而IE则转换为NaN,再自动转换为false!

这种说话是错误的,你可以在不同浏览器中测试:
alert([1,] === '1');
alert([1,].toString() === '1');
alert([1,].toString() === '1,');
 回复 引用 查看   

#16楼 2010-01-28 14:22 Kevan      

厉害啊,MARK一下、  回复 引用 查看   

#17楼[楼主] 2010-01-28 14:35 司徒正美      

@白发先生
没有错啊,标准浏览器特指非IE内核的浏览器

你用了===号,当然不会自动转换啦!

在IE内核下,

alert([1,] === '1');//数组当然不等于字符串
alert([1,].toString() === '1');// "1,"当然不等于 "1"
alert([1,].toString() === '1,');// "1,"等于"1,"

非IE内核
alert([1,] === '1');//数组当然不等于字符串
alert([1,].toString() === '1');// "1"等于 "1"
alert([1,].toString() === '1,');// "1"不等于"1,"



 回复 引用 查看   

#18楼 2010-01-28 14:38 qqcrazyer      

javascript:alert(!+[1,]); print true
javascript:alert(!+[1]); print false
 回复 引用 查看   

#19楼 2010-01-28 14:41 Fisher WEI      

byte 和 bit 不是一回事吧。

ansi 1 byte = 8 bits
unicode 1 byte = 16 bits
 回复 引用 查看   

#20楼[楼主] 2010-01-28 14:48 司徒正美      

@Fisher WEI
从RSS阅读我博客的朋友,此笔误我已修正了。以后看我的文章还直接到我博客来吧,也好为我的博客增加点击率^_^
 回复 引用 查看   

#21楼 2010-01-28 15:05 Kevin Cheng      

浏览器兼容真是恶梦啊  回复 引用 查看   

#22楼 2010-01-28 15:12 step by step      

强悍,想想自己以前写的,比较起来可真惭愧。  回复 引用 查看   

#23楼 2010-01-28 15:13 Fisher WEI      

引用司徒正美:
@Fisher WEI
从RSS阅读我博客的朋友,此笔误我已修正了。以后看我的文章还直接到我博客来吧,也好为我的博客增加点击率^_^


"仅仅需要7bits"

还有一处没改。第一句。
 回复 引用 查看   

#24楼 2010-01-28 15:14 菩提树下的杨过      

俄国人,又是俄国人!  回复 引用 查看   

#25楼 2010-01-28 15:23 王金平      

超强  回复 引用 查看   

#26楼 2010-01-28 15:36 白发先生      

@司徒正美

准确的解释应该是:
  [1,]在进行"-"运算前将先执行[1,].toString()。
eg:

  var arr = [11,];
  alert(arr[0]);
  alert(arr.toString()[0]);
 回复 引用 查看   

#27楼 2010-01-28 16:08 景坤      

IE外的浏览器都支持数组最后一个逗号的特性吗?  回复 引用 查看   

#28楼 2010-01-28 16:13 oec2003      

果然很强  回复 引用 查看   

#29楼 2010-01-28 16:14 Farmer      

在牛A与牛C之间看见楼主了  回复 引用 查看   

#30楼 2010-01-28 16:48 Dreampuf      

昨天测试了一下!+"\v1" 判断和 document.addElementListener判断的效率,看来有必要再做一下....!-[1,]  回复 引用 查看   

#31楼 2010-01-28 16:59 Jimixu      

还是更喜欢 "\v"=="v" 这个方法,好记  回复 引用 查看   

#32楼[楼主] 2010-01-28 17:50 司徒正美      

@景坤
你知道标准游览器为什么被称之为标准浏览器吗?

就是专门与IE作对的那些浏览器,为了与IE划清界线,在各种实现上总是存在哪怕一星半点的差异。
 回复 引用 查看   

#33楼 2010-01-28 18:27 飞鸽传书      

太牛了。  回复 引用 查看   

#34楼 2010-01-28 19:05 飞林沙      

var ie = !-[0,];
alert(ie);
楼主,请问这样为什么不可以啊?
[1,]和[0,]有什么区别吗?
 回复 引用 查看   

#35楼[楼主] 2010-01-28 19:17 司徒正美      

@飞林沙
1与0对计算机来说的确区别很大,因为不是零就是一!
 回复 引用 查看   

#36楼 2010-01-28 19:19 Selfocus      

真有意思  回复 引用 查看   

#37楼 2010-01-28 19:22 飞林沙      

@司徒正美

引用司徒正美:
@飞林沙
1与0对计算机来说的确区别很大,因为不是零就是一!


囧,如果利用的是IE不支持数组以逗号结尾,那为什么 [0,]不可以呢?  回复 引用 查看   

#38楼[楼主] 2010-01-28 19:32 司徒正美      

@飞林沙
分析一下你的东西
var ie = !-[0,];

从右到左

在IE下,"0," => NaN => true
在标准,"0" => 0 => true

因此无法区分哪个是哪个
 回复 引用 查看   

#39楼 2010-01-28 19:40 不死鸟之魂      

引用飞林沙:
@司徒正美
引用司徒正美:
@飞林沙
1与0对计算机来说的确区别很大,因为不是零就是一!


囧,如果利用的是IE不支持数组以逗号结尾,那为什么 [0,]不可以呢?

嗯,如果根据博主的解释,这个质疑是成立的。
[0,].toString()为“0,”,加上负号(“-”)就会变成NaN,照道理会被判断为false。  回复 引用 查看   

#40楼 2010-01-28 19:44 不死鸟之魂      

经测试,发现只有1才能起到作用,无论是0还是2都不起作用。难倒if(-2)被Javascript认为是非法?C里面可是合法的。
测试所用浏览器分别为IE8和Opera10。
 回复 引用 查看   

#41楼 2010-01-28 19:51 小haha      

这种东西可以用么?你确定ie9不会取消这个玩意?  回复 引用 查看   

#42楼[楼主] 2010-01-28 19:52 司徒正美      

@不死鸟之魂

if(-1){  //把-1改成0,1,2,-2试试
 alert("司徒正美")
}
 回复 引用 查看   

#43楼 2010-01-28 20:31 永不言败      

太强了 var ie = !-[0,];  回复 引用 查看   

#44楼 2010-01-29 09:07 景坤      

@司徒正美
哦,谢谢指教。
 回复 引用 查看   

#45楼 2010-01-29 09:16 mxm145      

很强大啊  回复 引用 查看   

#46楼 2010-01-29 09:24 半夜喝茶      

实在太神奇了  回复 引用 查看   

#47楼 2010-01-29 11:28 瓜籽      

真是太强大了。我以为if(!+"\v1")就已经挺精简的了,没想到今天又出了一个比他还强悍的,牛人!  回复 引用 查看   

#48楼 2010-02-01 12:26 euler      

佩服到家了  回复 引用 查看   

#49楼 2010-02-02 13:10 Net205 Blog      

标记下  回复 引用 查看   

#50楼 2010-02-02 14:16 小隐任行      

mark  回复 引用 查看   

#51楼 2010-02-02 22:49 518      

强啊。你是不是在开发IE哦。  回复 引用 查看   

#52楼 2010-02-06 08:22 Ryan Boo      

膜拜,那如果,别的浏览器也不支持该属性呢?  回复 引用 查看   

#53楼 2010-02-20 19:59 simplejee      

引用司徒正美:
@补丁
应该不会,IE总是向前兼容,主要不是bug它就不会修正。



可不是的啊  回复 引用 查看   

#54楼 2010-02-22 11:30 msyye      

 回复 引用 查看   

#55楼 2010-02-23 15:44 wangjw      

不错。  回复 引用 查看   

#56楼 2010-03-18 22:40 沙加      

没有最BT,只有更BT ;)  回复 引用 查看   

#57楼 2010-04-12 12:43 ylch222      

不错!学到东西了  回复 引用 查看   

#58楼 2010-05-05 08:36 语虫      

mark  回复 引用 查看   

#59楼 2010-05-07 13:00 serf _lee      

好强。

请问? 楼主都在哪些地方看国外的技术文章呢? 推荐几个。 谢谢
 回复 引用 查看   

#60楼 2010-08-08 22:30 langlangmxl      

[,]-1  回复 引用 查看   

#61楼 2010-10-21 18:41 Jiyp      

这个!-[1,]判定在IE9 beta 9.0.7930.16406中,当文档模式为quirks、IE7、IE8时,是正确的。但是当文档模式为IE9标准时,这个判定失效了,也剔除了','  回复 引用 查看   

#62楼 2011-04-01 23:26 上善若水.      

强!不过应该不是很实用吧,项目中应该不敢这么用。。  回复 引用 查看   

#63楼 2011-10-12 09:46 【当耐特砖家】      

赞!虽然有点晚  回复 引用 查看   

#64楼 2011-12-01 18:23 sking7      

这种bug,ie早晚会修补的。。。我自己感觉最好别用、、  回复 引用 查看   

#65楼 2011-12-16 15:11 faceach      

ie9 修复了吧?  回复 引用 查看   

#66楼 2011-12-19 10:16 allen_      

楼主IE9已经修复这个问题了,赶紧撤了吧,这一贴.怎么还留着啊,不要误导人家  回复 引用 查看