JS 的一个设计上的bug(疑似)

发布于 2022-09-04 14:31:12 字数 550 浏览 12 评论 0

今天测试一段代码的时候发现:


var str1 = 'hello world'
console.log(str1 instanceof String)  //  输出false
console.log(str1.__proto__ === String.prototype) // 输出true

对于这个结果感到很奇怪, 我以为是我对instanceof理解错了。 后来上MDN查了一下。 看了一下发现自己没有记错。 原文是这样的:

The instanceof operator tests whether an object has in its prototype chain the prototype property of a constructor.

我想问的是, 为什么这两个结果不同呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

凉月流沐 2022-09-11 14:31:12

var str1 = "string"并不是一个String的一个instance,是一种primitive data type,而且它本身没有任何method,只不过你调用任何String的method的时候,会有一个auto-boxing的过程。详情可以看stckoverflow的这个解答。

余生一个溪 2022-09-11 14:31:12
var str1 = new String('hello world');
console.log(str1 instanceof String);
// true

补充:
主要是字符串字面量字符串对象的区别。题主你再研究下,如果还是不明白,我找一下分析的文章给你。

补充2:

什么时候使用包装对象 https://github.com/TooBug/javascript.patterns/blob/master/chapter3.markdown#原始值的包装对象JavaScript instanceof 运算符深入剖析

听闻余生 2022-09-11 14:31:12

当 String() 和运算符 new 一起作为构造函数使用时,它返回一个新创建的 String 对象,存放的是字符串 s 或 s 的字符串表示。
当不用 new 运算符调用 String() 时,它只把 s 转换成原始的字符串,并返回转换后的值。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文