Tic-Tac-Toe command line
This code was very well organized and was extremely easy to follow along.



Looks to me that board is just a 1-based array.

It would be easier (and it makes more sense) to use an array, instead of an object.

But don't change how you are asking the user for input. You want to translate the user input one number back, so if the user enters "1" for box number 1, just subtract 1 from the integer version of the input and then pass it to markBoard.

if (validateMove(result.position) === true) {
    markBoard(result.position - 1, player);
    printBoard();




In your markBoard function, there is no point in calling .toUpperCase as the player variable passed in from playTurn is already a capital letter.



You are making validateMove too complicated. Just do:

return isInt(position) &amp;&amp; board[position] === ' ';


If the expression evaluates to true, it will return true. If it evaluates to false, it will return false.

Note: I omitted the === true because JavaScript automatically checks for something to equal true.



It doesn't look like you have anything to check if the user enters an invalid number.

I would add something to the end of validateMove to check to make sure that the option is in bounds.

Here is what I came up with:

return isInt(position) &amp;&amp; board[position] === ' ' &amp;&amp; (position &gt;= 0 &amp;&amp; position &lt;= 8);


It would be >= 1 &amp;&amp; &lt;= 9 if you continued to use the object instead of the array for storing squares of the board



This might help your efficiency:

Try moving this conditional from checkWin

if (markCount === 3) {
    return true;
}


Outside of the inner for loop so you aren't doing a conditional check with each iteration.



In checkWin, you do a lot of looping. In each loop, you are destroying and re-making variables as they exit and leave the scope (the loop).

This is very optimal. To help this, move the declarations of markCount, i, and j to the very top of the function (before the loops). You can set them to 0 when they are needed.

Here is what I am saying:

function checkWin(player) {
    var i, j, markCount
    for (i = 0; i &lt; winCombinations.length; i++) {
        markCount = 0;
        for (j = 0; j &lt; winCombinations[i].length; j++) {
            if (board[winCombinations[i][j]] === player) {
                markCount++;
            }
            if (markCount === 3) {
                return true;
            }
        }
    }
    return false;
}


Notice how I removed the vars?



I'm a little confused by what your isInt function is trying to accomplish.

To make it simpler, just run isNaN on the position. It will return NaN (which acts like false in a conditional) if the user entered a string, rather than a number.