为什么不能在javascript中将属性添加到字符串对象?
我继承了其他开发人员编写的一些JavaScript代码。他不喜欢我们在整个项目中使用的网格组件,因此他决定编写自己的网格组件。他写的表格无法对日期进行排序,因为它只能绑定到字符串/数字。他在使用日期之前将所有日期转换为字符串。我查看了他编写的date函数的字符串格式,发现可以将具有原始值的date属性添加到字符串中,然后在排序时查看该字符串是否具有date属性并基于此进行排序。但是,似乎无法将属性添加到javascript中的字符串。我不知道您无法向其中添加属性的某些类型。例如:
<html><script>
var test = "test";
test.test = "test inner";
console.log(test);
console.log(test.test);
</script>
test.test将是不确定的。奇怪的。我的问题是为什么此代码不起作用?而且,如果您能想到在该网格上对日期进行排序的任何变通方法(除了实际上绑定到日期对象而不是字符串,这很麻烦解决),这将非常有用。
回答:
JavaScript有6种语言类型:
- 5种原始类型: 字符串 , 数字 , 布尔值 , 空值 , 未定义
- 1个非基本类型: 对象
基本类型的值称为基本值,并且它们不能具有属性。
所述的值 对象 非原始型被称为对象的它们可具有的特性。
当您尝试将名为的属性分配给'bar'
变量时foo
,如下所示:
foo.bar = 'abc';
那么结果将取决于以下值的类型foo
:
如果的值属于 Undefined 或 Nullfoo
类型,则将引发错误, ____
如果的值属于 Objectfoo
类型,则将在对象上定义一个命名属性(如果需要),并将其值设置为,
__'bar'``foo``'abc'
如果的值foo
是 Number , String 或 Boolean
类型,则该变量foo
将不会以任何方式更改。在这种情况下,上述分配操作将为noop。
因此,如您所见,仅在变量是对象的情况下,才将属性分配给变量。如果不是这种情况,则分配将根本不执行任何操作,甚至抛出错误。
在您的情况下,该变量test
包含 String 类型的值,因此:
test.test = "test inner";
什么也没做。
但是,由于ES5引入了访问器属性,所以我上面已经说过了。访问器属性使我们可以定义在检索或设置属性时将调用的函数。
例如:
var str = '';str.prop;
这str
是一个保存 字符串值的变量。因此,访问该变量的属性应该是no-op(str.prop
仅返回undefined
)。唯一的例外是这样:如果String.prototype
包含'prop'
具有定义的getter的accessor属性,则将调用该getter。
因此,如果已定义:
Object.defineProperty( String.prototype, 'prop', { get: function () {
// this function is the getter
}
});
然后这个
str.prop;
将调用该getter函数。
但是,我认为向内置原型添加访问器属性不是一个好习惯。
以上是 为什么不能在javascript中将属性添加到字符串对象? 的全部内容, 来源链接: utcz.com/qa/414221.html