Изменить значение обернутого примитивного типа данных - PullRequest
7 голосов
/ 01 ноября 2010
var test = new Boolean(0)
test.prop = "OK!"

Можете ли вы изменить значение test на true?

но test.prop все равно должно быть "ОК!"

другими словами, test должен быть тем же объектом

Ответы [ 3 ]

7 голосов
/ 01 ноября 2010

Встроенные оболочки объектов (созданные с помощью конструкторов Boolean, Number, String и Date) хранят примитивное упакованное значение во внутреннем свойстве с именем [[PrimitiveValue]], которое нельзя изменить, но. ..

Вы можете переопределить метод valueOf вашего test объекта:

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, являются значения "falsey" (null, undefined, 0, NaN , пустая строка и, конечно, значение false), все остальное выдаст true.

Дополнительная информация:

1 голос
/ 01 ноября 2010

Нет.

var test = new Boolean(0);

создает новый объект и помещает ссылку на него в 'test'

test.prop = 'ss'

динамически помещает новое свойство в объект (метапрограммирование FTW!)

test = true;

назначает тест логическому типу примитива.Ссылка на логический объект потеряна.

Наконец, логический объект, по-видимому, не имеет каких-либо методов для переключения или переназначения своего значения, то есть логические объекты являются неизменяемыми.

Однако вы можете добавить метод в Boolean.prototype, чтобы изменить его, если хотите ....

0 голосов
/ 08 декабря 2016

Обертки объектов создают неизменяемый ссылочный тип в 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...