split()函数、js和最后一个数组项

3

我是一个新手,特别是在网站开发和JS方面。

我正在使用String对象的split方法来拆分此字符串:

let str = 'Look at me '; //last character is space
console.log(str.split(' '));

split的分隔符是空格,也就是 ' '。 我期望得到一个由3个元素组成的数组,因为我了解split的工作原理。但是,实际上我得到了这个结果:

['Look', 'at', 'me', '']

请问有人能解释一下这是为什么吗?先谢谢了!

5个回答

4

ECMA-262规定了JavaScript中split()如何实现

这很难理解,但是我试着解释一下...

步骤14指定split()总是通过获取到字符串末尾的切片来结束:

  1. 让T成为一个String值,该值等于S的子字符串,该子字符串由位置p(包括)到位置s(不包括)的字符组成。

然后将该切片添加到输出数组中:

  1. 使用参数ToString(lengthA),属性描述符{[[Value]]:T,[[Writable]]:true,[[Enumerable]]:true,[[Configurable]]:true}和false调用A的[[DefineOwnProperty]]内部方法。

请记住,split()的参数是分隔符(也称为分离器)。

""ABC".split("B")"将"B"视为分隔符,将子字符串"A""C"分隔开。

"ABC".split("C")"C"视为分隔符,将子字符串"AB"""分隔开。是的,空字符串仍然是字符串,因此"C"将子字符串"AB"与子字符串""分隔开。

您的示例相同,只是使用了空格字符" "代替"C"。空格在任何方面都不特殊,因此适用相同的规则:它将之前的子字符串与之后的子字符串(这恰好为空)分隔开。

"

谢谢您的回答!现在对于空字符串部分我更加清楚了。 - lessismore

3
split()函数将一个字符串有效地分成多个片段,并将这些片段放入数组中。函数的第一个参数(' ')是空格,意味着分割发生在任何空格处。你的字符串'Look at me '中有三个空格或三个分割点。如果你拿一块长蛋糕并切三刀,你最终会得到份蛋糕。在现实世界中,你当然不会有一份实际上是“空白”的第四份,但在计算机科学中,你只会得到一个额外的没有任何内容的片段。
如@ppasler所指出的解决方法是从你要分割的字符串中修剪掉任何多余的空格。 trim()从字符串的开头和结尾删除空格,这意味着trim('Look at me ')将结果为'Look at me'。如果你在此结果字符串上使用split,你将得到:['Look', 'at', 'me']

谢谢!现在我更深入地理解了! - lessismore
能看到有人更在意理解答案而不是答案本身,真是太好了。 - Chris Rasys
我想这是任何问题被提出的最好部分和主要动力。 - lessismore

1

为什么会发生这种情况?

split(separator, limit) 函数在每次出现separator时将字符串拆分。在您的情况下,separator也是字符串中的最后一个字符,这意味着它在那里被拆分,尽管之后没有任何内容(导致空字符串'')。

如何解决?

使用trim()函数删除前导和尾随空格,这样就不会在拆分数组末尾出现空字符串了。

let str = 'Look at me '; //last character is space
console.log(str.trim().split(" "));


4
抱歉,我需要对发生的事情进行解释,但不需要说明如何纠正它。 - lessismore
虽然从技术上讲是准确的。 - Chris Rasys
这应该是一个注释,因为它并没有试图回答正在被问的问题。 - user1106925
@MikeMcCaughan 你说得对,我以为一个解决方案就足够了 :) 我已经更新了我的答案。 - ppasler

1
这是因为str.split(" ")会返回字符串值,直到输入没有更多字符,并且每次下一个字符为输入字符时都会更改为下一个数组元素。由于您的输入在末尾有空格字符,因此split方法返回的最后一个值将为空。

1
由于您的字符串末尾含有空格,因此会出现这种情况。您字符串的最后一个空格被"分割"成左侧的一个单词('me')和右侧的一个空字符串(''),这就是split的工作方式。您可以参考此链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split
如果您想删除最后一个元素,只需删除末尾的额外空格即可。您可以使用trim来实现:
let str = 'Look at me '; //last character is space
console.log(str.trim().split(' '));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接