Разные Языки, Разные Парадигмы
Когда вы работаете с разными языками одновременно, важно отметить, что, хотя большинство языков основаны на C, каждый язык имеет свой собственный набор правил и парадигм, связанных с ним, что делает подобные соглашения разными.
Java и JavaScript, хотя и имеют Java общее, являются совершенно разными языками 1 . Как таковой, то, как они обращаются с примитивными ценностями 2 , функции и методы, аргументы и параметры также различаются.
Работа с объектами и методами в Java
Java – это Объектно-ориентированный язык программирования , который в основном означает создание объектов как части класса, создание экземпляра объекта и добавление методов к объекту для фактического выполнения действий с вновь созданными объектами. Затем вы можете сделать свой код более модульным, добавив и вызвав функции, которые каким-то образом манипулируют кодом. 3
Вы можете создать такой объект, как:
public class Dog { int dogAge; public Dog(string name) { System.out.println("My dog's name is " + name " ."); } public void setAge (int age) { dogAge = age; } public int getAge() { System.out.println("My dog is " + dogAge + " years old"); return dogAge; } public static void main (String []args) { /* Create an object using the new keyword */ Dog myDog = new Dog("Max"); myDog.setAge(11); // setAge is a class method on the object Dog myDog.getAge(); System.out.println(myDog.dogAge); } }
Здесь у нас есть класс и новый объект Dog
с несколькими методами получения и установки для объекта Dog
.
Это стандартный материал Java ООП. JavaScript – это не язык ООП, это прототипный язык, который создает прототипы объектов для расширения объектов с помощью прототипного наследования вместо классического наследования, такого как Java. 4
Работа с объектами и методами в JavaScript
Объекты в JavaScript не создаются так же, как в Java. По крайней мере, не технически, и это:
function Car() { const car1 = new Car(); }
следует избегать. 5
Мы можем создать объектный литерал, такой как:
const myObject { foo: 'bar', car: 'Mazda', age: 38 }
и добавьте методы к объекту, такие как:
myObject.car = 'Honda';
и передайте их другим методам, таким как console.log:
console.log(myObject.car);
Передача по значению в JavaScript
Единственное, что вы можете передать по значению в JavaScript, – это примитивные типы данных.
Передача по значению означает, что у вас есть две переменные в памяти, которые назначены друг другу. Например:
var a; var b = 8; var a = b; console.log(b); // will return 8
Что происходит, когда мы передаем эти примитивы по значению, мы создаем копию значения переменной b
, хранящейся в памяти, скажем, по адресу 0x001, и присваиваем его a
, хранящемуся по адресу 0x002. Оба a
и b
отражают друг друга, поскольку они являются просто копиями друг друга. Это то, что имеется в виду, когда мы говорим, что передаем по значению в JavaScript.
Передача по значению в Java
Возьмите этот фрагмент кода:
int y = 10; changeMeToSix (y); System.out.println(y); // [...some code] void changeMeToSix (int x) { x = 6; }
Это не выводит 6. Он печатает 10. Почему? Потому что в метод было передано только значение 10, а не сама переменная.
Другой пример:
Dog myDog;
На самом деле это не dog, а указатель на экземпляр Dog в памяти. Так что, если у нас есть:
public void foo (Dog yourDog) { yourDog.setName("Sparky"); yourDog = new Dog("Max"); yourDog.setName("Jeffie"); }
Допустим, параметр your Dog
находится по адресу памяти 0x001.
За первой строкой следует Dog
, на который она указывает, который является объектом Dog
с 0x001. Этой собаке предлагается сменить имя на Sparky по тому же адресу 0x001.
Во второй строке создается новый Dog
по другому адресу, скажем, 0x006. Мы присваиваем параметру your Dog
адрес памяти 0x006.
В последней строке за вашей собакой следует новый Dog
, на который она указывает в 0x006. Этот Пес
меняет свое имя на Джеффи
. Затем он возвращается.
моя Собака
не изменилась. my Dog
- это указатель в памяти, который указывает на исходный адрес 0x001, а не на фактический
Dog
Вы можете передавать ссылки на параметры с помощью value а не сами фактические ссылки.
Передать по ссылке JavaScript
Передача по ссылке в JavaScript может происходить только с объектами. Это включает в себя функции, поскольку функции являются первоклассными объектами в JavaScript. 6
Передача по ссылке предполагает наличие двух ссылок, указывающих на один и тот же объект в памяти. Это означает, что вы можете изменять и объект или функцию, присваивая их другому объекту или передавая его в качестве параметра функции. Возьмите этот код:
// by reference (all objects (including functions)) const greet = { greeting: 'hi' }; const greet1; greet1 = greet; greet.greeting = 'hello'; // mutates to hello console.log(greet); console.log(greet1); // by reference (even as parameters) function changeGreeting(obj) { obj.greeting = 'What's up?'; // mutates to What's Up } changeGreeting(greet1); console.log(greet); console.log(greet1); // equals operator sets up new memory address greet = { greeting: 'Yo' }; console.log(greet); // Mutates to Yo console.log(greet1);
…..и так далее.
Понимание разницы между передачей по значению и передачей по ссылке является ключом к пониманию того, как работают объекты и примитивы JavaScript.
Передача по ссылке в Java?
Вы не можете передавать по ссылке в Java. Как выразился Джон Скит :
Передача по ссылке смешивает входные и выходные данные кода. Это фундаментальная проблема с техникой. В Java программист может предположить, что переменные не изменят своего значения при передаче в качестве параметров методу. В языках с семантикой передачи по ссылке это базовое предположение не может быть сделано.
Передача по ссылке путает интерфейс с методом. Методы, написанные с использованием семантики передачи по ссылкам, могут иметь чрезвычайно сложные интерфейсы, которые клиентским программистам трудно изучить и понять.
Исключение передачи по ссылке было дизайнерским выбором. Это удовлетворяет потребность в некоторых языках, таких как JavaScript, но может создавать проблемы в других.
Это Было Давно
Извините за длину! Если вам есть что добавить, оставьте комментарий ниже. Дайте мне знать, если я ошибаюсь или ошибаюсь. Я не против.
ОБНОВЛЕНИЕ: Я полагаю, вы не можете повторно объявить переменную с помощью let в примере передачи по значению в JS. Поэтому я подошел к консоли, немного поработал с консолью и решил использовать вар хотя оно датировано. Все еще изучаю ES6.
ОБНОВЛЕНИЕ 2: Итак, я узнал, что вы не можете передавать по ссылке в JavaScript, хотя это именно то, чему меня учили, хотя и неправильно. Вы можете передать ссылку на другой объект, но вы не можете передать по ссылке в JavaScript.
Этот пост был первоначально размещен в моем блоге Просто еще один блог разработчиков
Однако оба языка основаны на C. ↩
И Java, и JavaScript имеют примитивные типы. Java имеет строго типизированные примитивные значения. Смотрите этот пост//для типов данных Java. ↩ Технически, в Java вы можете использовать метод и функцию взаимозаменяемо но мне действительно не нравится это делать. Смотрите
этот ответ . ↩ Эрик Эллиот
много говорил об этом . Проверьте это на предмет наследования различий между двумя языками. ↩ Это создание объекта с использованием конструктора JavaScript и ключевого слова
new
, имитирующего наследование ООП в JavaScript. Дуглас Крокфорд
рекомендует вам избегать этого. ↩ Подробнее в другом посте.↩
Оригинал: “https://dev.to/tiffany/javascript-vs-java-pass-by-value-and-reference”