这样的代码:
var str = "Hello StackOverflow !";
alert(typeof str);
给我string
作为结果。这意味着字符串不是对象,那么为什么我们有str
字符串str.substring
的属性,str.indexOf etc.?
当我将属性设置为
str.property = "custom property is set";
并尝试获取此alert(str.property)
,它会给我undefined
。为什么呢?
答案 0 :(得分:7)
像" Hello"不是JavaScript中的对象,但在
这样的表达式中使用时"Hello".indexOf(2)
包装字符串String
生成从构造函数"Hello"
派生的新对象。并且indexOf
是String.prototype
的属性,所以事情按预期工作,即使有很多魔法在继续。
在以下情况
> var s = "xyz"; s.prop = 1; console.log(s.prop);
undefined
您看到undefined
的原因是:
s
被赋予一个原始字符串s.prop = 1
中,名为prop
的属性被分配给一个新的匿名包装器对象。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规范行事:
答案 3 :(得分:2)
字符串实际上是一种特殊的对象。您无法向其添加属性,但您可以修改String.prototype
,它是任何string
变量的原型,并为其添加属性,如下所示:
String.prototype.foo = 1;
var a = 'hello';
console.log(a.foo); // logs 1
答案 4 :(得分:1)
JavaScript是一种原型基本语言,您可以为变量定义属性。字符串还具有预定义的属性和方法。