Becausethis.props
andthis.state
may be updated asynchronously, you should not rely on their values for calculating the next state.
this.setState(
(state) => ({test: !state.test}),
() => console.log(this.state.test)
);
class Human {
constructor(name) {
this.name = name
}
sayHelloWorld() {
console.log(this.name + ' says: Hello, World!')
}
sayHelloBob() {
console.log(this.name + ' says: Hello, Bob!')
}
sayHelloAlice() {
console.log(this.name + ' says: Hello, Alice!')
}
}
class Human {
constructor(name) {
this.name = name
}
sayHello(name) {
console.log(`${this.name} says: Hello, ${name}!`)
}
sayHelloWorld() {
this.sayHello('World')
}
sayHelloBob() {
this.sayHello('Bob')
}
sayHelloAlice() {
this.sayHello('Alice')
}
}
foo.x = foo = {n: 2};
foo.x = (foo = {n: 2});
{ n: 2 }
.let foo = {};
const bar = foo;
foo.x = (foo = {n: 2});
console.log(foo.x === undefined); // true
console.log(bar); // { x: { n: 2 } }
console.log(bar.x === foo); // true
foo.x =
- присваивание свойства конкретному объекту. На момент вызова в нашем примере это {}
.foo =
- присваивание значения самому идентификатору foo. Это может быть примитив, ссылка на объект или функцию. В нашем случае это объект { n: 2 }
. Стрелочные функции не создают собственный контекст this, а используют значение this окружающего контекста.© mdn
let group = {
prop: false,
d: function () {
return (() => {
this.prop = true;
return this.prop;
})();
},
};
console.log(group.d()); // true
console.log(group); // {prop: true, d: ƒ}
f( "a.goal", x)
x
, а x.a
:var x = {
a: {
goal: 1,
b: 2,
},
c: 3
};
function f(value, chain) {
if(chain.length === 0) return value;
const propsArray = chain.split('.'); // "a.goal" => ["a", "goal"]
const property = propsArray[0];
if(!value.hasOwnProperty(property)) return; // несуществующее свойство
return f(value[property], propsArray.slice(1).join('.')); // вызыв функцией самой себя
// но цепочка свойств короче на 1 элемент – самый левый отрезали
}
console.log( "Result:", f(x, 'a.goal')); // 1