跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 啊?这……
未分類
20 7 月 2020

啊?这……

啊?这……

資深大佬 : pabupa 9

"    " instanceof String; // False !!!!!!!!!!!!!! 

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

大佬有話說 (68)

  • 資深大佬 : GM

    不能。

    爱用不用,不用就滚~~~~~

  • 資深大佬 : Touchevent

    暴躁老哥。。

  • 資深大佬 : wellsc

    Js 三元一体.jpg

  • 資深大佬 : DoodleSit

    typeof 不香吗~~
    instanceof 代表是实例的意思,前提是要实例化( new )

  • 資深大佬 : yongjing

    RTFM instanceof 只校验对象

  • 主 資深大佬 : pabupa

    @GM ?????????

  • 主 資深大佬 : pabupa

    @yongjing
    @DoodleSit

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

    “可以通过 new Object(),Object.create()方法,或者******使用字面量标记(初始化标记)初始化对象******。”

  • 資深大佬 : ViggoSite

    typeof 不香吗~~

  • 主 資深大佬 : pabupa

    @ViggoSite typeof 返回的是字符串,还需要再比较一次。

  • 資深大佬 : MintZX

    我没理解,这有什么问题?

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

    python 和 ruby 是一个类那就是 True,js 不是一个类那就不是 true 。你想比较的话用 new String()好了。

  • 資深大佬 : morethansean

    @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

    @pabupa 那….有啥问题吗?

    typeof ” ” == “string”

  • 資深大佬 : ViggoSite

    @morethansean @错了(⊙_⊙;)…

  • 資深大佬 : jinliming2

    String 是类,你可以 new String
    “” 是 string,基本数据类型之一,不是 object
    既然连 object 都不是,怎么可能 instanceof ?
    “” !== new String(“”),因为数据类型不一样,一个是 string,一个是 object 。

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

  • 資深大佬 : hirasawayui

    new String(” are you ok? “) instanceof String // true

  • 資深大佬 : HiCode

    [] == []

    false

  • 資深大佬 : pigmen

    这个真不怪 js,是你用错了

  • 資深大佬 : watanuki

    搜索 wtfjs 有惊喜

  • 資深大佬 : yujiff

    我爱 V2,高人多且直接、热心!

  • 資深大佬 : zhengjian

    new String(” “) instanceof String;

  • 資深大佬 : yanguango

    详细解释看 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof

  • 資深大佬 : Mutoo

    可以自己写一个 instanceOf 来判断: 原理是追踪对象的 __proto__ 链,能否找到目标的原型。

    ” “.__proto__ === String.prototype // true;

  • 資深大佬 : Mutoo

    @Mutoo 随手写了一个版本 https://gist.github.com/mutoo/dca6326a8928b35eff4d57983a726b94

  • 資深大佬 : lizz666

    你左边的是普通字面量,又不是字面量对象,你要分清楚,字面量对象是指直接 `{}` 这种形式的,`” “` 这种只是普通字面量
    你可以看看这个: https://github.com/lizhongzhen11/lizz-blog/issues/75#instanceof (结合规范和 MDN 理解下)

  • 資深大佬 : lizz666

    另外关于 instanceof 设计历史,你可以看 https://github.com/doodlewind/js-20-years-cn/blob/master/part-2.md#%E5%AE%9A%E4%B9%89-ecmascript-3 中相关内容

  • 資深大佬 : murmur

    instanceof 我记得还有跨 iframe 的坑 ,所以判断 array 才会有那么复杂的写法

  • 資深大佬 : free9fw

    String.prototype.constructor(” “) instanceof String 与 new String(” “) instanceof String
    true 的区别

  • 資深大佬 : xingyuc

    标题党先打死 hhh

  • 資深大佬 : xiaoyu8740

    拜托 先好好学学基础

  • 資深大佬 : joesonw

    @HiCode 数组和对象是指针比较, 肯定不一样啊. 你换哪个语言都不行啊.

  • 資深大佬 : ChanKc

    JS 就是设计上有问题,为什么上那么多人不愿意承认?

  • 資深大佬 : Vegetable

    这是不是弱类型造成的认知困难?

  • 資深大佬 : faceRollingKB

    确实有这种问题,你需要使用 object wrapper 做一下装箱:Object(‘ ‘) instanceof String // true

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/Object

  • 資深大佬 : VDimos

    一般都多种方法判断的,我一般用 Object.prototype.toString 来判断

  • 資深大佬 : ares586

    每个语言都有不足。。JS 能兼容,不像 py2 -> py3 已经不错了

  • 資深大佬 : vivipure

    new String(‘ ‘) instanceof String. // true
    ‘ ‘ instanceof String // false
    ‘ ‘.__proto__.contrucotr // undefined
    new String(‘ ‘).__proto__.constructor // String()

    ————

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

    建议 Object.prototype.toString.call() 万能的

  • 資深大佬 : imnaive

    瑕不掩瑜,你就当是断臂维纳斯了。

  • 資深大佬 : HiCode

    @joesonw 你没眼花吧?

    第一个是[]

    第二个也是[]

    自己复制了去浏览器执行看看。

  • 資深大佬 : HiCode

    @joesonw

    php:

    var_dump([] == []);

    true

    python:

    [] == []

    true

    你都去试试!

  • 資深大佬 : MyouiSouth

    js 设计上有问题和主使用错误不冲突啊,大家承认了 js 的设计问题主的” ” instanceof String 也不会变成 true 呀,为啥纠正使用错误变成了不承认 js 的设计问题呢,我就算承认了我也没办法纠正 js 的设计问题啊,委屈哭了呜呜呜

  • 資深大佬 : ChanKc

    @MyouiSouth 在这个问题上,JS 和主之间,我觉得 JS 是更应该被 blamed 的

  • 資深大佬 : Rwing

    当初 10 天设计出来的语言,你能指望他有多完备?这不慢慢在补么

  • 資深大佬 : AmiKara

    @joesonw js 的某些地方确实有问题,但是这个问题完全是主自己使用错误,js 里的基本数据类型和引用类型概念不一样,instanceof 查询的是元素原型链中的引用类型

  • 資深大佬 : LokiSharp

    JS 太多地方是反常识和反直觉的

  • 資深大佬 : assad

    宇宙变态语言,没啥的,总会让你惊不惊喜意不意外!

  • 資深大佬 : DOLLOR

    啊ニマビ,这니마비。
    能不能起一个正常一点的标题?
    能不能起一个正常一点的标题?
    能不能起一个正常一点的标题?

  • 資深大佬 : joesonw

    @HiCode []不是数组是什么, 字符串?

  • 資深大佬 : byzf

    这都不算三位一体, string literal 不是 new string(”).

    你这顶多是吃屎心蛋糕, 来发帖问为什么蛋糕上没有奶油.

  • 資深大佬 : zh1997

    #php
    explode(分隔符, 源字符)

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

    strpos(源字符, 查找字符)

    一直搞混,为什么不能把源字符统一放左边

  • 資深大佬 : chenalex

    @vivipure
    ‘ ‘.__proto__.contrucotr // undefined
    contrucotr => constructor
    所以 ‘ ‘.__proto__.constructor // String

  • 資深大佬 : lovecy

    啊这。。。懂得都懂!
    不会真有人不知道吧?不会吧不会吧不会吧?
    非杠非黑,无意冒犯,你在教 JavaScript 做事?

  • 資深大佬 : rick2c

    就这?

  • 資深大佬 : fyxtc

    标题不能加上相关描述吗 ”js 空串 string 实例判断问题”,很难?

  • 資深大佬 : camillo

    主题标题
    请在标题中描述内容要点。如果一件事情在标题的长度内就已经可以说清楚,那就没有必要写正文了。

  • 資深大佬 : TargaryenChen

    @murmur 我也遇到过,因为每个 iframe 有他们自己的内部 Class,你在一个 window.top 中 var a = new Array(), 在 iframe 中 a instanceof Array === false

  • 資深大佬 : CEBBCAT

    @lovecy #50 @rick2c #51 不怕被站长 Deactivate 么……

  • 資深大佬 : dbow

    不要有误会,  String 是个函数,不是个其它语言意义上的 type,  instanceof 是判断 prototype 用的,不是判断类型的。 
    javascript 里没有常规的 type, 只有 object 。  let a = new String(“”); a instanceof String 这样是成立的,表示 a 的 prototype 是 String 。

  • 資深大佬 : azh7138m

    @ChanKc
    > JS 就是设计上有问题,为什么上那么多人不愿意承认?

    JS 设计上的问题确实很多,但这与主不够了解 JS 并不冲突,是两回事
    mdn 里面也举了这个例子,我觉得并没有什么问题
    虽然不求每个人都能读一下标准,但是看看 mdn 总没啥门槛吧

  • 資深大佬 : Cbdy

    js 就是设计得比较糙,要设计严谨去看 java

  • 資深大佬 : ChanKc

    @azh7138m 我觉得主是知道了这个输出结果,然后吐槽这个设计
    要不也未免太低估主的学习能力了

  • 資深大佬 : ChanKc

    @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 脑子短路,第二句是“但我觉得为什么 String 还要区分基本数据类型和,呃……你说的类呢?“

  • 資深大佬 : ChanKc

    @ChanKc “但我想……”

  • 資深大佬 : DOLLOR

    @ChanKc
    当年被迫模仿 java 创造了 js,连糟粕也一起模仿来咯。明明有基本类型,还非要为面向对象而面向对象,搞什么乱七八糟的“包装类”。每次都得反反复复解释新人为什么 new 两个相同的 String 用==相比却得到 false 。现在看到 java 来写前端的,还偶尔看见在 js 里 new String 的,简直可笑。

  • 資深大佬 : robinlovemaggie

    推荐看一下 Dan Abramov 的 justjavascript 课程,你需要一个重塑一下 mental model 来理解 JS

  • 資深大佬 : szzhiyang

    @imnaive 不是瑕不掩瑜,是瑜不掩瑕。

  • 資深大佬 : wi

    不会写标题就不要发帖

  • 資深大佬 : lovecy

    @lovecy [doge][doge][doge]
    @CEBBCAT 只是在玩梗,忘加狗头了[doge][doge][doge]

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具