【问题标题】:Javascript - Which data is stored in "var" and how its content/storage is changedJavascript - 哪些数据存储在“var”中以及如何更改其内容/存储
【发布时间】:2017-11-11 14:45:09
【问题描述】:

我正在学习 JS,对变量很困惑:

短篇小说:浏览器如何确定var标签下的数据类型,它们如何确定var下数据类型的存储要求标签,当两种不同类型的数据一个接一个地分配给同一个变量时会发生什么?为什么这些变量都在 var 名称下扭曲?如果 JS 有不同类型的数据,如整数、字符串等,那会更有意义。

长篇大论: 通常,当我们要声明一个变量时,我们定义它的类型:整数、字符串或字符等。这样,我们确保为变量分配了足够的存储空间,并且大多数时候,该特定变量有一些特殊的函数类型。在 JS 中,变量 - 显然也包括函数 - 只是在 var 名称下使用。因此,我们以 var 名称存储任何内容。我的问题是:浏览器/JS 编译器如何区分变量中的数据类型为字符串/字符等,它们如何确定该数据所需的位长,以及它们如何处理哪些函数适合该数据?当我先将一个整数分配给该变量,然后再分配一个字符串时会发生什么?另外,定义不同类型的变量不是更容易吗?

我是 JS 的初学者,所以请放轻松。干杯!

【问题讨论】:

  • 欢迎学习 JavaScript,你问过一个问题,在我看来是什么让 JS 成为最好的和最差的。
  • Javascript 有类型,它只是动态类型而不是静态类型。而且我认为对于像 JS 这样的语言来说,你的想法太低了。除非您正在编写引擎,否则这不是您应该担心的事情。
  • 优点是你不必担心类型,除非你在处理浮点数。几乎所有内容都将被隐式转换。这可能会导致一些奇怪的结果,但会导致代码更短。不利的一面是,您将遇到一些在编译时无法捕捉到的类型和类型转换错误。但是更短的语法和自动转换极大地弥补了这一点。每次我必须像 SQL 代码那样编写时我都会哭,我必须重新编写每个结果并最终得到 5 行,这在 JS 中将是一行。如果您确实需要静态类型,请查看 typescript。
  • 另外请记住,JS 会自动在其堆内进行所有内存分配。所以你永远不必手动喜欢 malloc。例如,无论数字有多长或具有哪种类型,它们都存储为(无)有符号的 32 位浮点数。

标签: javascript


【解决方案1】:

JS 中的变量是手动无类型的。

正如@DontVoteMeDown 提到的那样;它们是动态类型的:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures

作为开发人员,您有责任管理您的类型并控制您的 JS 变量。

【讨论】:

  • 实际上变量是有类型的,它们只是Dynamically typed。这就是typeof() 存在的原因。
  • 涵盖术语“无类型”的使用:stackoverflow.com/questions/964910/…。与说 JS 没有类型有关。
  • @DontVoteMeDown 不,声明完全没问题。 变量没有类型。价值观。
  • 我已经更新了我的回答,使我的陈述更加正确。
【解决方案2】:

这真的很宽泛,所以我会分解它。

浏览器如何判断var标签下的数据类型

JavaScript 运行时引擎可以通过分配的类型(文字或其他变量)来确定变量类型。这与在编译时需要类型信息的编译语言不同。

他们如何确定 var 标签下数据类型的存储要求

这部分在规范中定义,部分是特定于实现的。例如,var i = 0 是一个数字,但其实现方式取决于 JavaScript 运行时引擎。

当两种不同类型的数据同时分配给同一个变量时会发生什么?为什么这些变量都在 var name 下被扭曲了?

你实际上不能同时分配,但你可以一个接一个地分配。第二次赋值的时候,值和类型都变了!

var o = 5; // variable 'o' is a number with value 5
o = 'Hello'; // variable 'o' is a string with value 'Hello'
o = {foo: 'bar'}; // variable 'o' is an object with value {foo:'bar'}

如果 JS 有不同类型的数据,如整数、字符串等,那会更有意义。

JavaScript 确实有不同的类型!

JavaScript 是一种松散类型动态语言。这意味着您不必提前声明变量的类型。在处理程序时自动确定类型。

例子:

var o = 5;
console.log(typeof o); // number
o = 'Hello';
console.log(typeof o); // string
o = {foo: 'bar'};
console.log(typeof o); // object

我强烈建议阅读MDN Data Structures docs 了解更多信息。

【讨论】:

  • 不,解析器没有为var 声明找出任何类型。引擎可能会进行类型推断,但这不是解析的一部分。
【解决方案3】:

Javascript 是松散类型的。这意味着变量没有针对开发人员的特定类型。这并不意味着变量没有系统的类型。

我们看下面的例子:

var string = "foo";
var number = 2;
var boolean = true;
var object = {rhymes: "on blue"};
console.log(typeof string); //string type
console.log(typeof number); //number type
console.log(typeof boolean); //boolean type
console.log(typeof object); //an object

//you can also "reassign" a new type to a variable just by reassigning a new value:

var string = 2;
console.log(typeof string) //number type

这里你看到系统确实知道变量的类型。

系统也不太关心类型。就像字符串或对象没有预定义的位长一样,因为它们的值和/或长度是任意的。

我们称之为功能,这是 Javascript 的一大优势,但它也可能是 a** 的痛点。

如果你想同时使用松散类型和强类型(如果你必须定义一个类型)这两者中最好的部分,你应该学习 Typescript。这只是 Javascript 的超集,可以编译为纯 Javascript,但提供类型。

【讨论】:

    【解决方案4】:

    JavaScript 变量没有类型,但它们的值确实有类型。可以为相同的变量分配新值。

    var i;  
    console.log(typeof i);
    i = true; 
    console.log(typeof i);
    i = 0;      
    console.log(typeof i);
    i = "hello";
    console.log(typeof i);

    就内存分配而言,它很好地解释了here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2011-10-30
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 2021-05-04
      相关资源
      最近更新 更多