TLDR低于
我正在阅读MDN上JavaScript的标准内置对象部分,并注意到有这些方法利用了“Locale”这些方法。并且从我可以收集的内容中特别使用,以本地定义的格式(如果存在)格式化方法的返回文本。显然它会引起土耳其的问题(我不知道是否还有其他人)
据我所知,从我所研究的内容来看,这些都是在2011年左右的ES 5.1中实现的。事实上,在下面参考文献中的一个SO链接中,它主动指出Angular 1.x可能使用toString而不是toLocaleString的原因是因为与尚未完全采用ES5.1的浏览器向后兼容 - 简单的一边:我不知道是否&#39确实如此,但似乎是合理的。
所以我查看了ES6规范以查看方法:
在对象:
上15.2.4.3 Object.prototype.toLocaleString()此函数返回调用toString()的结果。注意提供此功能 给所有对象一个通用的toLocaleString接口,即使不是 所有人都可以使用它。目前,Array,Number和Date提供了自己的 区域设置敏感的toLocaleString方法。注意第一个参数 此功能可能会在未来版本中使用 标准;建议实现不要使用它 其他任何参数的位置。
在数组:
上15.4.4.3 Array.prototype.toLocaleString() 使用toLocaleString 方法将数组元素转换为字符串,这些字符串是 然后连接,由在实现定义中派生的分隔符字符串的出现分隔 特定于语言环境的方式。调用此函数的结果与结果类似 toString,除了此函数的结果是特定于语言环境的。
在字符串:
上15.5.4.17 String.prototype.toLocaleLowerCase() 此函数与toLowerCase完全相同,只是其结果旨在产生正确的结果 对于主机环境的当前区域设置,而不是与区域设置无关的结果。只会有区别 少数情况(例如土耳其语),其中该语言的规则与常规Unicode案例映射冲突。 注意toLocaleLowerCase函数是有意通用的;它不要求它的这个值是一个String对象。 因此,它可以转移到其他种类的对象以用作方法。 注意此功能的第一个参数可能会在此标准的未来版本中使用;建议 实现不会将此参数位置用于其他任何位置。
原始的ToLowerCase for Clarity:
15.5.4.16 String.prototype.toLowerCase() 如果此对象不是字符串,则将其转换为字符串。该字符串中的字符将逐个转换 小写。结果是字符串值,而不是String对象。 角色逐个转换。除非另有说明,否则每次转换的结果都是原始字符 character具有Unicode小写等效项,在这种情况下使用小写等效项。 注意结果应根据Unicode字符数据库中的大小写映射派生(这明确包括 不仅是UnicodeData.txt文件,还有Unicode 2.1.8及更高版本中随附的SpecialCasings.txt文件。 注意toLowerCase功能是有意通用的;它不要求它的这个值是一个String对象。因此,它 可以转移到其他种类的对象用作方法
(toLocaleUpperCase / toUpperCase读取完全相同)
考虑到这一切,并且随着ES6的发布并且它在很大程度上被采用,我很困惑。我觉得toLowerCase和toUpperCase通常用于验证目的(虽然ES6不太常见)并且更改它们以利用Locale似乎是错误的,因为你将检查未知的格式。好的,对验证不是很有用。那么用toLocaleString输出到DOM呢?这似乎是合理的,但同样,你还在处理未知数。假设您的区域设置没有格式化,并且您希望整数1000显示为' 1,000'。 (我已经读到这种情况发生在en-GB)它会让你失控,你可能永远不会知道它没有按照你的意愿显示。
TLDR :
是否有toLocaleString
toLocaleLowerCase
toLocaleUpperCase
等方法的实际用例?他们应该被忽视吗?
注意:我意识到这是固执己见的,但我认为不是。我正在寻找合理的案例,如果它们存在,这些案例可能适用。例如比如询问你会用什么.call for'而不是你认为.call比.apply'更好。
参考
MDN String Prototype: toLocaleLowerCase
SO: Difference Between toLocaleLowerCase and toLowerCase?
SO: In which exactly js engines are toLowerCase toUpperCase locale sensitive?
SO: JavaScript difference between toString and toLocaleString methods of date?
答案 0 :(得分:3)
看起来似乎有道理,但同样,你还在处理未知数。
是。你需要了解它们。
它会把它从你手中夺走,你可能永远不会知道它没有按照你的意愿展示。
事实上。如果您希望/需要完全控制输出,则需要自己实现格式化。如果您只是说,嘿,它是一个数字,请将其格式化为您认为最适合英国语言环境的任何内容,然后您就可以使用它。
是否有
toLocaleString
等方法的实际用例?
是的!您将希望在支持ECMA-402 Standard的环境中使用它们。
" ECMAScript 2016国际化API规范提供了大多数应用程序所需的几个语言敏感功能的关键部分:字符串比较(排序规则),数字格式,日期和时间格式以及大小写转换。虽然ECMAScript 2016语言规范提供了此基本功能的功能(在Array.prototype
上:toLocaleString
;在String.prototype
上:localeCompare
,toLocaleLowerCase
,toLocaleUpperCase
;在Number.prototype
上:toLocaleString
;在Date.prototype
:toLocaleString
,toLocaleDateString
和toLocaleTimeString
)上,它会在很大程度上保留这些函数的实际行为直到实现定义。 ECMAScript 2016国际化API规范提供了附加功能,对语言的控制以及所使用行为的详细信息,以及所需功能的更完整规范。"
他们应该被忽视吗?
在未知的环境中,可能。但是当你不知道他们做了什么时(因为你控制环境,或者你希望它符合ECMA-402),因为在这些情况下,它们可能非常有用并且需要你做大量的工作。