【问题标题】:JavaScript object meaningJavaScript 对象含义
【发布时间】:2015-07-31 00:52:41
【问题描述】:

我目前正在编写一些 JavaScript,但在试图向自己解释一件事时遇到了一些麻烦。

如果我这样做:

var text = new String("Enter any value here"); 

我们都同意“文本”是一个对象,对吧?

但是那应该叫什么“字符串”呢?因为我到处都看到 String 也是一个对象,但是将它称为 PhP 中的类不是更简单。

还有其他名称,比 String 的对象更精确吗?

如果有人可以向我解释其中的微妙之处,我会很高兴。谢谢!

【问题讨论】:

  • 但是一个类也是一个对象,一切(除了原始数字,可以说)都是一个对象! (-插入疯狂科学家脸)
  • 是的,但我的意思是,在这种情况下,对象有不同的“级别”。为什么没有人通过在 JavaScript 中用不同的名称区分这些级别来更清楚地说明这一点?这对我来说很荒谬。
  • 因为类在 JS 中并不真正存在。当然,您可以模仿它们,但这并不能使它们变得真实。当您创建一个 String 类型的对象时,这就是您最终的结果。无论如何,您确实不需要对字符串、数字等使用 new 关键字。只需执行var text = 'hello'var number = 1337。更多内容:stackoverflow.com/questions/5224295/… 这也涵盖了很多关于 JS 中的类的误解
  • 因为现在 javascript 中有类,只有对象。您正在创建一个对象的新实例
  • 是的,我知道所有这些,但我只是想知道是否有更准确的词可以将其称为基本对象或其他什么。因为从一个对象(例如字符串)创建不同的对象对我来说确实缺乏清晰度和简单性。是的,我知道在这种情况下使用原始值更好,但我只想向某人清楚地解释 JavaScript 对象,然后我想尽可能使用更具体和更清晰的词。

标签: javascript string object


【解决方案1】:

我认为您的困惑的根源是不熟悉原型继承模型。我想你很熟悉“经典模型”,其中类是使用类作为蓝图构建的。另一方面,在 JavaScript 中,其他对象是使用 Object 作为原型或使用空对象然后在其中固定新属性来创建的。

如果您尝试记录typeof(String),您将得到function 的输出。在这里,当我们执行new String('hello, world') 时,我们会得到一个新的字符串对象Hello, World。因此 String 在 JavaScript 中是 constructor

【讨论】:

【解决方案2】:

按照设计,JavaScript(ECMAScript 标准的实现)没有类。所以String 永远不能被称为一个类。

String 这里只是一个对象,就像 JavaScript 中的几乎所有东西一样(正如一些答案已经说明的那样)。

console.log(String instanceof Object); // true

其实是一个特殊的对象:一个函数

console.log(typeof String); // "function"
console.log(String instanceof Function); // true

甚至还有一个特殊的函数:应该作为构造函数调用的函数,因此大写“S”。

更特殊的功能:它是一个内置功能(它“存在于语言中”,因此由宿主环境提供 - 例如浏览器或节点)。

这个特殊的函数允许你实例化一个字符串类型的对象:

var aString = new String("A string");

但这是错误的做法:你应该这样写:

var aPrimitiveString = "A string";

顺便说一句,有趣的是,text 不是字符串(对象),而是字符串(原始)。

console.log(typeof(aString)); // "object"
console.log(aString instanceof String); // true
console.log(aString instanceof Object); // true

console.log(typeof(aPrimitiveString)); // "string"
console.log(aPrimitiveString instanceof String); // false
console.log(aPrimitiveString instanceof Object); // false

即使在 ECMAScript 6(AKA ES6、AKA Harmony、AKA ES2016)中,你也不会接受任何类,ES6 中的“类”仍然是一个函数类型的对象,带有 原型继承。

还有一件事:字符串也可以用来显式地将一个值强制转换为字符串原语:

var number = 1;

var numberAsString = String(1);

console.log(number); // 1
console.log(numberAsString); // "1"
console.log(typeof number); // "number"
console.log(typeof numberAsString); "string"

为了完整起见,我希望你猜到了:

  • number 是一个原始数字
  • numberAsString 是原始字符串
  • new number(1) 将是一个对象,NumberObject 的实例
  • Number('0') 将是一个原始数字
  • 布尔值也是如此

JavaScript 中没有类,永远也不会有(反正我什么都不想要),这就是使语言如此灵活、富有表现力和强大的原因。

也许您想看看这个:http://javascript.crockford.com/inheritance.html(以及 Douglas Crockford 的整个网站和作品)。

【讨论】:

    【解决方案3】:

    JavaScript 是一种没有类的面向对象语言。

    但是,您可以在 JavaScript 中应用许多面向对象的范例。它有自己的机制来做到这一点。

    在 JavaScript 中,您使用对象而不是类。这已经是真的了。如果需要,您可以将String 视为一个类,但有时它会导致混淆,因为很容易将 Java 或 C++ 中已知的概念与 JavaScript 混淆。只是实现方式不同。

    我建议您不要将其视为一个类,而将其称为对象。并且尽量不要使用其他语言的术语,例如 PHP 和 JavaScript。


    现在,混淆可能在于,在其他 OO 语言中,您定义一个类,然后从该类创建实例,我们将其称为对象。

    在 JavaScript 中,您只需创建另一个对象的新副本

    请参考此link 和...

    ...请注意,JavaScript 区分 String 对象和 原始字符串值。 (布尔值和数字也是如此。)

    【讨论】:

      【解决方案4】:

      根据w3schools

      在 JavaScript 中,几乎“一切”都是一个对象。

      1. 布尔值可以是对象(或被视为对象的原始数据)
      2. 数字可以是对象(或被视为对象的原始数据)
      3. 字符串可以是对象(或被视为对象的原始数据)
      4. 日期总是对象
      5. 数学总是对象
      6. 正则表达式始终是对象
      7. 数组总是对象
      8. 函数始终是对象
      9. 对象就是对象

      在 JavaScript 中,除原始值外,所有值都是对象。

      原始值是:字符串(“John Doe”)、数字(3.14)、true、 false、null 和未定义。


      MDN 在 javascript 中说一切都是对象。

      在 JavaScript 中,几乎所有东西都是对象。所有原始类型 除了 null 和 undefined 被视为对象。他们可以被分配 属性(某些类型的分配属性不是持久的),以及 它们具有物体的所有特征。

      创建新对象

      JavaScript 有许多预定义的对象。此外,您可以 创建自己的对象。您可以使用对象创建对象 初始化器。或者,您可以先创建一个构造函数 函数,然后使用该函数和 新运算符。


      所以在 javascript 中,class 的概念并不像在其他语言中那样真正存在。如果您愿意,它只是一个实例化的对象或函数。

      typeof 1.00 // number
      typeof 1 //number
      typeof "string" //string
      typeof String("string") //string
      typeof new String("string") //object
      typeof {} //object
      typeof [] //object
      

      Demo


      好像可以create classes in ECMAScript 6

      据说:

      定义类

      类实际上是函数,就像你可以定义函数一样 表达式和函数声明,类语法有两种 对手:

      类表达式和类声明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 2019-03-31
        • 2013-08-27
        相关资源
        最近更新 更多