字符串不是对象,为什么它们有属性?

时间:2014-07-31 04:45:09

标签: javascript

这样的代码:

var str = "Hello StackOverflow !";
alert(typeof str);

给我string作为结果。这意味着字符串不是对象,那么为什么我们有str字符串str.substring的属性,str.indexOf etc.? 当我将属性设置为

str.property = "custom property is set";并尝试获取此alert(str.property),它会给我undefined。为什么呢?

5 个答案:

答案 0 :(得分:7)

像" Hello"不是JavaScript中的对象,但在

这样的表达式中使用时
"Hello".indexOf(2)

包装字符串String生成从构造函数"Hello"派生的新对象。并且indexOfString.prototype的属性,所以事情按预期工作,即使有很多魔法在继续。

在以下情况

> var s = "xyz"; s.prop = 1; console.log(s.prop);
undefined

您看到undefined的原因是:

  1. 变量s被赋予一个原始字符串
  2. 的值
  3. s.prop = 1中,名为prop的属性被分配给一个新的匿名包装器对象。
  4. 在上面的第三个参数中,创建了另一个新对象来包装原语s。这与第二个语句中的包装器对象不同,并且它没有prop属性,因此在根据基本JavaScript规则询问其值时会生成undefined

答案 1 :(得分:6)

字符串是对象吗?

这取决于您如何定义对象以及当您说 string 时您指的是什么。当您使用单词string时,您可以仅指基元,或wrapper object

什么是原语

在JavaScript中有5种原始类型:undefined,null,boolean,string和number。其他一切都是一个对象。

与对象不同,原语并不具备属性。它们作为价值存在。这解释了为什么不能将属性分配给字符串:

var archy = "hello";
archy.say = "hello";
console.log(archy.say); // undefined

但是有时候操纵一个原语会让人感觉好像他/他正在操纵一个对象,因为原语似乎有方法。

var archy = "hello";
console.log(archy.length); //5

这是因为当您尝试访问基元的任何属性时,JavaScript会创建wrapper object

什么是包装器对象

以下是Javascript: The Definitive Guide

的摘录
  

访问字符串属性时创建的临时对象,   number或boolean称为包装器对象,它可以   偶尔需要区分字符串值和字符串   对象或Number或Boolean对象中的数字或布尔值。   但是,通常,包装器对象可以被视为一种实现   细节,你不必考虑它们。你只需要知道   字符串,数字和布尔值与其中的对象不同   它们的属性是只读的,您无法定义新属性   他们的属性。

答案 2 :(得分:3)

字符串是纯对象:http://www.ecma-international.org/ecma-262/5.1/#sec-15.5

所以问题是,typeof运算符是什么。它只是根据其ECMA规范行事:

http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.3

答案 3 :(得分:2)

字符串实际上是一种特殊的对象。您无法向其添加属性,但您可以修改String.prototype,它是任何string变量的原型,并为其添加属性,如下所示:

String.prototype.foo = 1;
var a = 'hello';
console.log(a.foo); // logs 1

答案 4 :(得分:1)

JavaScript是一种原型基本语言,您可以为变量定义属性。字符串还具有预定义的属性和方法。

more information