JavaScript中是否有身份索引值?

Is there an identity index value in JavaScript?

在JavaScript中,对象和数组的值可以像下面这样被索引:objOrArray[index]。是否有身份“索引”值?

换句话说:

是否有一个 x 的值可以使以下内容始终为真?

let a = [1, 2, 3, 4];
/* Is this true? */ a[x] == a

let b = { a: 1, b: 2, c: 3 };
/* Is this true? */ b[x] == b

在此上下文中身份的定义:https://en.wikipedia.org/wiki/Identity_function

索引操作没有标识元素。索引的域和范围不一定相同——域是数组和对象,但范围是任何类型的对象,因为数组元素和对象属性可以容纳任何类型。如果你有一个整数数组,域是 Array,而范围是 Integer,所以不可能有一个身份。 a[x] 永远是一个整数,永远不会等于数组本身。

即使您有一个数组数组,也没有理由期望任何元素是对数组本身的引用。 可能 像这样创建自引用数组,但大多数情况下不会。即使是,自引用也可以在任何索引中,因此没有唯一标识值。

没有内置这样的东西,因为很少需要它(有时甚至不需要它)。0 尽管如此,还是可以滚动你的自己的“身份”密钥:

const self = Symbol('self');

Object.defineProperty(Object.prototype, self, {
    enumerable: false,
    get() { "use strict"; return this; }
});

这将适用于所有基元(除了 null 和未定义的)和大多数 JavaScript 对象:也就是说,除了代理或那些通过例如绕过通常原型链的对象。 Object.create(null)。原型链后面的任何对象也将能够禁用该功能,例如通过 { [self]: void 0 };所有这些注意事项意味着 x[self] === x 绝不是普遍法则。但这可能是你能做的最好的了。

修改 Object.prototype 通常被认为是一个坏主意,但上面的方法设法避免了它的大部分坏处:在符号键上添加 属性 (并使其显式不可枚举) ) 防止它意外出现在遍历原型链的迭代和查找中,有助于确保没有专门查找此 属性.

的代码不会受到影响

0 即使有这样的功能,对于the asker’s original use case: a ‘cut to 50 characters or take the whole string if shorter’ operation can be expressed as s.description.substring(0, s.description.length > 50 ? 50 : void 0) (or in fact just s.description.substring(0, 50)). It wouldn’t be any easier to express even with such a feature: depending on the condition, you still need to invoke the substring method, not just look it up, but not invoke the ‘self’ non-method. And given that you need to append an ellipsis at the end in the former case, you would still have to perform the condition check outside the substring call, making any shorthand rather ineffective. All that said, tricks like described in this answer do find some real use.

也不是一个好的解决方案