作为一个对象的属性,布尔为原始类型和布尔值之间的区别是什么?

我正在关注一些画布教程。 下面的代码是这个的一个片段。

在这个片段中,为什么他们不会选择runAnimation作为一个简单的布尔值? 我认为x = !x语句无论如何都会起作用,但是当我尝试更改代码以使用布尔值时,代码无法工作。

那么,作为一个对象的属性,布尔为原始和布尔值之间的区别是什么?

   /*
   * define the runAnimation boolean as an object
   * so that it can be modified by reference
   */
  var runAnimation = {
    value: false
  };

  // add click listener to canvas
  document.getElementById('myCanvas').addEventListener('click', function() {
    // flip flag
    runAnimation.value = !runAnimation.value;

所有参数都通过JavaScript中的“value”传递。 这意味着当传递参数时,会传递存储在变量中的副本。

基元 (如布尔值)存储它们表示的实际数据,因此,当传递一个基元时,会发送一份数据副本,从而产生两份数据副本。 更改为一个,不会影响其他。

但是,当将一个对象分配给一个变量时,变量将存储该对象可以找到的位置的内存位置,而不是该对象本身。 将对象作为参数传递会导致传递内存地址的副本。 在这些情况下,您可能会得到两个存储相同内存地址的变量,因此无论使用哪个变量,同一个基础对象都会受到影响。

在你的场景中,你当然可以只使用一个布尔变量来工作,但是看起来教程希望将它封装到一个对象中,以便布尔数据的副本不会四处浮动,并且偶然发生的意外改变一个变量而不是另一个。

这里有一些基本的例子:

// This function takes a single argument, which it calls "input"
// This argument will be scoped to the function.
function foo(input){
  // The function is going to alter the parameter it received
  input = input + 77;
  console.log(input); 
}

var input = 100;  // Here's a higher scoped variable also called "input"

foo(input);       // We'll pass the higher scoped variable to the function

// Now, has the higher level scoped "input" been changed by the function?
console.log(input);  // 100 <-- No, it hasn't because primitives pass a copy of their data

// ************************************************

// Now, we'll do roughly the same thing, but with objects, not primitives
function foo2(obj){
  obj.someProp = 100;
  console.log(obj.someProp);
}

var obj = {
  someProp : 50
};

foo2(obj);

// Here, we see that the original object has been changed by the funciton we passed it to
console.log(obj.someProp);
链接地址: http://www.djcxy.com/p/3533.html

上一篇: What's the difference between a boolean as primitive and a boolean as property of an object?

下一篇: Pass Variables by Reference in Javascript