web-dev-qa-db-ja.com

JavaScriptの新しいString( "x")のポイントは何ですか?

new String("already a string")を実行する使用例は何ですか?

それの要点は何ですか?

36
Pacerier

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;

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

  1. Stringオブジェクトを気にせず、typeofを使用してください。これが私の推薦です。

    typeof str == "string"

  2. instanceofとtypeofを使用します。これは通常は機能しますが、別のウィンドウで作成されたStringオブジェクトに対して偽陰性を返すという欠点があります。

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

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

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

53
Tim Down

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

 var j = new String( "x"); 
 j === "x" //false
j == "x" //true
18
Lucia

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
_
6
RobF

あなたが本当に偏執狂になりたければ、instanceofを使うことができます:

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

instanceof operator は、Stringのサブクラスも適切に処理します。

obj instanceof ConstructorFunctionConstructorFunction.prototypeobjのプロトタイプチェーンにあります。

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

3
mu is too short

ほとんどの場合、一人で作業して自分自身を制御できるか、チームでチームガイドラインがあるか、使用しているコードを確認できるので、問題にはなりません。しかし、いつでも安全性を高めることができます。

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に設定する(実際には完全に不明瞭になる)可能性があることに注意してください。文字列ではありませんが...

1
davin

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

0
jazmit

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

それが定義されているかnullであるかどうかを確認し、それ以外の場合は、var bar = new String(foo);またはvar bar = "" + foo;

0
bartosz.r
Object.prototype.toString.call(aVariable) == '[object String]'
0
omtester

感謝します。非常に長い年月を経ても、この質問には正確な答えがありません。

JavaScriptには2つのタイプのデータがあります。

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

すべてのプリミティブは不変であり(numのstrを変更すると、背後に新しい変数が作成されます)、オブジェクトは可変です。

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

0
Sumer