当设置String.locale的值时,分配给原语的值将在PhpStorm中丢失

时间:2016-11-24 11:52:22

标签: javascript phpstorm

我正在使用国际化库l10n.js,看来你无法将值传递给库,告诉它在尝试获取翻译时要运行翻译的语言客户浏览器的价值;所以我被告知你是否真的要设置你需要做的事情的区域设置:

String.locale = 'en-GB';

就我而言,我正在做:

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

...就在文件的顶部。

这很有效,但在 PhpStorm 中,我收到警告:

  

分配给此原语的值将丢失

我检查了this question,并了解他们为什么收到警告,但我不确定 - 我基本上只是告诉我String.locale的当前值会丢失?

3 个答案:

答案 0 :(得分:5)

它看起来像是PhpStorm类型推理系统的误报。

String不是JavaScript语言中的原语。由于String函数是String,因此可以安全地为object的{​​{1}}属性赋值。

我认为Value assigned to this primitive will be lost的关键思想可以用代码来描述:

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

在JavaScript中有5种原始类型:undefined,null,boolean,string和number。基元不是对象,也没有属性。如果JavaScript检测到尝试将属性分配给基元,则它确实会将基元强制转换为对象。但是这个新对象没有引用,并且会立即成为垃圾收集的饲料。因此,分配给基元的值将丢失。 link

答案 1 :(得分:1)

PHPStorm警告您创建String的对象。每个新实例都不包含locale变量,因为它未在String.prototype中声明。下面的代码应该解释它。

var index = 1;
function test(value) {
	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(不是Null,null)

这是IDE特定的行为。它不会通知自定义对象。

修改 经过一些研究,我明白我错了。我的答案似乎与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;

答案 2 :(得分:0)

或者,就像我的情况一样,你可以像这样触发这个错误:

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

在我们开始为其分配内容之前,它还不喜欢'name'属性尚未定义的事实。