【问题标题】:Change value of a wrapped primitive data type更改包装的原始数据类型的值
【发布时间】:2011-05-03 05:44:47
【问题描述】:
var test = new Boolean(0)
test.prop = "OK!"

你能把test的值改成true吗?

test.prop 仍应为“OK!”

换句话说,test 应该是同一个对象

【问题讨论】:

    标签: javascript types object


    【解决方案1】:

    对象包装器在 JS 中创建一个不可变的引用类型。由于在 JS 中原始数据类型是不可变的,它们的引用也应该是不可变的。它可能对一些罕见的情况有用,但很可能无法做你想做的事。例如,如果您需要更改源原始值并观察引用以跟随它,则无法使用 Object 构造函数来实现所需的效果。那么您最好的选择是避免使用 Object 构造函数,并使用适当的对象字面量在属性下保存原始值,如下所示;

    var pv = "test",
       pvr = {0: pv},
       arr = new Array(5).fill().map(_ => pvr);
    console.log(JSON.stringify(arr));
    pvr[0] = "Hello";
    console.log(JSON.stringify(arr));

    【讨论】:

      【解决方案2】:

      内置对象包装器(使用BooleanNumberStringDate 构造函数创建)将原始包装值存储在名为[[PrimitiveValue]] 的内部属性中,该属性无法更改,但是。 ..

      您可以覆盖 test 对象的 valueOf 方法:

      var test = new Boolean(0);
      test.prop = "OK!"
      // override valueOf:
      test.valueOf = function () { return true; };
      
      if (test == true) { // using the equals operator explicitly for type conversion
        alert(test.prop); //"OK!"
      }
      

      它将起作用,因为 valueOf 方法在内部由 equals 运算符触发的类型转换机制使用。

      当其中一个操作数是布尔值时,两者都在末尾转换为数字。

      如果我们不使用等号运算符(例如if (test) { ... }),由于test是一个对象,当直接转换为布尔值时,它总是会产生true

      任何转换为​​布尔值的对象都将产生true 值,唯一可以产生false 结果的值是“假”值(nullundefined0NaN , 一个空字符串,当然还有false 值),其他任何东西都会产生true

      更多信息:

      【讨论】:

      • 虽然字符串表示仍为false,因为基础值并没有真正改变..
      • @Gaby,好吧,这取决于类型转换是如何进行的,例如,如果你将一个字符串连接到它,例如test+'' 结果仍然是 'true'valueOf 将首先使用),如果您使用 String 构造函数作为函数,例如:String(test); 它将调用 Boolean.prototype.toString 方法。我同意,最好也覆盖 toString
      • 啊非常好..我刚刚提醒了值alert(test),它显示false。看起来 alert 方法使用 String 构造函数或在其参数上调用 toString .. 感谢您的注意。
      【解决方案3】:

      没有。

      var test = new Boolean(0);
      

      创建一个新对象并将其引用放在“测试”中

      test.prop = 'ss'
      

      在对象上动态放置一个新属性(元编程 FTW!)

      test = true;
      

      将 test 分配给布尔原始类型。对布尔对象的引用丢失。

      最后,布尔对象似乎没有任何方法来切换或重新分配其值,即布尔对象是不可变的。

      但是,如果需要,您可以向 Boolean.prototype 添加一个方法来更改它....

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        • 2021-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-16
        相关资源
        最近更新 更多