啊?这…… - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
pabupa

啊?这……

  •  
  •   pabupa Jul 23, 2020 10473 views
    This topic created in 2103 days ago, the information mentioned may be changed or developed.
    " " instanceof String; // False !!!!!!!!!!!!!! 

    你内部怎么实现的,跟我有社么关系呀?你不能让他保持一致吗?!

    Supplement 1    Jul 23, 2020
    #python isinstance(" ", str) # True 
    # ruby puts " ".instance_of?(String) ; # True 
    69 replies    2020-08-03 18:22:47 +08:00
    GM
        1
    GM  
       Jul 23, 2020
    不能。

    爱用不用,不用就滚~~~~~
    Touchevent
        2
    Touchevent  
       Jul 23, 2020
    暴躁老哥。。
    wellsc
        3
    wellsc  
       Jul 23, 2020 via iPhone
    Js 三元一体.jpg
    DoodleSit
        4
    DoodleSit  
       Jul 23, 2020
    typeof 不香吗~~
    instanceof 代表是实例的意思,前提是要实例化( new )
    yongjing
        5
    yongjing  
       Jul 23, 2020
    RTFM instanceof 只校验对象
    pabupa
        6
    pabupa  
    OP
       Jul 23, 2020
    @GM ?????????
    pabupa
        7
    pabupa  
    OP
       Jul 23, 2020
    @yongjing
    @DoodleSit

    https://developer.mozilla.org/zh-CN/docs/Web/Javascript/Reference/Operators/Object_initializer

    "可以通过 new Object(),Object.create()方法,或者******使用字面量标记(初始化标记)初始化对象******。"
    ViggoSite
        8
    ViggoSite  
       Jul 23, 2020
    typeof 不香吗~~
    pabupa
        9
    pabupa  
    OP
       Jul 23, 2020 via Android
    @ViggoSite typeof 返回的是字符串,还需要再比较一次。
    MintZX
        10
    MintZX  
       Jul 23, 2020 via iPhone
    我没理解,这有什么问题?

    前者是模版字符,后者是对象。当然不是一个东西。

    python 和 ruby 是一个类那就是 True,js 不是一个类那就不是 true 。你想比较的话用 new String()好了。
    morethansean
        11
    morethansean  
       Jul 23, 2020
    @ViggoSite 你引用的这篇文章里不是写了嘛, ```An object initializer is a comma-delimited list of zero or more pairs of property names and associated values of an object, enclosed in curly braces ({}).``` string literal 并不是 object, instanceof 会返回 false.
    ViggoSite
        12
    ViggoSite  
       Jul 23, 2020
    @pabupa 那....有啥问题吗?

    typeof " " == "string"
    ViggoSite
        13
    ViggoSite  
       Jul 23, 2020
    @morethansean @错了(⊙_⊙;)…
    jinliming2
        14
    jinliming2  
       Jul 23, 2020   2
    String 是类,你可以 new String
    "" 是 string,基本数据类型之一,不是 object
    既然连 object 都不是,怎么可能 instanceof ?
    "" !== new String(""),因为数据类型不一样,一个是 string,一个是 object 。

    顺便,@pabupa #7,你能把那一段复制完吗?
    可以通过 new Object(),Object.create()方法,或者使用字面量标记**(初始化标记)**初始化对象。 **一个对象初始化器,由花括号 /大括号 ({}) 包含的一个由零个或多个对象属性名和其关联值组成的一个逗号分隔的列表构成**。
    所以,只有 {} 出来的才是对象!
    hirasawayui
        15
    hirasawayui  
       Jul 23, 2020
    new String(" are you ok? ") instanceof String // true
    Q4h7388nR28s95fa
        16
    Q4h7388nR28s95fa  
       Jul 23, 2020
    [] == []

    false
    pigmen
        17
    pigmen  
       Jul 23, 2020
    这个真不怪 js,是你用错了
    watanuki
        18
    watanuki  
       Jul 23, 2020
    搜索 wtfjs 有惊喜
    yujiff
        19
    yujiff  
       Jul 23, 2020
    我爱 V2,高人多且直接、热心!
    mmnsghgn
        20
    mmnsghgn  
       Jul 23, 2020
    new String(" ") instanceof String;
    Mutoo
        22
    Mutoo  
       Jul 24, 2020
    可以自己写一个 instanceOf 来判断: 原理是追踪对象的 __proto__ 链,能否找到目标的原型。

    " ".__proto__ === String.prototype // true;
    Mutoo
        23
    Mutoo  
       Jul 24, 2020
    lizz666
        24
    lizz666  
       Jul 24, 2020
    你左边的是普通字面量,又不是字面量对象,你要分清楚,字面量对象是指直接 `{}` 这种形式的,`" "` 这种只是普通字面量
    你可以看看这个: https://github.com/lizhongzhen11/lizz-blog/issues/75#instanceof (结合规范和 MDN 理解下)
    lizz666
        25
    lizz666  
       Jul 24, 2020
    另外关于 instanceof 设计历史,你可以看 https://github.com/doodlewind/js-20-years-cn/blob/master/part-2.md#%E5%AE%9A%E4%B9%89-ecmascript-3 中相关内容
    murmur
        26
    murmur  
       Jul 24, 2020
    instanceof 我记得还有跨 iframe 的坑 ,所以判断 array 才会有那么复杂的写法
    free9fw
        27
    free9fw  
       Jul 24, 2020
    String.prototype.constructor(" ") instanceof String 与 new String(" ") instanceof String
    true 的区别
    xingyuc
        28
    xingyuc  
       Jul 24, 2020
    标题党先打死 hhh
    xiaoyu8740
        29
    xiaoyu8740  
       Jul 24, 2020
    拜托 先好好学学基础
    joesonw
        30
    joesonw  
       Jul 24, 2020
    @HiCode 数组和对象是指针比较, 肯定不一样啊. 你换哪个语言都不行啊.
    ChanKc
        31
    ChanKc  
       Jul 24, 2020 via Android   14
    JS 就是设计上有问题,为什么楼上那么多人不愿意承认?
    Vegetable
        32
    Vegetable  
       Jul 24, 2020
    这是不是弱类型造成的认知困难?
    faceRollingKB
        33
    faceRollingKB  
       Jul 24, 2020
    确实有这种问题,你需要使用 object wrapper 做一下装箱:Object(' ') instanceof String // true

    https://developer.mozilla.org/en-US/docs/Web/Javascript/Reference/Global_Objects/Object/Object
    VDimos
        34
    VDimos  
       Jul 24, 2020 via Android
    一般都多种方法判断的,我一般用 Object.prototype.toString 来判断
    ares586
        35
    ares586  
       Jul 24, 2020
    每个语言都有不足。。JS 能兼容,不像 py2 -> py3 已经不错了
    vivipure
        36
    vivipure  
       Jul 24, 2020
    new String(' ') instanceof String. // true
    ' ' instanceof String // false
    ' '.__proto__.contrucotr // undefined
    new String(' ').__proto__.constructor // String()

    ------------

    你直接声明的字符串是基本类型,不是通过实例生成的对象 所以 instanceof 没用

    建议 Object.prototype.toString.call() 万能的
    imnaive
        37
    imnaive  
       Jul 24, 2020
    瑕不掩瑜,你就当是断臂维纳斯了。
    Q4h7388nR28s95fa
        38
    Q4h7388nR28s95fa  
       Jul 24, 2020
    @joesonw 你没眼花吧?

    第一个是[]

    第二个也是[]

    自己复制了去浏览器执行看看。
    Q4h7388nR28s95fa
        39
    Q4h7388nR28s95fa  
       Jul 24, 2020
    @joesonw

    php:

    var_dump([] == []);

    true

    python:

    [] == []

    true

    你都去试试!
    MyouiSouth
        40
    MyouiSouth  
       Jul 24, 2020
    js 设计上有问题和楼主使用错误不冲突啊,大家承认了 js 的设计问题楼主的" " instanceof String 也不会变成 true 呀,为啥纠正使用错误变成了不承认 js 的设计问题呢,我就算承认了我也没办法纠正 js 的设计问题啊,委屈哭了呜呜呜
    ChanKc
        41
    ChanKc  
       Jul 24, 2020 via Android   1
    @MyouiSouth 在这个问题上,JS 和楼主之间,我觉得 JS 是更应该被 blamed 的
    Rwing
        42
    Rwing  
       Jul 24, 2020
    当初 10 天设计出来的语言,你能指望他有多完备?这不慢慢在补么
    AmiKara
        43
    AmiKara  
       Jul 24, 2020
    @joesonw js 的某些地方确实有问题,但是这个问题完全是楼主自己使用错误,js 里的基本数据类型和引用类型概念不一样,instanceof 查询的是元素原型链中的引用类型
    LokiSharp
        44
    LokiSharp  
       Jul 24, 2020
    JS 太多地方是反常识和反直觉的
    assad
        45
    assad  
       Jul 24, 2020
    宇宙变态语言,没啥的,总会让你惊不惊喜意不意外!
    AV1
        46
    AV1  
       Jul 24, 2020   2
    啊ニマビ,这。
    能不能起一个正常一点的标题?
    能不能起一个正常一点的标题?
    能不能起一个正常一点的标题?
    joesonw
        47
    joesonw  
       Jul 24, 2020
    @HiCode []不是数组是什么, 字符串?
    byzf
        48
    byzf  
       Jul 24, 2020
    这都不算三位一体, string literal 不是 new string('').

    你这顶多是吃屎心蛋糕, 来发帖问为什么蛋糕上没有奶油.
    zh1997
        49
    zh1997  
       Jul 24, 2020
    #php
    explode(分隔符, 源字符)

    str_replace(被替换字符, 替换字符, 源字符)

    strpos(源字符, 查找字符)

    一直搞混,为什么不能把源字符统一放左边
    chenalex
        50
    chenalex  
       Jul 24, 2020
    @vivipure
    ' '.__proto__.contrucotr // undefined
    cOntrucotr=> constructor
    所以 ' '.__proto__.constructor // String
    lovecy
        51
    lovecy  
       Jul 24, 2020
    啊这。。。懂得都懂!
    不会真有人不知道吧?不会吧不会吧不会吧?
    非杠非黑,无意冒犯,你在教 Javascript 做事?
    cc77
        52
    cc77  
       Jul 24, 2020
    就这?
    hikarugo
        53
    hikarugo  
       Jul 24, 2020   1
    标题不能加上相关描述吗 ”js 空串 string 实例判断问题",很难?
    camillo
        54
    camillo  
       Jul 24, 2020
    主题标题
    请在标题中描述内容要点。如果一件事情在标题的长度内就已经可以说清楚,那就没有必要写正文了。
    TargaryenChen
        55
    TargaryenChen  
       Jul 24, 2020
    @murmur 我也遇到过,因为每个 iframe 有他们自己的内部 Class,你在一个 window.top 中 var a = new Array(), 在 iframe 中 a instanceof Array === false
    CEBBCAT
        56
    CEBBCAT  
       Jul 24, 2020
    @lovecy #50 @rick2c #51 不怕被站长 Deactivate 么……
    dbow
        57
    dbow  
       Jul 24, 2020
    不要有误会,  String 是个函数,不是个其它语言意义上的 type,  instanceof 是判断 prototype 用的,不是判断类型的。 
    Javascript 里没有常规的 type, 只有 object 。  let a = new String(""); a instanceof String 这样是成立的,表示 a 的 prototype 是 String 。
    azh7138m
        58
    azh7138m  
       Jul 24, 2020
    @ChanKc
    > JS 就是设计上有问题,为什么楼上那么多人不愿意承认?

    JS 设计上的问题确实很多,但这与楼主不够了解 JS 并不冲突,是两回事
    mdn 里面也举了这个例子,我觉得并没有什么问题
    虽然不求每个人都能读一下标准,但是看看 mdn 总没啥门槛吧
    Cbdy
        59
    Cbdy  
       Jul 24, 2020 via Android
    js 就是设计得比较糙,要设计严谨去看 java
    ChanKc
        60
    ChanKc  
       Jul 24, 2020
    @azh7138m 我觉得楼主是知道了这个输出结果,然后吐槽这个设计
    要不也未免太低估楼主的学习能力了
    ChanKc
        61
    ChanKc  
       Jul 24, 2020
    @jinliming2 #14 啊,我知道基本数据类型什么的。但我觉得 String 还区分基本数据类型和,呃……你说的类。可是既然现实中根本没人真的会用 new String,为什么不就合成一个呢?
    你看 BigInt 。BigInt(1)会产生一个新的 BigInt,Object.getPrototypeOf(BigInt(1))可以拿到它的原型。而 new BigInt 则会抛出异常,所以几乎永远都不会产生 x instanceof BigInt 为 true 的可能,除非你干下面这种事情
    Object.create(Object.getPrototypeOf(BigInt(1))) instanceof BigInt
    在做 BigInt 的时候我觉得 TC39 的人一定注意到了这个问题所以做得比 String 要好了一些。但是过去的事情,像楼主这样吐槽一下也是挺有乐趣的事情。
    Java 的那帮人似乎确实有想过合二为一,Valhalla 好像就在做类似的事情
    https://cr.openjdk.java.net/~briangoetz/valhalla/sov/02-object-model.html
    ChanKc
        62
    ChanKc  
       Jul 24, 2020
    @ChanKc 脑子短路,第二句是“但我觉得为什么 String 还要区分基本数据类型和,呃……你说的类呢?“
    ChanKc
        63
    ChanKc  
       Jul 24, 2020
    @ChanKc “但我想……”
    AV1
        64
    AV1  
       Jul 24, 2020
    @ChanKc
    当年被迫模仿 java 创造了 js,连糟粕也一起模仿来咯。明明有基本类型,还非要为面向对象而面向对象,搞什么乱七八糟的“包装类”。每次都得反反复复解释新人为什么 new 两个相同的 String 用==相比却得到 false 。现在看到 java 来写前端的,还偶尔看见在 js 里 new String 的,简直可笑。
    robinlovemaggie
        65
    robinlovemaggie  
       Jul 24, 2020
    推荐看一下 Dan Abramov 的 justJavascript 课程,你需要一个重塑一下 mental model 来理解 JS
    szzhiyang
        66
    szzhiyang  
       Jul 24, 2020
    @imnaive 不是瑕不掩瑜,是瑜不掩瑕。
    wi
        67
    wi  
       Jul 25, 2020
    不会写标题就不要发帖
    lovecy
        68
    lovecy  
       Jul 27, 2020
    @lovecy [doge][doge][doge]
    @CEBBCAT 只是在玩梗,忘加狗头了[doge][doge][doge]
    rproud
        69
    rproud  
       Aug 3, 2020
    Object instanceof Function
    // true
    Function instanceof Object
    // true
    ![] == []
    // true
    !new Boolean(false)
    // false
    About     Help     Advertise     Blog     API     FAQ     Solana     4178 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 148ms UTC 05:19 PVG 13:19 LAX 22:19 JFK 01:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86