【问题标题】:Value assigned to primitive will be lost in PhpStorm when setting value of String.locale设置 String.locale 的值时,分配给原语的值将在 PhpStorm 中丢失
【发布时间】:2017-03-15 03:48:59
【问题描述】:

我正在使用国际化库 l10n.js,您似乎无法将值传递给库以告诉它您要在哪种语言上运行翻译,因为它试图从中获取值客户端浏览器;所以有人告诉我,如果你真的想设置你需要做的事情的语言环境:

String.locale = 'en-GB';

就我而言,我正在做:

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

...就在文件的顶部。

这可行,但是在 PhpStorm 中我收到以下警告:

分配给该原语的值将丢失

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

【问题讨论】:

  • 您能否提供更多背景信息,例如您设置String.locale 的方式和位置?
  • @Linek 已更新。

标签: javascript phpstorm


【解决方案1】:

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

String 不是 JavaScript 语言中的原语。在这里为String 的属性赋值是安全的,因为String 函数是object

我想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

【讨论】:

  • 现在一切都说得通了 :)
【解决方案2】:

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;

【讨论】:

  • 好的,谢谢。但是,当我执行console.log(String.locale) 时,它会输出我设置好的值,所以绝对不是undefined
  • @Brett 因为String 不是原语,它是一个函数。这似乎是来自PHPStorm 的虚惊一场。报告它可能是个好主意。
  • 好的,我明白你现在在说什么了 :)
【解决方案3】:

或者,就我而言,您可以像这样触发此错误:

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

它不喜欢在我们开始为它分配东西之前尚未定义“name”属性的事实。

【讨论】:

    猜你喜欢
    • 2016-10-21
    • 2016-11-22
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2017-08-27
    • 2014-09-13
    相关资源
    最近更新 更多