技术解析

啊?这……
0
2021-08-16 21:20:25
idczone
"    " instanceof String; // False !!!!!!!!!!!!!!

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


不能。
爱用不用,不用就滚~~~~~

暴躁老哥。。

Js 三元一体.jpg

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

RTFM instanceof 只校验对象

?????????



https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Object_initializer
"可以通过 new Object(),Object.create()方法,或者******使用字面量标记(初始化标记)初始化对象******。"

typeof 不香吗~~

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

我没理解,这有什么问题?
前者是模版字符,后者是对象。当然不是一个东西。
python 和 ruby 是一个类那就是 True,js 不是一个类那就不是 true 。你想比较的话用 new String()好了。

你引用的这篇文章里不是写了嘛, ```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.

那....有啥问题吗?
typeof " " == "string"

@错了(⊙_⊙;)…

String 是类,你可以 new String
"" 是 string,基本数据类型之一,不是 object
既然连 object 都不是,怎么可能 instanceof ?
"" !== new String(""),因为数据类型不一样,一个是 string,一个是 object 。
顺便,@pabupa />可以通过 new Object(),Object.create()方法,或者使用字面量标记**(初始化标记)**初始化对象。 **一个对象初始化器,由花括号 /大括号 ({}) 包含的一个由零个或多个对象属性名和其关联值组成的一个逗号分隔的列表构成**。
所以,只有 {} 出来的才是对象!

new String(" are you ok? ") instanceof String // true

[] == []
false

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

搜索 wtfjs 有惊喜

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

new String(" ") instanceof String;

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

可以自己写一个 instanceOf 来判断: 原理是追踪对象的 __proto__ 链,能否找到目标的原型。
" ".__proto__ === String.prototype // true;

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

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

另外关于 instanceof 设计历史,你可以看 https://github.com/doodlewind/js-20-years-cn/blob/master/part-2.md中相关内容

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

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

标题党先打死 hhh

拜托 先好好学学基础

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

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

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

确实有这种问题,你需要使用 object wrapper 做一下装箱:Object(' ') instanceof String // true
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/Object

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

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

new String(' ') instanceof String. // true
' ' instanceof String // false
' '.__proto__.contrucotr // undefined
new String(' ').__proto__.constructor // String()
------------
你直接声明的字符串是基本类型,不是通过实例生成的对象 所以 instanceof 没用
建议 Object.prototype.toString.call() 万能的

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

你没眼花吧?
第一个是[]
第二个也是[]
自己复制了去浏览器执行看看。


php:
var_dump([] == []);
true
python:
[] == []
true
你都去试试!

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

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

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

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

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

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

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

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

这都不算三位一体, string literal 不是 new string('').
你这顶多是吃屎心蛋糕, 来发帖问为什么蛋糕上没有奶油.


explode(分隔符, 源字符)
str_replace(被替换字符, 替换字符, 源字符)
strpos(源字符, 查找字符)
一直搞混,为什么不能把源字符统一放左边


' '.__proto__.contrucotr // undefined
contrucotr => constructor
所以 ' '.__proto__.constructor // String

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

就这?

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

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

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

不怕被站长 Deactivate 么……

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


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

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

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

啊,我知道基本数据类型什么的。但我觉得 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

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

“但我想……”


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

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

不是瑕不掩瑜,是瑜不掩瑕。

不会写标题就不要发帖

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

Object instanceof Function
// true
Function instanceof Object
// true
![] == []
// true
!new Boolean(false)
// false
数据地带为您的网站提供全球顶级IDC资源