一个Javascript表达式:!+ [1, ]

 zhihong520珠珠_448 发布于 2022-11-25 03:56

!+ [1, ]这个是我最近看到的一个奇怪的javascript表达式(其实我也不知道如何称呼他),出自这篇文章http://www.cnblogs.com/smallsong/archive/2012/02/20/2358884.html。

我记得我以前看过,貌似有些黑客用这些奇怪的表达式构造了许多奇怪的功能。不过我现在实在想不起来了,然后Google和百度也搜不到想要的。于是就到这里问问了。

这个真的很有趣啊

6 个回答
  • IE6,7,8下这个地方是一个bug, 如 @HJin.me 所说:+[1,]加号相当于做了一次向字符串的隐式转换,但是Number([1,].toString())的结果在IE6,7,8下并不是1而是NAN, NaN是为数不多的可以等同false的对象,取反后为true.

    所以这段代码经常用来区分浏览器是否是IE6,7,8.

    而这个bug出现后IE一直没有针对这些情况做升级和改进.这也是为什么IE9以前的系列被前端开发人员称为噩梦的众多原因.

    2022-11-25 05:37 回答
  • ({}+[])

    "[object Object]"
    

    !![]+[]

    "true"
    

    ![]+[]

    "false"
    

    {}+{}+[]

    "NaN"
    

    [][[]]+[]

    "undefined"
    

    +[]

    0
    

    ![]+!![]

    1
    

    利用这些可以构造出神奇的东西

    ({}+[])[!![]-~!![]-~!![]]+(!![]+[])[-~!![]]+([][[]]+[])[!![]-~!![]-~!![]]+(!![]+[])[+[]]
    
    2022-11-25 05:37 回答
  • 这是用来判断ie的,因为数组中最后一个是逗号,ie会出错,而标准浏览器正常。 一般这样的写法比较多 !-[1,]

    2022-11-25 05:37 回答
  • 第一次看到这方面的是这个表达式

    ++[[]][+[]]+[+[]]

    js中+[]==0,+[1]==1

    lz引用那个作者纯粹蛋疼...(捂脸

    =.=我表示忘记兼容了=.=我上面说的那句是错的,表示道歉

    2022-11-25 05:37 回答
  • 好吧这段代码的功能还可以区分IE6到8和其他浏览器。

    if ( !+ [1, ] ){
        alert("yes!") ;
    } else {
        alert("no!") ;
    }
    

    IE6~8:yes!

    ie9+:no!

    2022-11-25 05:37 回答
  • 这个不算奇怪。只是涉及到 JavaScript 内部运算时变量类型隐式转换的问题。

    [1,] // [1]
    

    在执行的时候,等同于 [1]。

    +[1,]
    

    相当于做了一次隐式转换 Number([1,].toString())。转换的结果就是 1

    !+[1,]
    

    就是对 1 取反。最后结果就是 false 了。

    说个好玩的吧。比如不用数字和字母写代码也是可以的。

    +[] // 0
    ++[+[]][+[]] // 1
    // ... 以此类推,字母和数字都可以表示出来了
    
    2022-11-25 05:37 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有