推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
pabupa

啊?这……

  •  
  •   pabupa · Jul 23, 2020 · 11210 views
    This topic created in 2294 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
    GM
    Jul 23, 2020
    1
    不能。

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

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

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

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

    python 和 ruby 是一个类那就是 True,js 不是一个类那就不是 true 。你想比较的话用 new String()好了。
    morethansean
    morethansean
    Jul 23, 2020
    11
    @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
    ViggoSite
    Jul 23, 2020
    12
    @pabupa 那....有啥问题吗?

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

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

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

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

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

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

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

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

    第一个是[]

    第二个也是[]

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

    php:

    var_dump([] == []);

    true

    python:

    [] == []

    true

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

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

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

    strpos(源字符, 查找字符)

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

    JS 设计上的问题确实很多,但这与楼主不够了解 JS 并不冲突,是两回事
    mdn 里面也举了这个例子,我觉得并没有什么问题
    虽然不求每个人都能读一下标准,但是看看 mdn 总没啥门槛吧
    Cbdy
    Cbdy
    Jul 24, 2020 via Android
    59
    js 就是设计得比较糙,要设计严谨去看 java
    ChanKc
    ChanKc
    Jul 24, 2020
    60
    @azh7138m 我觉得楼主是知道了这个输出结果,然后吐槽这个设计
    要不也未免太低估楼主的学习能力了
    ChanKc
    ChanKc
    Jul 24, 2020
    61
    @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
    ChanKc
    Jul 24, 2020
    62
    @ChanKc 脑子短路,第二句是“但我觉得为什么 String 还要区分基本数据类型和,呃……你说的类呢?“
    ChanKc
    ChanKc
    Jul 24, 2020
    63
    @ChanKc “但我想……”
    AV1
    AV1
    Jul 24, 2020
    64
    @ChanKc
    当年被迫模仿 java 创造了 js,连糟粕也一起模仿来咯。明明有基本类型,还非要为面向对象而面向对象,搞什么乱七八糟的“包装类”。每次都得反反复复解释新人为什么 new 两个相同的 String 用==相比却得到 false 。现在看到 java 来写前端的,还偶尔看见在 js 里 new String 的,简直可笑。
    robinlovemaggie
    robinlovemaggie
    Jul 24, 2020
    65
    推荐看一下 Dan Abramov 的 justjavascript 课程,你需要一个重塑一下 mental model 来理解 JS
    szzhiyang
    szzhiyang
    Jul 24, 2020
    66
    @imnaive 不是瑕不掩瑜,是瑜不掩瑕。
    wi
    wi
    Jul 25, 2020
    67
    不会写标题就不要发帖
    lovecy
    lovecy
    Jul 27, 2020
    68
    @lovecy [doge][doge][doge]
    @CEBBCAT 只是在玩梗,忘加狗头了[doge][doge][doge]
    rproud
    rproud
    Aug 3, 2020
    69
    Object instanceof Function
    // true
    Function instanceof Object
    // true
    ![] == []
    // true
    !new Boolean(false)
    // false
    😈
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2911 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 266ms · UTC 14:02 · PVG 22:02 · LAX 06:02 · JFK 09:02
    ♥ Do have faith in what you're doing.