为什么在这种情况下我无法修改“ this”?

时间:2020-04-13 20:52:49

标签: javascript this

在以下情况下,我假设可以将[{$sort: {"$_id": 1}, {$group: { _id: "$match._id", duplicateIds: {$push: "$_id"}, count: {$sum: 1} }}, {$match: { count: { $gt: 1 } }}, {$addFields: { deletableIds: { $slice: ["$duplicateIds", 1, 1000 ] } }}, {$out: 'DeleteableIds'}] (是一个字符串)的值修改为另一个字符串。这样,我可以模拟一个数组,只需编写this即可删除字符串的第一个字符。但是,根据我的收集,这是不可变的。我不确定如果无法修改字符串的值,该如何解决该问题。我当然可以返回结果,但是然后我不得不写string_var.shift(),它与同名数组函数的语法不同,最终会造成混淆。

string_var = string_var.shift()

3 个答案:

答案 0 :(得分:0)

您不能修改this,因为它是关键字,而不是变量。就像functionclass

您可以将该值分配给另一个变量: var self = this.substr(1) 代替

还要注意,this上下文是此时的内部函数。

答案 1 :(得分:0)

以下代码无法正常工作的原因有两个。 this不是变量,它是执行上下文(全局,函数或eval)的属性,在非严格模式下,该上下文始终是对对象的引用,在严格模式下可以是任何值。给它分配任何东西在语法上都是无效的。

但是更重要的是,不可能在String接口上实现一种突变方法,因为根据ECMAScript规范,字符串,布尔值和数字在Javscript中都是不可变的。当您“突变”某个值时(例如在上下文x += 5中),您将在幕后创建一个新值,而不修改原始值。

答案 2 :(得分:0)

好吧,您可以对它进行一些操作后返回值

String.prototype.shift = function() {
  return this.slice(1);
};

var a = "abcdef";
console.log(a);
a = a.shift();
console.log(a);

注意: 修改语言本身的原型被认为是不好的做法