我正在使用国际化库l10n.js,看来你无法将值传递给库,告诉它在尝试获取翻译时要运行翻译的语言客户浏览器的价值;所以我被告知你是否真的要设置你需要做的事情的区域设置:
String.locale = 'en-GB';
就我而言,我正在做:
String.locale = $('html').attr('lang');
...就在文件的顶部。
这很有效,但在 PhpStorm 中,我收到警告:
分配给此原语的值将丢失
我检查了this question,并了解他们为什么收到警告,但我不确定 - 我基本上只是告诉我String.locale
的当前值会丢失?
答案 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似乎只对这些原语发出警告:
这是IDE特定的行为。它不会通知自定义对象。
修改强> 经过一些研究,我明白我错了。我的答案似乎与PHPStorm警告无关。
当你创建一个原始变量并设置它的属性时如此:primitive.locale = "en-GB"
并尝试通过primitive.locale
访问它,它将是未定义的。这就是警告试图告诉你的。
我所说的原语仍然有效,PHPStorm仅通知您Number
,String
,Boolean
和null
。
检查以下代码:
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'属性尚未定义的事实。