Answers:
注意:这不符合unicode。
"I💖U".split('')
导致4个字符的数组["I", "�", "�", "u"]
,这可能导致危险的错误。有关安全替代方案,请参见下面的答案。
只需将其拆分为一个空字符串即可。
var output = "Hello world!".split('');
console.log(output);
"randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
不会告诉您字符串中的字符数,因为某些字符比其他字符占用更多的空间;str.length
告诉您16位数字的数量。
正如hippietrail所建议的那样,merder的答案可能会破坏代理对并误解“字符”。例如:
// DO NOT USE THIS!
> '𝟘𝟙𝟚𝟛'.split('')
[ '�', '�', '�', '�', '�', '�', '�', '�' ]
我建议使用以下ES2015功能之一来正确处理这些字符序列。
> [...'𝟘𝟙𝟚𝟛']
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
> Array.from('𝟘𝟙𝟚𝟛')
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
u
标志> '𝟘𝟙𝟚𝟛'.split(/(?=[\s\S])/u)
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
使用/(?=[\s\S])/u
代替,/(?=.)/u
因为.
与换行符不匹配。
如果您仍处于ES5.1时代(或者您的浏览器无法正确处理此正则表达式-例如Edge),则可以使用以下替代方法(由Babel编译):
> '𝟘𝟙𝟚𝟛'.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
请注意,Babel还会尝试正确处理无与伦比的代理人。但是,这似乎对无与伦比的低替代品不起作用。
🏳️🌈
,并拆分了从字符中结合变音符号的符号。如果要拆分成字素簇而不是字符,请参阅stackoverflow.com/a/45238376。
该spread
语法
您可以使用传播语法,这是ECMAScript 2015(ES6)标准中引入的Array Initializer :
var arr = [...str];
例子
function a() {
return arguments;
}
var str = 'Hello World';
var arr1 = [...str],
arr2 = [...'Hello World'],
arr3 = new Array(...str),
arr4 = a(...str);
console.log(arr1, arr2, arr3, arr4);
前三个结果为:
["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d"]
最后一个结果
{0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d"}
浏览器支持
进一步阅读
spread
也被称为“ splat
”(例如,在PHP或Ruby中或被称为“ scatter
”(例如,在Python中)。
演示版
您也可以使用Array.from
。
var m = "Hello world!";
console.log(Array.from(m))
此方法已在ES6中引入。
这是一个老问题,但是我遇到了另一个未列出的解决方案。
您可以使用Object.assign函数获取所需的输出:
var output = Object.assign([], "Hello, world!");
console.log(output);
// [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]
不一定是对还是错,只是另一种选择。
Array.from("Hello, world")
。
[..."Hello, world"]
它已经是:
var mystring = 'foobar';
console.log(mystring[0]); // Outputs 'f'
console.log(mystring[3]); // Outputs 'b'
或更旧的浏览器友好版本,请使用:
var mystring = 'foobar';
console.log(mystring.charAt(3)); // Outputs 'b'
alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
mystring.charAt(index)
。
charAt()
1-尽管我更喜欢使用array-ish变体。达恩IE。
您可能将(至少)三种不同的事物视为“角色”,因此,可能要使用三种不同的方法类别。
JavaScript字符串最初是作为UTF-16代码单元的序列而发明的,可追溯到历史上的某个时刻,当时UTF-16代码单元与Unicode代码点之间存在一对一的关系。.length
字符串的属性以UTF-16代码单位度量其长度,并且在someString[i]
获取字符串的第i个UTF-16代码单位时someString
。
因此,通过使用带有索引变量的C样式for循环,您可以从字符串中获取UTF-16代码单元的数组。
const yourString = 'Hello, World!';
const charArray = [];
for (let i=0; i<=yourString.length; i++) {
charArray.push(yourString[i]);
}
console.log(charArray);
还有多种实现同一目标的简短方法,例如使用.split()
空字符串作为分隔符:
const charArray = 'Hello, World!'.split('');
console.log(charArray);
但是,如果您的字符串包含由多个UTF-16代码单元组成的代码点,则这会将它们拆分为单独的代码单元,这可能不是您想要的。例如,字符串'𝟘𝟙𝟚𝟛'
由四个unicode代码点(代码点0x1D7D8至0x1D7DB)组成,在utf-16中,每个unicode代码点均由两个uTF-16代码单元组成。如果使用上述方法拆分该字符串,则会得到一个包含八个代码单元的数组:
const yourString = '𝟘𝟙𝟚𝟛';
console.log('First code unit:', yourString[0]);
const charArray = yourString.split('');
console.log('charArray:', charArray);
因此,也许我们想将字符串拆分为Unicode代码点!自ECMAScript 2015将可迭代的概念添加到该语言以来,这已经成为可能。字符串现在是可迭代的,当您遍历它们时(例如,使用for...of
循环),您将获得Unicode代码点,而不是UTF-16代码单元:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = [];
for (const char of yourString) {
charArray.push(char);
}
console.log(charArray);
我们可以使用来缩短此时间Array.from
,它在隐式传递的可迭代项上进行迭代:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = Array.from(yourString);
console.log(charArray);
然而,Unicode码点是不是也可能会被认为是一个“性格”最大可能的事情要么。可以合理地视为单个“字符”但由多个代码点组成的事物的一些示例包括:
我们可以从下面看到,如果尝试通过上述迭代机制将具有此类字符的字符串转换为数组,则这些字符最终会分解为结果数组。(如果系统上未显示任何字符,则yourString
下面的字符由带有重音符号的大写字母A组成,其后是英国国旗,然后是黑人女性。)
const yourString = 'Á🇬🇧👩🏿';
const charArray = Array.from(yourString);
console.log(charArray);
如果我们要保持每一种在我们的最后一个数组中的单个项目,那么我们需要的数组字形,而不是代码点。
JavaScript没有对此的内置支持-至少现在还没有。因此,我们需要一个能够理解并实现Unicode规则的库,以了解哪些代码点组合构成了字素。幸运的是,存在一个:Orling的字素分解器。您需要使用npm进行安装,或者,如果您不使用npm,请下载index.js文件并为其<script>
添加标签。对于此演示,我将从jsDelivr加载它。
字形分离器给了我们一个GraphemeSplitter
班有三种方法:splitGraphemes
,iterateGraphemes
,和countGraphemes
。自然地,我们想要splitGraphemes
:
const splitter = new GraphemeSplitter();
const yourString = 'Á🇬🇧👩🏿';
const charArray = splitter.splitGraphemes(yourString);
console.log(charArray);
<script src="https://cdn.jsdelivr.net/npm/grapheme-splitter@1.0.4/index.js"></script>
然后就是-三个字素的数组,这可能就是您想要的。
您可以遍历字符串的长度并将字符推到每个位置:
const str = 'Hello World';
const stringToArray = (text) => {
var chars = [];
for (var i = 0; i < text.length; i++) {
chars.push(text[i]);
}
return chars
}
console.log(stringToArray(str))
"😃".charAt(0)
将返回一个无法使用的角色
.split("")
再次成为最快的选择
.split("")
似乎在Firefox中进行大量优化。尽管该循环在chrome和Firefox中具有相似的性能,但无论大小输入,firefox的拆分速度都明显更快。
这个怎么样?
function stringToArray(string) {
let length = string.length;
let array = new Array(length);
while (length--) {
array[length] = string[length];
}
return array;
}
Array.prototype.slice也可以完成这项工作。
const result = Array.prototype.slice.call("Hello world!");
console.log(result);
"𨭎".split('')
结果["�", "�"]
。