为什么我无法向字符串基元添加属性?

2024-04-06

我继承了其他开发人员编写的一些 JavaScript 代码。他不喜欢我们在整个项目中使用的网格组件,因此他决定编写自己的网格组件。他编写的网格无法对日期进行排序,因为它只能绑定到字符串/数字。他在使用之前将所有日期转换为字符串。我查看了他编写的日期函​​数的字符串格式,并认为我可以使用原始值向字符串添加日期属性,然后在排序时查看字符串是否具有日期属性并基于该属性进行排序。但是,您似乎无法在 JavaScript 中向字符串添加属性。我不知道某些类型无法添加属性。例如:

var test = "test";
test.test = "test inner";
console.log(test);
console.log(test.test);

test.testundefined. Weird.

我的问题是为什么这段代码不起作用?而且,如果您能想到在该网格上对日期进行排序的任何解决方法(除了实际绑定到日期对象而不是字符串,这将是一个很难修复的问题),那将非常有帮助。


JavaScript中有8种语言类型:

  • 7 种原始类型:不明确的, Null, Boolean, Number, BigInt, String, and Symbol
  • 1 非原始类型:Object

原始类型的值称为原始值,它们不能具有属性。
的价值观Object非原始类型称为对象,它们可以具有属性。

当您尝试分配名为的属性时'bar'到一个变量foo,像这样:

foo.bar = 'abc';

那么结果将取决于值的类型foo:

(a)如果值foo属于类型不明确的 or Null,那么就会抛出错误,

(b)如果值foo属于类型Object,然后是一个命名属性'bar'将在对象上定义foo(如果需要),其值将设置为'abc',

(c)如果值foo是任何其他类型,那么TypeError将在严格模式下抛出:“无法分配给财产"bar" on foo:不是一个物体”。在松散模式下,上面的赋值操作将是no op http://en.wikipedia.org/wiki/NOP。无论哪种情况,变量foo不会以任何方式改变。

因此,正如您所看到的,只有当变量是对象时,为变量分配属性才有意义。如果情况并非如此,那么赋值要么根本不执行任何操作,甚至抛出错误。


在你的情况下,变量test包含类型的值String, 所以这:

test.test = "test inner";

什么也不做。


然而,由于 ES5 引入了访问器属性,所以我上面所说的有一个例外。访问器属性允许我们定义每当检索或设置属性时调用的函数。

例如:

var str = '';
str.prop;

Here str是一个变量,持有String价值。因此,访问该变量的属性应该是无操作(str.prop仅仅返回undefined)。这是正确的,但有一个例外:如果String.prototype包含访问器属性'prop'如果有定义的 getter,那么该 getter 将被调用。

所以,如果这样定义:

Object.defineProperty( String.prototype, 'prop', {
    get: function () {
        // this function is the getter
    }
}); 

那么这个

str.prop;

将调用该 getter 函数。这也适用于严格模式。

现场演示: http://jsfiddle.net/fmNgu/ http://jsfiddle.net/fmNgu/

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我无法向字符串基元添加属性? 的相关文章

  • Redux 状态在 mapStateToProps 中未定义

    我目前正在关注this http teropa info blog 2015 09 10 full stack redux tutorial html教程 我遇到了一些障碍mapStateToProps在下面的代码中 import Reac
  • 是否可以禁用特定 jQuery Ajax 调用的 Turbolinks 以防止页面刷新和滚动?

    我有一个 Rails 5 应用程序 非常想使用 Turbolinks 在应用程序中 有几个 PATCH ajax 调用 它们只是用新数据更新服务器 但不需要担心更新页面的状态 每当这些 ajax 请求返回时 Turbolinks 就会刷新页
  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使
  • jQuery 中的 Javascript .files[0] 属性

    jQuery 中是否有与此语句等效的语句 var value document getElementById id files 0 使用附加 files 0 的标准 jQuery 选择器似乎不起作用 并且我找不到与 files 等效的 jQ
  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 如何向 jQuery Tokeninput 添加占位符?

    如何将占位符添加到 jQuery Tokeninput 字段 一个正常的placeholder属性在这里不起作用 对于这样的输入
  • 如何将中间件绑定到socket.io中的事件

    现在您可以将中间件绑定到io use middleware 但这仅在建立套接字连接时触发 有没有办法在将其传递给事件句柄之前拦截它 就像在expressjs中一样 换句话说 In 快递 js你可以做 app get middleware1
  • 为什么 jQuery 点击事件会多次触发

    我这里有这个示例代码http jsfiddle net DBBUL 10 http jsfiddle net DBBUL 10 document ready function creategene click function confir
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • 禁用 JavaScript 中的右键单击

    当我尝试禁用右键单击时 它不起作用 我尝试使用下面的代码 document onclick function e console log e button if e button 2 e preventDefault return fals
  • 响应式网格布局框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JavaScript 动画平滑滚动

    默认情况下 当您有这样的片段链接时 a href some url some fragment some text a 浏览器立即向下滚动到该片段 我该如何编程才能使用标准 JS 顺利地向下移动到该片段 这是一个例子 Example htt
  • Aptana Studio 3 上的预览选项卡在哪里?

    我在 Windows PC 上使用 Aptana Studio 2 并有一个选项卡用于在 IE 上预览页面 另一个选项卡用于在 Firefox 上预览 但我切换到了 Aptana 3 我不知道是没有预览还是我没有找到它 是的 我在 stac
  • AJAX:检查字符串是否为 JSON?

    我的 JavaScript 有时会在这一行崩溃 var json eval this responseText 当争论时会导致崩溃eval 不是 JSON 在进行此调用之前有什么方法可以检查字符串是否为 JSON 我不想使用框架 有什么方法
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • Keycloak javascript 适配器 `keycloak.init` 加载 404 iframe

    我正在尝试使用 javascript 适配器将 Keycloak 集成到我的客户端应用程序keycloak js 但是 我似乎无法让它发挥作用 这是我的代码 const keycloak new Keycloak realm my real
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • ES6 模板文字的延迟执行

    我正在玩新的ES6 模板文字 http tc39wiki calculist org es6 template strings 我首先想到的是String format对于 JavaScript 所以我开始实现一个原型 String pro
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e

随机推荐