Удивительно, что никто не упоминает хорошее старое разделение по модулю 2:
In : x = (x + 1) % 2 ; x
Out: 1
In : x = (x + 1) % 2 ; x
Out: 0
In : x = (x + 1) % 2 ; x
Out: 1
In : x = (x + 1) % 2 ; x
Out: 0
Обратите внимание, что это эквивалентно x = x - 1
, но преимущество метода по модулю заключается в том, что размер группы или длина интервала может быть больше, чем только 2 элемента, что дает вам аналогичную циклическую схему чередования для циклического перехода.
Теперь только для 2, переключение может быть немного короче (с использованием битового оператора):
x = x ^ 1
PersonX = function(){};
Помещает ссылку на анонимную функцию на PersonX
. PersonX
указывает на функцию.
PersonY = new function(){};
Помещает ссылку на вновь созданный экземпляр анонимной функции-конструктора в PersonY
. PersonY
указывает на объект.
Что касается прототипа, у него есть PersonY
. Однако, поскольку не было никаких свойств и методов, связанных с конструктором до или после экземпляра, у него есть пустой прототип *.
Фактически вы можете проверить прототип PersonY
, выполнив console.log(PersonY)
. Вы увидите, что у него есть свойство прототипа (я вижу его как __proto__
в Chrome), который является «пустым». Но он имеет 2 скрытых свойства, constructor
, который является конструкторской функцией, создавшей объект, и другой __proto__
, который ведет вас к следующей «цепочке», которая будет объектом Object
.
* Не совсем пустая, так как прототип - это цепочка. Этот уровень прототипа может быть пустым, но следующий более высокий прототип может иметь или в этом случае иметь свойства и методы.
Object prototype -> Constructor prototype -> Your Instance will have:
- toString() - blank - toString()
- hasOwnProperty() - hasOwnProperty()
- and more... - and more...
- ...but nothing from Constructor
Это потому, что на самом деле это объект, созданный в памяти как копия функции; прототип действительно имеет смысл только в контексте создания экземпляра, поэтому после его создания нет логической конструкции для того, что это значит.