【问题标题】:Is String an instance of the object String()? [duplicate]String 是对象 String() 的实例吗? [复制]
【发布时间】:2013-11-12 22:16:56
【问题描述】:

我目前正在学习 javascript,有些东西我不明白。

//This means that I am using a method from the String.prototype
"ThisIsMyString".length

所以,如果我使用 ("ThisIsMyString" instanceof String) 应该返回 true,不是吗?但结果返回 false.. 我相信那是因为原始类型。

这是我的问题:如果“ThisIsMyString”不是字符串的实例,它如何访问该对象的属性?谜题中我不知道的部分是什么?

【问题讨论】:

  • 小心术语:Javascript 没有“原始类型”,但它有“文字”(与大多数语言一样)。但是,它们不被视为单独的类型,而是不真正适合 OO 模型的语言结构。
  • @JohannesH。不完全...§4.3.2 primitive value
  • @JonathanLonowski:哦。好的,那么 ;) 我不得不承认,我从未阅读过规范,但大多数参考文献只使用术语文字,这就是为什么我觉得它是这里使用的唯一术语。虽然没有太大的区别^^
  • @JohannesH。是的。 "Literals" 只是指所涉及的语法 (§7.8),大多数会在运行时创建原始值。

标签: javascript


【解决方案1】:

String.length 不是

来自 String.prototype 的方法

length 是字符串的属性

See the MDN docs for String.length


不过,要回答您的问题,"hello" instanceof String 返回 false 的原因在于 instanceof 的实际工作原理

Object.getPrototypeOf("hello")
// TypeError: Object.getPrototypeOf called on non-object

但是,这就是您的字符串文字访问这些方法/属性的方式

"my string".constructor === String
// true

"my string".__proto__ === String.prototype
// true

如果您想要String 的实际实例

var str = new String("hello");
str instanceof String
// true

【讨论】:

  • "my string".constructor === String"my string".__proto__ === String.prototype 的事实不是答案,而是相同行为的一部分。原因是点运算符,它将字符串文字临时转换为字符串对象以执行所需的操作。
【解决方案2】:

您可以使用这些方法,因为该语言可以识别原始类型并将其转换为 String 对象的临时实例,并返回该对象的 length 属性。

【讨论】:

  • 以防万一您注意到:否决了您的初始响应,因为它不是真的。现在好多了;)
  • @JohannesH。哈哈不用担心!在我纠正我的愚蠢之前,你完全没有权利投票给我。
【解决方案3】:

取自http://oreilly.com/javascript/excerpts/learning-javascript/javascript-datatypes-variables.html: "JavaScript 将字符串原语隐式包装在 String 对象中,处理 String 对象的属性或方法调用,然后丢弃该对象"

进一步阅读了解详情。

【讨论】:

    猜你喜欢
    • 2012-07-01
    • 2011-03-24
    • 2017-09-23
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多