41

行うためのユースケースは何new String("already a string")ですか?

それの全体的なポイントは何ですか?

4

9 に答える 9

61

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;

チェックしている値が任意のオブジェクトである可能性がある場合、オプションは次のとおりです。

  1. Stringオブジェクトについて心配する必要はなく、typeofを使用するだけです。これが私のおすすめです。

    typeof str == "string"

  2. typeofだけでなくinstanceofも使用します。これは通常は機能しますが、別のウィンドウで作成されたStringオブジェクトに対してフォールスネガティブを返すという欠点があります。

    typeof str == "string" || str instanceof String

  3. ダックタイピングを使用します。substring()やtoLowerCase()などの1つ以上の文字列固有のメソッドの存在を確認します。これは明らかに不正確です。チェックしている名前のメソッドを持つオブジェクトに対して誤検知が返されるためですが、ほとんどの場合は十分です。

    typeof str == "string" || typeof str.substring == "function"

于 2011-04-21T23:05:02.150 に答える
23

Javascriptの作成者は、javaに似せるために、stringやintなどの基本的な型のラッパーを作成しました。残念ながら、誰かが新しいString( "x")を作成した場合、要素のタイプは「string」ではなく「object」になります。

var j = new String( "x");
j === "x" // false
j == "x" // true
于 2011-04-21T23:05:34.147 に答える
8

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つの文字列「型」が効果的に提供され、動作が異なり、その結果、が使用されます。これはBooleanNumberオブジェクトとそれぞれのプリミティブにも当てはまります。

ただし、this関数メソッドを使用するときbind()の値として文字列(または他の)プリミティブを渡すことに注意してください。値はオブジェクト(またはプリミティブによってはオブジェクト)に変換されてから、次のように使用されます。call()apply()StringBooleanNumberthis

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
于 2016-08-24T01:22:35.763 に答える
3

instanceofあなたが本当に妄想的になりたいなら、あなたは使うことができます:

if(typeof x === "string" || x instanceof String)

instanceof演算子はStringのサブクラスも適切に処理します。

obj instanceof ConstructorFunctionConstructorFunction.prototypeのプロトタイプチェーンにあるかどうかを確認することで機能しobjます。

JavaScriptでStringクラスを実際に使用したことはないと思いますが、偏執的で正確さを目指すことに何の問題もありません。

于 2011-04-21T23:20:22.080 に答える
1

ほとんどの場合、あなたは一人で作業し、自分自身を制御することができます。またはチームで作業し、チームガイドラインがあるか、作業しているコードを見ることができるので、問題はありません。しかし、あなたは常に非常に安全であることができます:

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このメソッドは、文字列ではない場合でも、誰かがオブジェクトを作成し、そのコンストラクターを(実際には完全にあいまいになる)設定する可能性があることに注意してください...

于 2011-04-21T23:04:49.290 に答える
0
Object.prototype.toString.call(aVariable) == '[object String]'
于 2011-04-22T04:24:44.603 に答える
0

Stringオブジェクトを(他のものと一緒に)Stringプリミティブに変換することもできますtoString var str = new String("foo"); typeof str; // object typeof str.toString(); // string

于 2015-02-07T22:03:10.000 に答える
0

おかげさまで、何年も経っても、この質問には正確な答えがありません。

JavaScriptには2種類のデータがあります。

  1. プリミティブ:-文字列(let a ='testStr')、数値、ブール値、null、未定義、記号、bigint。
  2. オブジェクト:-その他すべて(関数、配列、JSオブジェクトなど)

JSが効率的に設計されている方法(V8のJSはロケットのようなものです)は、すべてのプリミティブが不変であり(numのstrを変更すると、舞台裏で新しい変数が作成されます)、オブジェクトは変更可能です。

オブジェクトのように使用されるプリミティブをサポートするために、JSにはAutoBoxingのこの機能があります。したがって、プリミティブで任意のメソッド(たとえば、数値のtoString())を使用すると、JSはそれを対応するオブジェクトに自動的に変換してから、メソッドを実行してプリミティブに変換し直します。通常、コンストラクター(newを使用)を使用せず、プリミティブのみのように使用する必要があります(let str ='testStr')。プリミティブの代わりにコンストラクタオブジェクトを使用すると、実行が遅くなり、複雑になる可能性があります。

于 2019-12-18T12:23:57.607 に答える
-1

文字列かどうかを確認する必要があるのはなぜですか?

定義されているかnullであるかを確認するだけです。それ以外の場合は、またはのいずれかの任意のタイプに防御的に変換しvar bar = new String(foo);ますvar bar = "" + foo;

于 2012-01-26T13:48:53.937 に答える