◆ get → HTML 上の見た目に近い形で取得
  ◆ table が tsv になったり white-space が有効だったり p タグは空行できたり
  ◆ レンダリングされてないと textContent と一緒
◆ set → 改行が br になる textContent

そういえば前に勧告された HTML 5.2 で innerText が正式に入ったとか聞きました
IE の独自拡張? か何かでちゃんとしたものじゃない印象があったので innerHTML と textContent の 2 つしか使ってませんでしたが便利なものなら使っていこうかなと思って調べてみました

調べてみてもほとんどの紹介ページで「見た目通りに取得できる」くらいしか書いてなくて具体的な動きについて触れてるところがありません
なので動かしてみたり仕様を読んだりして簡単にまとめてます

細かなアルゴリズム的なものは仕様を参照してください
https://html.spec.whatwg.org/multipage/dom.html#the-innertext-idl-attribute

set

先に代入するときの動きから
代入のときの動きは単純です


改行文字 (CR/LF) が見つかるまでを 1 つの TextNode にまとめます (改行文字は含めません)
入力テキストの末尾まで来たならそこでおしまいで 改行文字なら <br> を追加します
改行文字が CR でその次の文字が LF の場合は次の開始位置を 1 つすすめます (CRLF を一つの改行文字扱いにする)
改行文字の次から繰り返します

仕様のアルゴリズムでは入力文字を前から一文字ずつ見ていく方法で書かれていました
ですが簡単に言ってしまうと
CRLF は一文字とみなした上で改行文字で分割 → それぞれを TextNode にして改行文字を <br> タグに置き換える
これだけです

JavaScript で書くなら こう変換した HTML を innerHTML でセットするのと同じになるはずです

value.split(/\r?\n|\r/).map(e => htmlEscape(e)).join("<br>")

試してみます
const htmlEscape = text => Object.assign(
document.createElement("div"),
{
textContent: text
}
).innerHTML

const value = "\nfoo bar \n baz \n\r\nqux\n"
const elem = document.createElement("div")
elem.innerText = value
console.log(elem.innerHTML)

console.log(value.split(/\r?\n|\r/).map(e => htmlEscape(e)).join("<br>"))
<br>foo bar <br> baz <br><br>qux<br>
<br>foo bar <br> baz <br><br>qux<br>

innerText で設定後に innerHTML で取り出したテキストと上記の処理を通したテキストを比較すると一緒になっています

get

get はなかなか複雑です
画面上の表示に近い形でテキストとして取得できます
プログラム中で使うために取得する機会は少なくて コピーボタンでコピーさせるテキストに使うことが多そうです

例外として display:none などレンダリングされてないときや css 未対応のブラウザだと textContent と同じテキストが取得されます

レンダリングされているときは 再帰的に子要素をテキスト化して取得して結合したものになります
子要素では display:none も visibility:hidden も空文字になります

テキストノードでは white-space や text-transform の css が有効です
通常の TextNode では改行やスペースはそのまま空白にはなりません
ですが white-space: pre にすると改行が反映されたテキストで取得できます
HTML と同じです

br タグは単純に改行 (LF) になります

table タグでは
最後以外の table-cell の後にタブ
最後以外の table-row の後に改行 (LF)
が入ります
そのため table の見た目は tsv 形式になります

ブロック要素では特殊な改行が行われます
display がブロックレベル または table-caption のタグでは 前後に 1 つの改行を設定します
p タグでは前後に 2 つの改行を設定します (空行を作る)

ここで設定した改行は特別扱いで最終的なテキストにするときに特別な処理がされます
最終的なテキストの最初と最後にある場合は削除されます
「<div>a</div>」 は改行なしで 「a」 となります
特殊な改行が連続する場合は その中の最大数の LF 改行に置き換えます
これがあるので p が 2 つ続いても空行が1行あるだけになります

例えばこの HTML
<p>aa</p>
<p>bb</p>
<div>cc</div>
<p>dd</p>
<span>ee</span>
<span>ff</span>
<div style="white-space:pre">
gg
hh

ii
</div>
これを innerText で取得すると
aa

bb

cc
dd

ee ff

gg
hh

ii
となります


気をつけるのは innerText の対象の要素が

visibility:hidden → 空文字
display:none → textContent

くらいで後は HTML の見た目に近い形のテキストです