行うためのユースケースは何new String("already a string")
ですか?
それの全体的なポイントは何ですか?
行うためのユースケースは何new String("already a string")
ですか?
それの全体的なポイントは何ですか?
String
によって作成されたオブジェクトの実用的な使用法はほとんどありませんnew String("foo")
。オブジェクトがプリミティブ文字列値に対して持つ唯一の利点は、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"
。
typeofだけでなくinstanceofも使用します。これは通常は機能しますが、別のウィンドウで作成された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
オブジェクトとそれぞれのプリミティブにも当てはまります。
ただし、this
関数メソッドを使用するときbind()
の値として文字列(または他の)プリミティブを渡すことに注意してください。値はオブジェクト(またはプリミティブによってはオブジェクト)に変換されてから、次のように使用されます。call()
apply()
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
演算子は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
このメソッドは、文字列ではない場合でも、誰かがオブジェクトを作成し、そのコンストラクターを(実際には完全にあいまいになる)設定する可能性があることに注意してください...
Object.prototype.toString.call(aVariable) == '[object String]'
Stringオブジェクトを(他のものと一緒に)Stringプリミティブに変換することもできますtoString
:
var str = new String("foo");
typeof str; // object
typeof str.toString(); // string
おかげさまで、何年も経っても、この質問には正確な答えがありません。
JavaScriptには2種類のデータがあります。
JSが効率的に設計されている方法(V8のJSはロケットのようなものです)は、すべてのプリミティブが不変であり(numのstrを変更すると、舞台裏で新しい変数が作成されます)、オブジェクトは変更可能です。
オブジェクトのように使用されるプリミティブをサポートするために、JSにはAutoBoxingのこの機能があります。したがって、プリミティブで任意のメソッド(たとえば、数値のtoString())を使用すると、JSはそれを対応するオブジェクトに自動的に変換してから、メソッドを実行してプリミティブに変換し直します。通常、コンストラクター(newを使用)を使用せず、プリミティブのみのように使用する必要があります(let str ='testStr')。プリミティブの代わりにコンストラクタオブジェクトを使用すると、実行が遅くなり、複雑になる可能性があります。
文字列かどうかを確認する必要があるのはなぜですか?
定義されているかnullであるかを確認するだけです。それ以外の場合は、またはのいずれかの任意のタイプに防御的に変換しvar bar = new String(foo);
ますvar bar = "" + foo;
。