<template>
<button
class="btn btn1"
:class="{'active-btn': currentActive === 'limit'}"
@click="currentActive='limit'">
Limit
</button>
<button
class="btn btn2"
:class="{'active-btn': currentActive === 'market'}"
@click="currentActive='market'">
Market
</button>
</template>
<script>
export default {
data() {
return {
currentActive: 'limit'
}
}
}
</script>
data: () => ({
currencies: [
{ title: 'рубль', rate: 1, val: 0 },
{ title: 'доллар', rate: 62.65, val: 0 },
{ title: 'евро', rate: 60.90, val: 0 },
],
}),
methods: {
onInput({ rate, val }) {
this.currencies.forEach(n => n.val = val * rate / n.rate);
},
},
<div v-for="n in currencies">
<input
v-model.number="n.val"
@input="onInput(n)"
type="number"
min="0"
>
{{ n.title }}
</div>
const createPromiseLoop = promises => {
let index = 0;
const attach = (...args) => {
promises[index++](...args)
.then((...args) => attach(...args));
index %= promises.length;
};
return (...args) => {
attach(...args);
};
};
const sleep = (duration = 0) => new Promise(resolve => setTimeout(resolve, duration));
const loop = createPromiseLoop([
(number) => new Promise(async resolve => {
await sleep(100);
console.log(`Number plus one. Received: ${number}`);
resolve(number + 1);
}),
(number) => new Promise(async resolve => {
await sleep(100);
console.log(`Number multiply two. Received: ${number}`);
resolve(number * 2);
}),
]);
loop(1);
/*
'Number plus one. Received: 1'
'Number multiply two. Received: 2'
'Number plus one. Received: 4'
'Number multiply two. Received: 5'
'Number plus one. Received: 10'
'Number multiply two. Received: 11'
'Number plus one. Received: 22'
'Number multiply two. Received: 23'
'Number plus one. Received: 46'
'Number multiply two. Received: 47'
'Number plus one. Received: 94'
'Number multiply two. Received: 95'
'Number plus one. Received: 190'
'Number multiply two. Received: 191'
'Number plus one. Received: 382'
'Number multiply two. Received: 383'
'Number plus one. Received: 766'
'Number multiply two. Received: 767'
'Number plus one. Received: 1534'
'Number multiply two. Received: 1535'
'Number plus one. Received: 3070'
'Number multiply two. Received: 3071'
'Number plus one. Received: 6142'
'Number multiply two. Received: 6143'
'Number plus one. Received: 12286'
'Number multiply two. Received: 12287'
'Number plus one. Received: 24574'
*/
Схема в доке v8 говорит что у int всего 2 типа, int32 и unit32, а int8, int16, float32 etc. есть только у массивов.
int
не может быть float
(=Handle<Object> Factory::NewNumber(double value, AllocationType allocation) {
// Materialize as a SMI if possible.
int32_t int_value;
if (DoubleToSmiInteger(value, &int_value)) {
return handle(Smi::FromInt(int_value), isolate());
}
return NewHeapNumber(value, allocation);
}
Второй вариант более оптимальный, так как мы даем понять интерпретатору что нужно сразу выделить больше ячеек памяти, так как число с плавающей точкой. Насколько это правда?
HeapNumber
(aka "большой Number", но не путать c BigInt) и складываются, а ссылка начинает указывать на новый объект (даже в случае укороченной записи, ибо a += b
<=> a = a + b
).TF_BUILTIN(Add, AddStubAssembler) { // Операция сложения
....
BIND(&if_left_smi); // Левый операнд - "маленький" int
{
.....
BIND(&if_right_heapobject); // Правый операнд - HeapNumber
{
....
var_left_double.Bind(SmiToFloat64(left));
var_right_double.Bind(LoadHeapNumberValue(right));
Goto(&do_double_add);
.....
} // if_right_heapobject
} // if_left_smi
....
BIND(&do_double_add);
{
Node* value = Float64Add(var_left_double.value(), var_right_double.value());
Return(AllocateHeapNumberWithValue(value));
}
}
Это больше академический интерес, хочу разобраться как оно работает.
function toggleMe() {
// я кажется начинаю понимать ОТ кого придумали typescript...
var a = 0; // если логика подразумевает логический тип, зачем init-значение число?
return function() {
if(a = true) { // это условие всегда будет истинно, независимо от a, в a сохраним значение true
a = false;
} else if (a = false) { // в принципе тоже что и выше, но еще этот код не достижим
a = true;
}
return a;
}
}
var a = toggleMe(); // в a извлекли функцию с замыканием
var b = a(); // в b будет false
console.log(b);
console.log(b); // а второй лог что-то меняет? нет
function toggleMe() {
var a = 0;
return function() {
if(a = true) {
a = false;
} else a = false /* удаляем недостижимый код if (a = false) {
a = true;
} */
return a;
}
}
function toggleMe() {
var a = 0;
return function() {
a = true
a = false;
/* этот if разворачивается однозначно
if(a = true) {
a = false;
} else a = false */
return a;
}
}
function toggleMe() {
var a = 0;
return function() {
return false;
/* незачем это вычислять каждый раз, все и так однозначно
a = true
a = false;
return a; */
}
}
// если вызвать этот код несколько раз:
var a = toggleMe();
var b = a();
console.log(b);
console.log(b);
// то оптимизатор в конце концов сократит его до
console.log(false);
console.log(false);
// а функцию выкинет совсем
function toggleMe() {
var a = false;
return function() {
return a = !a;
};
}
var b = toggleMe();
console.log(b());
console.log(b());
let obj = {
"viewport" : {
"key" : {
"lat" : 47,
"lng" : 39
},
"southwest" : {
"lat" : 47,
"lng" : 39
},
"one" : {
"keygen" : 47,
"lng" : 39
}
}
}
function deepSearch (object, key, predicate) {
if (object.hasOwnProperty(key)) {
return object
}
for (let i = 0; i < Object.keys(object).length; i++) {
if (typeof object[Object.keys(object)[i]] === 'object') {
let o = deepSearch(object[Object.keys(object)[i]], key)
if (o != null) return o
}
}
return null
}
const result = deepSearch(obj, 'keygen');
console.log(result); // {keygen: 47, lng: 39}
*{
box-sizing: border-box;
}
.grid{
display: flex;
flex-wrap: wrap;
margin: 0 -20px;
}
.block{
width: 100%;
max-width: calc(25% - 40px);
flex: calc(25% - 40px);
margin: 0 20px;
margin-top: 20px;
border: 1px solid #ccc;
padding: 10px 20px;
display: flex;
flex-direction: column;
&__desc{
display: flex;
flex: 1 1 100%;
flex-direction: column;
}
&__title{
display: block;
margin-bottom: 10px;
}
&__text{
margin: auto 0 0;
}
}
import glob from 'glob'
import path from 'path'
{
plugins: [
...glob.sync('src/html/*.html')
.map(html => new HtmlWebpackPlugin({
filename: path.basename(html),
template: html
}))
]
}