3

对于各种 javascript 应用程序,我经常使用我编写的一个名为 isBlank() 的小函数:

isBlank = function(text) {
    while(text[0] == ' ') text = text.substr(1);
    return (text === '');
}

该函数所做的只是删除输入字符串开头的所有空格,然后如果结果为空或不为空,则返回 true 或 false。所以我试着把这个函数做成一个String原型,如下:

String.prototype.isBlank = function() {
    while(this[0] == ' ') this = this.substr(1);
    return (this === '');       
}

但是,当您尝试以下操作时,原型版本会给出“无效的左手赋值”错误:

"      ".isBlank();

ReferenceError: Invalid left-hand side in assignment

我想这个问题源于我在while循环中重新分配'this'对象的事实,但由于我仍在学习java脚本,我想知道是否有人能够更详细地解释为什么这个原型没有'不工作。我对这个问题的理论方面更感兴趣,而不是对如何将 isBlank() 函数变成一个字符串原型来做我想要的。

谢谢!

4

3 回答 3

3

您不能重新分配它。这就是错误所说的。

ECMAScript 规范

10.1.7 这个

每个活动的执行上下文都有一个 this 值。this 值取决于调用者和正在执行的代码类型,并在控制进入执行上下文时确定。与执行上下文关联的 this 值是不可变的。

另一个解释这个的链接

于 2012-10-02T17:09:18.527 回答
2

您永远不能分配给this关键字。如果要分配,则需要创建一个额外的变量,如下所示:

String.prototype.isBlank = function() {
    var text = this;
    while(text[0] == ' ') text = text.substr(1);
    return (text === '');       
}

顺便说一句:并非所有浏览器都支持通过括号表示法访问单个字符,您应该使用.charAt(). 此外,正则表达式有时会使生活更轻松:

String.prototype.isBlank = function() {
    return /^ *$/.test(this);
}
于 2012-10-02T17:09:53.960 回答
1
String.prototype.isBlank = function() {
    return (this.trim() === '');       
}
于 2012-10-02T17:11:27.000 回答