Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript字符串的安全长度是多少?_Javascript_Arrays_Utf 8_Utf 16 - Fatal编程技术网

JavaScript字符串的安全长度是多少?

JavaScript字符串的安全长度是多少?,javascript,arrays,utf-8,utf-16,Javascript,Arrays,Utf 8,Utf 16,考虑到charAt(),charCodeAt(),以及codePointAt()我发现参数的含义之间存在差异。在我真正考虑它之前,我认为您总是可以安全地访问长度为的字符。但是我了解到charCodeAt()和codePointAt()之间的区别在于charCodeAt()指的是16位(字节对),因此除了读取I之外,如果它们是代理对,您还需要I+1(UTF-16的方法也是如此)。而codePointAt()需要一个引用UTF-8字符位置的参数(从零开始)。所以现在我很困惑,length是计算字符数

考虑到
charAt()
charCodeAt()
,以及
codePointAt()
我发现参数的含义之间存在差异。在我真正考虑它之前,我认为您总是可以安全地访问长度为
的字符。但是我了解到charCodeAt()和codePointAt()之间的区别在于charCodeAt()指的是16位(字节对),因此除了读取
I
之外,如果它们是代理对,您还需要
I+1
(UTF-16的方法也是如此)。而codePointAt()需要一个引用UTF-8字符位置的参数(从零开始)。所以现在我很困惑,
length
是计算字符数,还是UTF-16样式的字节对数。我相信JavaScript将字符串作为UTF-16保存,但是在一个包含大量4字节字符的字符串上使用
codePointAt()
函数将超出字符串的末尾

使用
[…str].length
进行字符计数

var mb=“of以16位无符号整数值(“元素”)或代码单位(共同构成有效或无效的UTF16代码单位序列)计算,其索引也是如此。我们也可以称之为“字符”


无论您是通过还是通过访问它们,
length-1
始终是一个有效的索引。但是,代码点可能被编码为跨越两个索引的代理项对。没有内置方法来测量这些索引的数量,但是默认字符串迭代器将生成它们,因此您可以使用
for…of来计算它们
loop.

请为OP的问题“安全长度是多少”提出一个解决方案。感谢您的回答。非常失望,尽管JavaScript毫无用处,如果您碰巧为第二个代理项对提供索引,它会提供非法返回值。@Clive“非法”是什么意思"? 它只是索引处的代码单元,不考虑它前面的字节。但是是的,JavaScript字符串是不可变的
Uint16Array
s,而不是Unicode字符列表。@Bergi我称之为非法,因为所有3个函数的名称中都有子字符串“char”。根据它们的名字,它们声称给出了“字符”的代码,而不是16位无符号整数值的代码。@Bergi。“不顾一切”-哇,这是布什主义吗?(如“错误低估”)只要有足够的内存,字符串可以是任意长度。我假定您的mb字符集是一个非基本的多语言平面字符。感谢您的回答和包含的来源。但我对JavaScript的
length
属性大失所望,它似乎根本没有说明有多少个字符。我不知道省略号。我建议使用
Array。从(…)
将iterables强制转换为数组时,扩展语法应仅作为文本的一部分使用。