2016-11-24 15 views
4

私は国際化ライブラリl10n.jsを使用しています。には翻訳を実行する言語を伝えることができませんクライアントブラウザから値を取得しようとします。私がやっている私の場合はString.localeの値を設定すると、プリミティブに割り当てられた値が失われます

String.locale = 'en-GB'; 

String.locale = $('html').attr('lang'); 

を...右にあなたが実際ににしたい場合ので、私はあなたのような何かをする必要がありますロケールを設定すると言われていますファイルの先頭。

これは動作しますが、しかしPhpStormに私がいることを警告取得:このプリミティブに割り当てられ

値が失われますが

私はthis questionをチェックして、彼らは警告を得た理由を理解、私のインスタンスではわかりません - 基本的には、現在の値String.localeが失われることを教えていますか?

+0

「String.locale」をどこでどのように設定するかといったようなコンテキストを追加できますか? – Linek

+0

@Linekが更新されました。 – Brett

答えて

5

それはPhpStormの型推論システムの誤警報のように見えます。

Stringは、JavaScript言語のプリミティブではありません。 String関数がobjectであるため、Stringのプロパティに値を代入することは安全です。

私はValue assigned to this primitive will be lostのキーアイデアは、コードを記述することができることとします未定義、ヌル、ブール値、文字列や数:JavaScriptで

> var primitive = "somestring"; 
> primitive.someprop = 3; 
3 
> primitive.someprop; 
undefined 

は5つの原始的な種類があります。プリミティブはオブジェクトではなく、プロパティはありません。 JavaScriptがプロパティをプリミティブに割り当てる試みを検出した場合、プリミティブを実際にオブジェクトに強制します。しかし、この新しいオブジェクトには参照がなく、すぐにガベージコレクションのための飼料になります。したがって、プリミティブに割り当てられた値は失われます。 link

+0

すべての意味が今のところ:) – Brett

1

PHPStormは、Stringというオブジェクトの作成について警告します。新しいインスタンスのそれぞれには、で宣言されていないので、localeという変数は含まれません。以下のコードはそれを説明する必要があります。

var index = 1; 
 
function test(value) { 
 
\t document.body.innerHTML += index++ + " " + value; 
 
    document.body.innerHTML += "</br>"; 
 
} 
 

 
test(String.locale); // 1 - check if locale exists 
 

 
String.locale = "locale"; 
 
test(String.locale); // 2 - should return "locale" 
 

 
String.prototype.locale = "other locale"; 
 
test(String.locale); // 3 - should strill return "locale" 
 
test(String.prototype.locale); // 4 - should return "other locale" 
 

 
test("".locale); // 5 - "other locale" 
 
test(String("").locale); // 6 - "other locale" 
 
test((new String("")).locale); // 7 - "other locale" 
 

 
String.locale = "locale"; 
 
test((new String("")).locale); // 8 - still "other locale", "locale" variable is not used when creating objects from "String" thus it's lost in all instances of this constructor

注:

PHPStormはのみのプリミティブについて警告ようだ:

  • 文字列
  • ブール
  • ヌル(nullではない、ヌル)

それはIDE固有の動作です。カスタムオブジェクトについては通知しません。

EDIT いくつかの研究の後、私は間違っていると理解しました。私の答えはPHPStormの警告に関連していないようです。

プリミティブ変数を作成し、そのプロパティをprimitive.locale = "en-GB"のように設定し、primitive.localeでアクセスしようとすると、定義されません。それは警告があなたに伝えようとしていることです。私はまだ立っプリミティブについて語っ何

、PHPStormは約NumberStringBooleannullを通知します。以下

チェックコード:

var someBoolean = true; 
 
someBoolean.locale = "en-GB"; 
 
document.body.innerHTML += someBoolean.locale; 
 

 
document.body.innerHTML += "</br>"; 
 

 
var someString = "test"; 
 
someString.locale = "en-GB" 
 
document.body.innerHTML += someString.locale;

+0

ああ、ありがとう。私は今それをすべて理解していると思う。 – Brett

+0

@Brett私の編集を確認してください。 – Linek

+0

ありがとうありがとう。しかし、私が 'console.log(String.locale)'を実行したときに設定した値が出力されるので、間違いなく 'undefined 'になります。 – Brett

0

それとも、私の場合のように、あなたがそうのように、このエラーをトリガすることができます

const testObj = {}; 
testObj.name.first = 'jane'; 

我々が割り当て開始している前に、それは「名前」プロパティが定義されていたことを好きではありません。それに詰め込む。

関連する問題