" " instanceof String; // False !!!!!!!!!!!!!!
你内部怎么实现的,跟我有社么关系呀?你不能让他保持一致吗?!
" " instanceof String; // False !!!!!!!!!!!!!!
你内部怎么实现的,跟我有社么关系呀?你不能让他保持一致吗?!
#python
isinstance(" ", str) # True
# ruby
puts " ".instance_of?(String) ; # True
|
GMJul 23, 2020
1
不能。
爱用不用,不用就滚~~~~~ |
|
ToucheventJul 23, 2020
2
暴躁老哥。。
|
|
wellscJul 23, 2020 via iPhone
3
Js 三元一体.jpg
|
|
DoodleSitJul 23, 2020
4
typeof 不香吗~~
instanceof 代表是实例的意思,前提是要实例化( new ) |
|
yongjingJul 23, 2020
5
RTFM instanceof 只校验对象
|
|
7
@yongjing
@DoodleSit https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Object_initializer "可以通过 new Object(),Object.create()方法,或者******使用字面量标记(初始化标记)初始化对象******。" |
|
ViggoSiteJul 23, 2020
8
typeof 不香吗~~
|
|
MintZXJul 23, 2020 via iPhone
10
我没理解,这有什么问题?
前者是模版字符,后者是对象。当然不是一个东西。 python 和 ruby 是一个类那就是 True,js 不是一个类那就不是 true 。你想比较的话用 new String()好了。 |
|
morethanseanJul 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.
|
|
ViggoSiteJul 23, 2020
13
@morethansean @错了(⊙_⊙;)…
|
|
14
String 是类,你可以 new String
"" 是 string,基本数据类型之一,不是 object 既然连 object 都不是,怎么可能 instanceof ? "" !== new String(""),因为数据类型不一样,一个是 string,一个是 object 。 顺便,@pabupa #7,你能把那一段复制完吗? 可以通过 new Object(),Object.create()方法,或者使用字面量标记**(初始化标记)**初始化对象。 **一个对象初始化器,由花括号 /大括号 ({}) 包含的一个由零个或多个对象属性名和其关联值组成的一个逗号分隔的列表构成**。 所以,只有 {} 出来的才是对象! |
|
hirasawayuiJul 23, 2020
15
new String(" are you ok? ") instanceof String // true
|
|
Q4h7388nR28s95faJul 23, 2020
16
[] == []
false |
|
pigmenJul 23, 2020
17
这个真不怪 js,是你用错了
|
|
watanukiJul 23, 2020
18
搜索 wtfjs 有惊喜
|
|
yujiffJul 23, 2020
19
我爱 V2,高人多且直接、热心!
|
|
mmnsghgnJul 23, 2020
20
new String(" ") instanceof String;
|
|
21
|
|
MutooJul 24, 2020
22
可以自己写一个 instanceOf 来判断: 原理是追踪对象的 __proto__ 链,能否找到目标的原型。
" ".__proto__ === String.prototype // true; |
|
MutooJul 24, 2020
23
|
|
lizz666Jul 24, 2020
24
你左边的是普通字面量,又不是字面量对象,你要分清楚,字面量对象是指直接 `{}` 这种形式的,`" "` 这种只是普通字面量
你可以看看这个: https://github.com/lizhongzhen11/lizz-blog/issues/75#instanceof (结合规范和 MDN 理解下) |
|
lizz666Jul 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 中相关内容
|
|
murmurJul 24, 2020
26
instanceof 我记得还有跨 iframe 的坑 ,所以判断 array 才会有那么复杂的写法
|
|
free9fwJul 24, 2020
27
String.prototype.constructor(" ") instanceof String 与 new String(" ") instanceof String
true 的区别 |
|
xingyucJul 24, 2020
28
标题党先打死 hhh
|
|
xiaoyu8740Jul 24, 2020
29
拜托 先好好学学基础
|
|
31
JS 就是设计上有问题,为什么楼上那么多人不愿意承认?
|
|
VegetableJul 24, 2020
32
这是不是弱类型造成的认知困难?
|
|
faceRollingKBJul 24, 2020
33
确实有这种问题,你需要使用 object wrapper 做一下装箱:Object(' ') instanceof String // true
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/Object |
|
VDimosJul 24, 2020 via Android
34
一般都多种方法判断的,我一般用 Object.prototype.toString 来判断
|
|
ares586Jul 24, 2020
35
每个语言都有不足。。JS 能兼容,不像 py2 -> py3 已经不错了
|
|
vivipureJul 24, 2020
36
new String(' ') instanceof String. // true
' ' instanceof String // false ' '.__proto__.contrucotr // undefined new String(' ').__proto__.constructor // String() ------------ 你直接声明的字符串是基本类型,不是通过实例生成的对象 所以 instanceof 没用 建议 Object.prototype.toString.call() 万能的 |
|
imnaiveJul 24, 2020
37
瑕不掩瑜,你就当是断臂维纳斯了。
|
|
Q4h7388nR28s95faJul 24, 2020
38
|
|
Q4h7388nR28s95faJul 24, 2020
39
|
|
MyouiSouthJul 24, 2020
40
js 设计上有问题和楼主使用错误不冲突啊,大家承认了 js 的设计问题楼主的" " instanceof String 也不会变成 true 呀,为啥纠正使用错误变成了不承认 js 的设计问题呢,我就算承认了我也没办法纠正 js 的设计问题啊,委屈哭了呜呜呜
|
|
41
@MyouiSouth 在这个问题上,JS 和楼主之间,我觉得 JS 是更应该被 blamed 的
|
|
RwingJul 24, 2020
42
当初 10 天设计出来的语言,你能指望他有多完备?这不慢慢在补么
|
|
AmiKaraJul 24, 2020
43
@joesonw js 的某些地方确实有问题,但是这个问题完全是楼主自己使用错误,js 里的基本数据类型和引用类型概念不一样,instanceof 查询的是元素原型链中的引用类型
|
|
LokiSharpJul 24, 2020
44
JS 太多地方是反常识和反直觉的
|
|
assadJul 24, 2020
45
宇宙变态语言,没啥的,总会让你惊不惊喜意不意外!
|
|
46
啊ニマビ,这니마비。
能不能起一个正常一点的标题? 能不能起一个正常一点的标题? 能不能起一个正常一点的标题? |
|
byzfJul 24, 2020
48
这都不算三位一体, string literal 不是 new string('').
你这顶多是吃屎心蛋糕, 来发帖问为什么蛋糕上没有奶油. |
|
zh1997Jul 24, 2020
49
#php
explode(分隔符, 源字符) str_replace(被替换字符, 替换字符, 源字符) strpos(源字符, 查找字符) 一直搞混,为什么不能把源字符统一放左边 |
|
chenalexJul 24, 2020
50
@vivipure
' '.__proto__.contrucotr // undefined contrucotr => constructor 所以 ' '.__proto__.constructor // String |
|
lovecyJul 24, 2020
51
啊这。。。懂得都懂!
不会真有人不知道吧?不会吧不会吧不会吧? 非杠非黑,无意冒犯,你在教 JavaScript 做事? |
|
cc77Jul 24, 2020
52
就这?
|
|
53
标题不能加上相关描述吗 ”js 空串 string 实例判断问题",很难?
|
|
camilloJul 24, 2020
54
主题标题
请在标题中描述内容要点。如果一件事情在标题的长度内就已经可以说清楚,那就没有必要写正文了。 |
|
TargaryenChenJul 24, 2020
55
@murmur 我也遇到过,因为每个 iframe 有他们自己的内部 Class,你在一个 window.top 中 var a = new Array(), 在 iframe 中 a instanceof Array === false
|
|
dbowJul 24, 2020
57
不要有误会, String 是个函数,不是个其它语言意义上的 type, instanceof 是判断 prototype 用的,不是判断类型的。
javascript 里没有常规的 type, 只有 object 。 let a = new String(""); a instanceof String 这样是成立的,表示 a 的 prototype 是 String 。 |
|
azh7138mJul 24, 2020
58
@ChanKc
> JS 就是设计上有问题,为什么楼上那么多人不愿意承认? JS 设计上的问题确实很多,但这与楼主不够了解 JS 并不冲突,是两回事 mdn 里面也举了这个例子,我觉得并没有什么问题 虽然不求每个人都能读一下标准,但是看看 mdn 总没啥门槛吧 |
|
CbdyJul 24, 2020 via Android
59
js 就是设计得比较糙,要设计严谨去看 java
|
|
ChanKcJul 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 |
|
AV1Jul 24, 2020
64
@ChanKc
当年被迫模仿 java 创造了 js,连糟粕也一起模仿来咯。明明有基本类型,还非要为面向对象而面向对象,搞什么乱七八糟的“包装类”。每次都得反反复复解释新人为什么 new 两个相同的 String 用==相比却得到 false 。现在看到 java 来写前端的,还偶尔看见在 js 里 new String 的,简直可笑。 |
|
robinlovemaggieJul 24, 2020
65
推荐看一下 Dan Abramov 的 justjavascript 课程,你需要一个重塑一下 mental model 来理解 JS
|
|
wiJul 25, 2020
67
不会写标题就不要发帖
|
|
rproudAug 3, 2020
69
Object instanceof Function
// true Function instanceof Object // true ![] == [] // true !new Boolean(false) // false 😈 |