簡體   English   中英

JavaScript 數組變異 split(" ") 與擴展運算符

[英]JavaScript array mutating split(" ") vs spread operator

我正在嘗試檢查某個句子是否是回文。 分詞和標點符號不算數。

此代碼使用cStr.split(" ")完成任務。 在空格 (" ") 上拆分,似乎 reverse() 什么都不做。

const palindromes = (str) => {
    const regex = /[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/g;
    const cStr = str.toLowerCase().replace(regex, "").split(" ").join("");
    const revStr = cStr.split(" ").slice().reverse().join("");
    return cStr === revStr ? true : false;
};

更新的cStr,字符都折疊了。 在不正確的代碼中,我拆分了不存在的“空白”(split(" ")),所以代碼停止執行但沒有拋出錯誤?

使用[...cStr]cStr.split("")的相同代碼確實完成了任務:

const revStr = cStr.split("").slice().reverse().join("");

// or
const revStr = [...cStr].slice().reverse().join("");

“分隔符”如何? /""/ 或 /" "/ 有這個效果嗎?

如果 separator 是空字符串 (""),則 str 將轉換為其每個 UTF-16“字符”的數組,結果字符串的兩端沒有空字符串。

數組變異的相關問題: reverse-array-in-javascript-without-mutating-original-array

字符串操作的相關問題: character-array-from-string

Split() 文檔: String.prototype.split()

似乎您已經閱讀了string.split的文檔,但沒有完全理解它們。 如果你傳遞一個字符串中不存在的分隔符,它只返回一個包含一個元素的數組,這個元素是整個字符串。 而如果您用空分隔符拆分,它將在每個字符后拆分。

 let astring = "nowhitespacehere"; let splitstring1 = astring.split(" "); console.log(splitstring1); let splitstring2 = astring.split(""); console.log(splitstring2);

那么,在您的第一種方法中,您通過以下方式從字符串中刪除所有空格

str.split(" ").join("");

然后你稍后做

cStr.split(" ").slice().reverse().join("");

如果你分開這些步驟

  1. .split(" ")按空格。 不再有空格,因此,這將返回一個包含一個元素[cStr]的數組

  2. .slice()來自那個數組,它給你另一個 1 元素數組[cStr]

  3. .reverse()那個 1 元素數組,它給你 - 驚喜 - 另一個 1 元素數組[cStr]

  4. .join("")這個帶有空分隔符的 1 元素數組中的元素,它給你cStr

在你的第二種方法中你做

cStr.split("").slice().reverse().join("");

關鍵的區別是第一個split("")被一個空分隔符分隔,它在每個字符之后分割字符串

不,您的第一種方法不會“停止執行”,它只是執行您告訴它執行的操作,由不存在的分隔符分隔。 為什么會或應該拋出錯誤? 它只是做了分裂應該做的事情。 將所有字符相加,直到找到分隔符。 如果沒有找到,它當然會將整個字符串加到第一個標記中......

在嘗試了解您的問題時,我對您的原始 function 進行了一些優化。 由於@derpirscher 已經回答了你的問題,我只想將其添加為靈感(而不是扔掉它:-)

使用回文,您可以比較字母,因此無需將句子拆分為單詞。

const palindromes = (str) => {
    const regex = /[^a-zA-Z]/g; // No need to specify all the characters, also removes whitespaces
    const cStr = str.toLowerCase().replace(regex, ""); // No need to convert to array and back
    const revStr = cStr.split("").reverse().join("");
    return cStr === revStr; // This already returns true or false
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM