【问题标题】:Invalid left-hand side expression左侧表达式无效
【发布时间】:2016-10-14 03:19:04
【问题描述】:

我试图弄清楚为什么我编写的底部函数不能正常工作。每当我尝试对其进行测试时,都会收到以下错误:未捕获的 ReferenceError:后缀操作中的左侧表达式无效。我假设这是因为代码无法识别“x”字符串与变量 x 相同,一旦它在添加到 x 的值时被去掉引号。有人可以帮我解决这个问题吗?如果没有,你能建议一些替代方法吗?提前致谢!

var grid = [[null, null, null],
				[null, null, null],
				[null, null, null]];

	function checkWin() {

		vals = ["x", "o"];

		var x = 0;
		var o = 0;

		for (var k = 0; k < vals.length; k++) {

			var value = vals[k];

        	for (var i = 0; i < 3; i++) {

            	if (grid[i][i] === value) {

            		(value.replace(/['"]+/g, '')) ++;

            	}

            	if (grid[2 - i][i] === value) {

            		(value.replace(/['"]+/g, '')) ++;

            	}

            	for (var j = 0; j < 3; j++) {

                	if (grid[i][j] === value) {

                		(value.replace(/['"]+/g, '')) ++;

                	}

                	if (grid[j][i] === value) {

                		(value.replace(/['"]+/g, '')) ++;

                	}
            	}
        	}
    	}

    	if (x === 3) {
    		alert("X wins!");
    	} else if (o === 3) {
    		alert("O wins!");
    	}
    }

【问题讨论】:

  • 在表达式(value.replace(/['"]+/g, '')) ++;中,replace之后会返回一个字符串。并且字符串不能递增/递减。
  • 使用 parseInt() 而不是删除引号。
  • 嘿 Tushar,我实际上正在深入研究这个问题,看看您是否正确。我的印象是 replace(/['"]+/g, '') 会去掉引号。@mseifert 我试过 parseInt() 但我得到的只是 NaN。根据 MDN,parseInt() 的返回值是“从给定字符串解析的整数。如果第一个字符无法转换为数字,则返回 NaN。”无论如何,谢谢!
  • 请从您的代码中删除多余的空行。
  • @Tushar 其实并不是说字符串不能自增;就是表达式不能自增。

标签: javascript referenceerror


【解决方案1】:

以下使用对象。测试了不同的网格定义

var grid = [
    ["o", "x", "x"],
    ["o", "x", "x"],
    ["o", "", "o"]];

var grid = [
    ["o", "x", ""],
    ["x", "x", "x"],
    ["o", "o", ""]];

var grid = [
    ["x", "x", ""],
    ["o", "x", "o"],
    ["o", "o", "x"]];

var grid = [
    ["x", "x", "o"],
    ["x", "o", "x"],
    ["o", "x", "x"]];

checkWin(grid)      

function checkWin(grid) {

var vals = [{player: "x", value: 0}, {player: "o", value: 0}];

for (var k = 0; k < vals.length; k++) {
    for (var i = 0; i < 3; i++) {
        // check win by row
        vals[k].value = 0;
        // check win by col
        for (var j = 0; j < 3; j++) {
            if (grid[i][j] === vals[k].player) {
                vals[k].value++;
            }
        }
        if (vals[k].value === 3) {
            alert(vals[k].player + " wins by row " + (i+1));
            return vals[k].player;
        }
        // check win by col
        vals[k].value = 0;
        for (var j = 0; j < 3; j++) {
            // check col
            if (grid[j][i] === vals[k].player) {
                vals[k].value++;
                if (vals[k].value === 3) {
                    // break if you want to know what column won by
                    break;
                }
            }
        }
        if (vals[k].value === 3) {
            alert(vals[k].player + " wins by col " + (i+1));
            return vals[k].player;
        }
    }
}
// check win by diag l to r
for (var k = 0; k < vals.length; k++) {
    vals[k].value = 0;
    for (var i = 0; i < 3; i++) {
        if (grid[i][i] === vals[k].player) {
            vals[k].value++;
        }
    }
    if (vals[k].value === 3) {
        alert(vals[k].player + " wins by diag left to right!");
        return vals[k].player;
    }
}   
// check win by diag r to l
for (var k = 0; k < vals.length; k++) {
    vals[k].value = 0;
    for (var i = 0; i < 3; i++) {
        if (grid[i][2-i] === vals[k].player) {
            vals[k].value++;
        }
    }
    if (vals[k].value === 3) {
        alert(vals[k].player + " wins by diag right to left!");
        return vals[k].player;
        }
    }   
}

【讨论】:

  • 我清理了一些小东西 - 例如。删除 xy 变量,将 vals[x] 的 1 个引用更改为 vals[k],修复 {player: "x", value: 0} 中的对象值,以及另一个修复。
【解决方案2】:

如何将您的数据放在这样的对象中:

var _ = {
    x : 0,
    o : 0
};

并像这样更改值:

_[value]++;

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    相关资源
    最近更新 更多