new String("already a string")
を実行する使用例は何ですか?
それの要点は何ですか?
new String("foo")
によって作成されるString
オブジェクトの実用的な使用はほとんどありません。プリミティブ文字列値に対するString
オブジェクトの唯一の利点は、オブジェクトとしてプロパティを格納できることです。
var str = "foo";
str.prop = "bar";
alert(str.prop); // undefined
var str = new String("foo");
str.prop = "bar";
alert(str.prop); // "bar"
コードに渡すことができる値がわからない場合は、プロジェクトに大きな問題があることをお勧めします。文字列を返すネイティブJavaScriptオブジェクト、メジャーライブラリ、またはDOMメソッドは、文字列値ではなくString
オブジェクトを返しません。ただし、String
オブジェクトではなく文字列値があることを確実にしたい場合は、次のように変換できます。
var str = new String("foo");
str = "" + str;
チェックする値が任意のオブジェクトである可能性がある場合、オプションは次のとおりです。
Stringオブジェクトを気にせず、typeofを使用してください。これが私の推薦です。
typeof str == "string"
。
instanceofとtypeofを使用します。これは通常は機能しますが、別のウィンドウで作成されたStringオブジェクトに対して偽陰性を返すという欠点があります。
typeof str == "string" || str instanceof String
ダックタイピングを使用します。 substring()やtoLowerCase()など、1つ以上の文字列固有のメソッドの存在を確認します。チェックしている名前のメソッドを持つオブジェクトに対して誤ってポジティブを返すため、これは明らかに不正確ですが、ほとんどの場合それで十分です。
typeof str == "string" || typeof str.substring == "function"
Javascript作成者は、Javaに似せるために、stringやintのような基本的なタイプのラッパーを作成しました。残念ながら、誰かが新しいString( "x")を作成すると、要素のタイプは「string」ではなく「object」になります。
var j = new String( "x"); j === "x" //false j == "x" //true
String
オブジェクトはプロパティを持つことができますが、文字列プリミティブは次のことはできません。
_var aStringObject=new String("I'm a String object");
var aStringPrimitive="I'm a string primitive";
aStringObject.foo="bar";
console.log(aStringObject.foo); //--> bar
aStringPrimitive.foo="bar";
console.log(aStringPrimitive.foo); //--> undefined
_
また、String
オブジェクトは継承できますが、文字列プリミティブでは次のことはできません。
_var foo=Object.create(aStringObject);
var bar=Object.create(aStringPrimitive); //--> throws a TypeError
_
String
オブジェクトは、それ自体とのみ等しいことができ、同じ値を持つ他のString
オブジェクトは等しくありません。一方、同じ値を持つプリミティブは等しいと見なされます。
_var aStringObject=new String("I'm a String object");
var anotherStringObject=new String("I'm a String object");
console.log(aStringObject==anotherStringObject); //--> false
var aStringPrimitive="I'm a string primitive";
var anotherStringPrimitive="I'm a string primitive";
console.log(aStringPrimitive==anotherStringPrimitive); //--> true
_
あなたはオーバーロードを実装することができます-のように動作:
_function overloadedLikeFunction(anArgument){
if(anArgument instanceof String){
//do something with a String object
}
else if(typeof anArgument=="string"){
//do something with a string primitive
}
}
_
または、引数の目的を指定します。
_function aConstructorWithOptionalArugments(){
this.stringObjectProperty=new String("Default stringObjectProperty value");
this.stringPrimitiveProperty="Default stringPrimitiveProperty value";
for(var argument==0;argument<arguments.length;argument++){
if(arguments[argument] instanceof String)
this.stringObjectProperty=arguments[argument];
if(typeof arguments[argument]=="string")
this.stringPrimitiveProperty=arguments[argument];
}
}
_
または追跡オブジェクト:
_var defaultStringValue=new String("default value");
var stringValue=defaultStringValue;
var input=document.getElementById("textinput") //assumes there is an text <input> element with id equal to "textinput"
input.value=defaultStringValue;
input.onkeypress=function(){
stringValue=new String(this.value);
}
function hasInputValueChanged(){
//Returns true even if the user has entered "default value" in the <input>
return stringValue!=defaultStringValue;
}
_
String
オブジェクトと文字列プリミティブが存在することで、JavaScriptで2つの文字列「型」が動作が異なり、結果として使用されます。これは、Boolean
およびNumber
オブジェクトとそれぞれのプリミティブにも当てはまります。
ただし、関数メソッドbind()
、call()
およびapply()
を使用する場合は、文字列(または他の)プリミティブをthis
の値として渡すことに注意してください。 、値がString
として使用される前にBoolean
オブジェクト(またはプリミティブに応じてNumber
またはthis
オブジェクト)に変換されるため:
_function logTypeofThis(){
console.log(typeof this);
}
var aStringPrimitive="I'm a string primitive";
var alsoLogTypeofThis=logTypeofThis.bind(aStringPrimitive);
console.log(typeof aStringPrimitive); //--> string;
logTypeofThis.call(aStringPrimitive); //--> object;
logTypeofThis.apply(aStringPrimitive); //--> object;
alsoLogTypeofThis(); //--> object;
_
そして、予期しない/直感的でない戻り値の型:
_var aStringObject=new String("I'm a String object");
console.log(typeof aStringObject); //--> object
aStringObject=aStringObject.toUpperCase();
console.log(typeof aStringObject); //--> string
_
あなたが本当に偏執狂になりたければ、instanceof
を使うことができます:
if(typeof x === "string" || x instanceof String)
instanceof
operator は、Stringのサブクラスも適切に処理します。
obj instanceof ConstructorFunction
はConstructorFunction.prototype
はobj
のプロトタイプチェーンにあります。
JavaScriptで実際にStringクラスを使用したことはないと思いますが、偏執的で正しいことを目指していることには何の問題もありません。
ほとんどの場合、一人で作業して自分自身を制御できるか、チームでチームガイドラインがあるか、使用しているコードを確認できるので、問題にはなりません。しかし、いつでも安全性を高めることができます。
var obj = new String("something");
typeof obj; // "object"
obj = ""+obj;
typeof obj; // "string"
更新
それが機能しているように見えますが、これの影響についてはそれほど多くはありません:
var obj = new String("something"), obj2 = "something else";
obj.constructor === String; // true
obj2.constructor === String; // true
もちろん、オブジェクトにコンストラクタがあるかどうか(つまり、オブジェクトかどうか)を確認する必要があります。
だからあなたは持つことができます:
isString(obj) {
return typeof obj === "string" || typeof obj === "object" && obj.constructor === String;
}
Typeofと "string"を使用することをお勧めしますが、ユーザーは通常の文字列リテラルを通過することを知っている必要があります。
このメソッドは、オブジェクトを作成し、そのコンストラクターをString
に設定する(実際には完全に不明瞭になる)可能性があることに注意してください。文字列ではありませんが...
toString
:var str = new String("foo"); typeof str; // object typeof str.toString(); // string
を使用して、Stringオブジェクトを(他のものとともに)Stringプリミティブに変換することもできます。
それが文字列かどうかを確認する必要があるのはなぜですか?
それが定義されているかnullであるかどうかを確認し、それ以外の場合は、var bar = new String(foo);
またはvar bar = "" + foo;
。
Object.prototype.toString.call(aVariable) == '[object String]'
感謝します。非常に長い年月を経ても、この質問には正確な答えがありません。
JavaScriptには2つのタイプのデータがあります。
すべてのプリミティブは不変であり(numのstrを変更すると、背後に新しい変数が作成されます)、オブジェクトは可変です。
プリミティブをサポートしてオブジェクトのように使用するために、JSにはAutoBoxingのこの機能があります。したがって、プリミティブで任意のメソッド(数値の場合はtoString()など)を使用すると、JSはそれを対応するオブジェクトに自動的に変換してから、メソッドを実行してプリミティブに変換します。通常、コンストラクター(newを使用)を使用して、プリミティブのようにのみ使用する必要があります(str = 'testStr')プリミティブの代わりにコンストラクターオブジェクトを使用すると、実行が遅くなり複雑になる可能性があります。