[英]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("");
如果你分開這些步驟
.split(" ")
按空格。 不再有空格,因此,這將返回一個包含一個元素[cStr]
的數組
你.slice()
來自那個數組,它給你另一個 1 元素數組[cStr]
你.reverse()
那個 1 元素數組,它給你 - 驚喜 - 另一個 1 元素數組[cStr]
你.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.