В чем разница между заявкой и заявкой?

Я знаю, что это старый вопрос, но Google привел меня сюда недавно, поэтому я думаю, что другие тоже приходят сюда.

@chaos верен: есть INSERT ... ON DUPLICATE KEY UPDATE .

Однако исходный вопрос задавался специально о MySQL, а в MySQL существует синтаксис REPLACE INTO ... . IMHO, эта команда проще и проще использовать для upserts. Из руководства:

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE index, старая строка удаляется до того, как будет вставлена ​​новая строка.

blockquote>

Обратите внимание, что это не стандартный SQL. Пример из руководства:

CREATE TABLE test (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  data VARCHAR(64) DEFAULT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)

Изменить: просто справедливое предупреждение о том, что REPLACE INTO не похоже на UPDATE. Как говорится в руководстве, REPLACE удаляет строку, если она существует, а затем вставляет новую. (Обратите внимание на смешные «2 строки, затронутые» в приведенном выше примере). То есть он заменит значения столбцов всех существующей записи (а не просто обновит некоторые столбцы.) Поведение MySQL REPLACE INTO во многом похоже на поведение Sqlite INSERT OR REPLACE INTO. См. этот вопрос для некоторых обходных решений, если вы хотите обновить несколько столбцов (и не все столбцы), если запись уже существует.

2978
задан iridescent 11 July 2018 в 06:12
поделиться

5 ответов

Разница заключается в том, что apply позволяет вызывать функцию с аргументами arguments в качестве массива; call требует, чтобы параметры были перечислены явным образом. Полезным мнемоническим средством является "A для array и C для comma"

См. документацию MDN по применению и вызову .

Псевдосинтаксис:

theFunction. apply(valueForThis, arrayOfArgs)

theFunction.call(valueForThis, arg1, arg2, ...)

Также, начиная с ES6, существует возможность распространить массив для использования с функцией call, совместимость здесь.

Пример кода:

функция theFunction(name, profession) { console.log("Меня зовут " + имя + " и я " + профессия + "); } theFunction("Джон", "пожарный"); theFunction. apply(undefined, ["Susan", "школьный учитель"]); theFunction.call(undefined, "Claude", "mathematician"); theFunction.call(undefined, ...["Matthew", "физик"]); // используемая с оператором spread
3555
ответ дан 22 November 2019 в 19:47
поделиться

Различие Между Вызовом и Применяет в Javascript

Одну очень общую вещь, которая сбивает меня с толку при записи, что JavaScript знает, когда использовать вызов и когда использовать, применяются. Если Вы задаетесь вопросом, что эти методы или не знают, как объем работает в JavaScript, то могло бы иметь смысл читать Руководство JavaScript сначала.

Позволяют нам посмотреть на некоторые способы, которыми мы могли бы хотеть использовать их:

var person1 = {name: 'awadh', age: 22, size: '6 xM'};
var person2 = {name: 'ravi', age: 22000000000, size: '3 xS'};

var sayHello = function(){
alert('Hey, ' + this.name); }; 

var sayGoodbye = function(){
alert('Thanks, ' + this.name); };

Теперь при чтении руководства этот пример будет выглядеть действительно знакомым. Вы уже знали бы что при написании следующего кода:

sayHello();
sayGoodbye();

даст ошибки (если Вы будете удачливы), или просто неожиданные результаты (если Вы не). Это вызвано тем, что обе функции полагаются на свой объем для this.name данных, и вызов их без явного объема просто выполнит их в пределах текущего окна.

Поэтому, как мы определяем объем их? Попробуйте это:

sayHello.call(person1);
sayGoodbye.call(person2);
sayHello.apply(person1);
sayGoodbye.apply(person2);

Все четыре из этих строк делают точно то же самое. Выполнение sayHello или sayGoodbye или в пределах person1 или в пределах person2.

И вызов и применяются, выполняют очень похожие функции: они выполняют функцию в контексте или объем, первого аргумента, что Вы передаете им. Кроме того, они - оба функции, которые могут только быть вызваны на других функциях. Вы не собираетесь в способный выполнять person1.call (), и при этом не имеет никакого смысла делать так.

различие - когда Вы хотите отобрать этот вызов с рядом аргументов. Скажите, что Вы хотите сделать мнение () методом, это немного более динамично:

var say = function(greeting){
alert(greeting + ', ' + this.name);  
  };
    say.call(person1, 'Hey'); say.call(person2, 'Thanks');

, Таким образом, это - призыв к Вам. Это выполняет функцию в контексте первого аргумента, и последующие аргументы передаются в функцию для работы с. Таким образом, как это работает больше чем с одним аргументом?

    var update = function(name, age, size){
    this.name = name;
    this.age = age;
    this.size = size;
};

update.call(person1, 'chaurasia', 30, '4xM');

Никакое грандиозное предприятие. Они просто передаются функции, если требуется больше чем один параметр.

ограничения вызова быстро становятся очевидными, когда Вы хотите написать код, который не делает (или не был должен) знать количество аргументов что функции need†¦ как диспетчер.

    var dispatch = function(person, method, args){
    method.apply(person, args);
};

dispatch(person1, say, ['Hello']);
dispatch(person2, update, ['Slarty', 200, '1xM']);

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

, Таким образом, вот в чем разница между вызовом и применяется. Обоих можно назвать на функциях, которые они выполняют в контексте первого аргумента. В Вызове последующие аргументы передаются в функцию, как они, в то время как применяются, ожидает, что вторым аргументом будет массив, который это распаковывает как аргументы в пользу вызванной функции.

0
ответ дан 3 October 2019 в 21:07
поделиться

Позвольте мне добавить немного детали к этому.

эти два вызова почти эквивалентны:

func.call(context, ...args); // pass an array as list with spread operator

func.apply(context, args);   // is same as using apply

There’s только незначительные различия:

  • spread оператор... позволяет передавать повторяемый args как список для вызова.
  • Эти apply принимает только [1 122] подобный массиву args.

Так, эти вызовы дополнение друг друга. Где мы ожидаем повторяемый , call работы, где мы ожидаем подобный массиву , apply работы.

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

0
ответ дан 22 November 2019 в 19:47
поделиться

K. Скотт Аллен имеет хорошую запись .

В основном, они отличаются тем, как они обрабатывают аргументы функций.

Метод application() идентичен методу call(), за исключением того, что метод apply() требует массив в качестве второго параметра. Массив представляет собой аргументы целевого метода"

So:

// assuming you have f
function f(message) { ... }
f.call(receiver, "test");
f.apply(receiver, ["test"]);
222
ответ дан 22 November 2019 в 19:47
поделиться

Чтобы ответить на вопрос о том, когда использовать каждую функцию, используйте apply, если вы не знаете количество передаваемых аргументов, или если они уже находятся в массиве или массиве-подобном объекте (например, в объекте arguments) для пересылки собственных аргументов. В противном случае используйте call, так как нет необходимости обертывать аргументы в массив.

f.call(thisObject, a, b, c); // Fixed number of arguments

f.apply(thisObject, arguments); // Forward this function's arguments

var args = [];
while (...) {
    args.push(some_value());
}
f.apply(thisObject, args); // Unknown number of arguments

Когда я не передаю аргументы (как в вашем примере), я предпочитаю вызывать, так как я вызываю функцию. Применение apply будет означать, что вы применяете функцию к (несуществующим) аргументам.

Не должно быть никаких различий в производительности, за исключением случая, когда вы используете применить и обернуть аргументы в массив (например, f.apply(thisObject, [a, b, c]) вместо f.call(thisObject, a, b, c)). Я не тестировал его, так что могут быть различия, но это будет очень специфично для браузера. Скорее всего, call будет быстрее, если у вас еще нет аргументов в массиве и apply будет быстрее, если у вас есть.

155
ответ дан 22 November 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: