Javascript 什么是字符串';它继承了什么样的原型?
我四处寻找,发现JavaScript并没有真正的字符串比较方法来测试相等性。我已经看到,接受的方法使用===运算符。作为一个学习了java或C++之类的经典语言的人,这让我感到害怕,因为对我来说,它的行为方式实际上我并不打算这样做。Javascript 什么是字符串';它继承了什么样的原型?,javascript,string,Javascript,String,我四处寻找,发现JavaScript并没有真正的字符串比较方法来测试相等性。我已经看到,接受的方法使用===运算符。作为一个学习了java或C++之类的经典语言的人,这让我感到害怕,因为对我来说,它的行为方式实际上我并不打算这样做。 所以我决定编写自己的方法来比较字符串是否相等,但这让我想知道应该扩充什么样的原型,以便所有字符串都可以访问此方法。这就引出了我的问题;字符串继承的原型是什么?我不明白您想如何改进相等比较,但是 这让我想知道应该扩充什么样的原型,这样所有的字符串都可以访问这个方法 那
所以我决定编写自己的方法来比较字符串是否相等,但这让我想知道应该扩充什么样的原型,以便所有字符串都可以访问此方法。这就引出了我的问题;字符串继承的原型是什么?我不明白您想如何改进相等比较,但是 这让我想知道应该扩充什么样的原型,这样所有的字符串都可以访问这个方法 那就好了 所有字符串实例都继承自String.prototype。对字符串原型对象的更改将传播到所有字符串实例
在Javascript中,像数字这样的字符串是基本类型。(想想Java中的int、char等。) 你可以通过跑步来判断这是真的
typeof 'my string';//results in 'string'
'my string' instanceof Object;//results in false!
因为字符串是javascript中的基本类型,所以可以安全地使用==和===运算符。就像在Java中一样,将整数与==进行比较是安全的
与Java一样,原语类型也有对象包装器类型,不能使用==和==进行比较。(想想Java中的整数、字符等。)
因此,虽然从技术上讲,您可以通过运行newstring('mystring')
来创建String对象,但这通常不是一个好主意,因为它会打破人们对能够比较字符串的期望
typeof new String('my string');//results in 'object'
new String('my string') instanceof Object;//results in true
'my string' instanceof String;//results in false
与Java(至少Java5及以上)一样,Javascript具有自动装箱功能。这允许字符串被视为具有属性和函数。运行“我的字符串”.toUpperCase()
实际上是在做一些更像新字符串(“我的字符串”).toUpperCase()
的事情
因此,总结如下:
不要害怕,字符串是不可变的,这是一件好事。“因为对我来说,它的行为方式我实际上并不打算这样做。”-想解释一下吗?我不确定到底是什么问题。是关于String.prototype()还是原型通常是如何工作的?@elclanrs:我来看看不可变的含义。我以前看过,但还没有读过。@KarolyHorvath:认为你是在比较两个字符串是否有相同的内容,而事实上,在古典语言中,当你使用==
String.prototype.compare=函数(另一个){返回this.valueOf()==另一个;}
:-D@zerkms:最好使用严格模式,而不是.valueOf()
:-)或者如果使用严格模式,也不要忘记在另一个上调用它String.prototype.equals=函数eq(other){“use strict”;返回this==other;}代码>@Bergi这很奇怪,我不知道。有参考资料吗?(无法用谷歌搜索)@zerkms:this
绑定仅以草率模式强制到对象(甚至:全局对象);根据:-)您是否知道两个相等的字符串是在内存中存储两次还是只在内存中保留一个副本?我的意思是像varx='a';变量y='a'
,“a”是存储在内存中两次还是在某种池中,x
和y
都包含对它的引用?@RafaelEyng:请参阅。但你不必在意,因为你无论如何也无能为力。谢谢你,尼古拉斯,我想我会跳过对原型的扩充。但这不是因为JavaScript引擎使用字符串内部处理(刚刚学过的单词),我们可以用===
比较两个字符串,得到true
?因为很难相信字符串是真正的基本类型。@RafaelEyng:从语言的角度来看,字符串是基本值,=
。引擎在内部可以做些什么来实现这一点是完全不相关的。