当前位置: 首页 > 面试题库 >

为什么不能在javascript中将属性添加到字符串对象?

傅和璧
2023-03-14
问题内容

我继承了其他开发人员编写的一些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

(a) 如果的值属于 UndefinedNullfoo类型,则将引发错误, ____

(b) 如果的值属于 Objectfoo类型,则将在对象上定义一个命名属性(如果需要),并将其值设置为,
__'bar'``foo``'abc'

(c) 如果的值fooNumberStringBoolean
类型,则该变量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函数。

但是,我认为向内置原型添加访问器属性不是一个好习惯。



 类似资料:
  • 为什么在这里就能看到添加的属性?

  • 问题内容: (用Python shell编写) 为什么不允许对象向其添加属性? 问题答案: 请注意,实例没有属性: 一个在派生类中说明此行为的示例: 引用以下文档: […]声明采用一系列实例变量,并在每个实例中仅保留足够的空间来为每个变量保存一个值。因为未为每个实例创建空间,所以节省了空间。 编辑:要从评论中回答ThomasH,OP的测试类是“旧式”类。尝试: 您会注意到有一个实例。对象类可能没有

  • 错误: 代码: 自<代码>列表

  • 问题内容: 因此,我想在字符串中添加一个字符,在某些情况下,我想将该字符加倍,然后将其添加到字符串中(即先添加到字符串本身)。我尝试如下所示。 这引发了一个错误,但是我已经在字符串中添加了一个字符,所以我尝试了: 哪个有效。为什么在求和中包含字符串会导致它起作用?是否添加了一个字符串属性,该字符串属性由于存在字符串而只能在字符转换为字符串时才能使用? 问题答案: 这是因为String + Char

  • 问题内容: 我有以下代码: 这段代码: 根据我的Python知识,我会说它覆盖/ ,但是我不确定。你能在这里阐明一下吗? 编辑:我对并不特别感兴趣。我一直在想对象。 问题答案: 我的猜测是,datetime的实现使用slots以获得更好的性能。 使用时,解释器仅为列出的属性保留存储空间,而没有其他内容。这样可以提供更好的性能并使用更少的存储空间,但这也意味着您不能随意添加新属性。 在此处阅读更多信

  • 我正试图通过对象运行字符串列表。当我单独做的时候,它会工作,但是当我把它作为一个字符串传递时,它就不工作了。我该如何解决这个问题? 是什么导致第一个示例不起作用?变量数据是否将其视为faq。“IntegrationItem1”而不是faq.IntegrationItem1?