字符串不是对象,那么为什么它们有属性
Strings are not object then why do they have properties?
如下代码:
var str = "Hello StackOverflow !";
alert(typeof str);
给出string
作为结果。这意味着字符串不是对象,那么为什么我们有字符串str
的属性,如str.substring
, str.indexOf etc.?
当我将属性设置为
str.property = "custom property is set";
并试图得到这个alert(str.property)
,它给了我undefined
。为什么?
像"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
。string是对象吗?
这取决于您如何定义对象以及当您说字符串时所指的是什么。当您使用单词string时,您可以只引用原语或包装器对象。
什么是原语?
在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会创建一个包装器对象。
什么是包装器对象?
Javascript: The Definitive Guide
访问字符串的属性时创建的临时对象,数字或布尔值被称为包装器对象,它可以有时需要区分字符串值和字符串对象或来自数字或布尔对象的数字或布尔值。但是,包装器对象通常可以被视为一种实现细节,你不需要考虑它们。你只需要知道该字符串、数字和布尔值与对象的不同之处在于它们的属性是只读的,不能定义new
字符串是纯对象: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
字符串实际上是一种特殊的对象。您不能给它们添加属性,但是您可以修改String.prototype
,它是任何string
变量的原型,并为其添加属性,如下所示:
String.prototype.foo = 1;
var a = 'hello';
console.log(a.foo); // logs 1
JavaScript是一种原型基础语言,您可以为变量定义属性。字符串也有预定义的属性和方法可以使用。
更多信息
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- Javascript:为什么是构造函数's __proto__属性Empty(){}
- 为什么可以't我在JavaScript中获取导航器对象的属性计数
- 为什么样式属性不适用于使用DOMParser创建的元素
- 为什么我可以'不要使用xx[this.index].style.display?它's说“;无法读取属性
- 为什么toStaticHTML删除data-*属性
- 类型错误:无法读取未定义的属性“toString” - 为什么
- 为什么没有从数组中存在的对象中删除属性
- 为什么可以't我得到特定跨度的ID属性
- 为什么可以'我们在函数体中为函数对象添加属性,就像在javascript中为对象文字添加属性一样
- JQuery `length`属性工作不正常.为什么?
- 为什么html src属性中的相对url是因为Javascript函数中的完整路径
- 为什么属性存在于对象实例上,即使其原型发生了更改
- 为什么我得到“;无法获取属性的值'SetReturnValue'"当使用ceebox显示YouT
- 为什么属性选择器不适用于jQuery
- 为什么属性返回未定义而不是对象
- 为什么“this”不等于“Object”,为什么属性是“undefined”
- 聚合物生命周期:为什么属性尚未从'附件'回调
- 为什么属性'naturalWidth'并不总是在JS中的背景图像上返回
- 为什么属性初始化为null的对象数组处理得更好