Как и в последнем отрывке, я постараюсь перечислить различия и объяснить их простым английским языком и примерами. Прочитав оба отрывка, вы сможете без проблем понять синтаксис Javascript.

1.
Предварительно скомпилированный или некомпилированный,
Статический или динамический тип,
Сильный или слабый тип

Перед запуском на JVM Java необходимо скомпилировать в байт-код - файл .class. Это означает, что наш код будет проверяться компилятором, и как только мы определим тип переменной, мы не сможем изменить его позже.

Следующий фрагмент кода Java вызовет ошибку компилятора несовместимых типов. Как только мы объявим «текст» как String, мы сможем сохранить только переменную String, мы не сможем хранить больше ничего. Это «Статический тип»

//Java code snippet - compiler error of — incompatible types
String text = "abc";
text = 5;

Следующий фрагмент кода Java вызовет ошибку компилятора - неверные типы операндов для двоичного оператора.
В последней строке мы пытаемся выполнить некоторую арифметическую операцию с текстом, это не удалось, Java отказалась преобразовывать текст «5» в число 5, поэтому люди сказали, что это «Strong Type

//Java code snippet - compiler error of — bad operand types for //binary operator
String textFive = "5";
int numberFive = 5;
int result = textFive * numberFive;

Напротив, Javascript компилируется на лету, код интерпретируется нашим браузером только во время выполнения. Это обеспечивает большую гибкость, как и тип переменной, которую мы можем изменить во время выполнения.

Это нормально в Javascript. Мы можем сохранить String в переменной «text», а позже мы можем сохранить число. Это «Динамический тип»

//Javascript code snippet - working!
let text = 'abc';
text = 3;

Это нормально и в Javascript. В последней строке мы пытаемся выполнить некоторую арифметическую операцию с текстом, это успешно, Javascript помогает нам преобразовать текст «3» в число 3, поэтому люди сказали, что это «слабый тип»

//Javascript code snippet - working!
let textThree = '3';
let numberThree = 3;
let result = textThree * numberThree;
//It outputs 9!
console.log(result);

2. Принятие недостающих аргументов

В большинстве языков программирования, включая Java, следующий фрагмент кода будет рассматривать ошибку, потому что функция имеет 3 аргумента, и мы передаем меньше аргументов (2 и 1), но Javascript принимает это и использует undefined для отсутствующих аргументы

Следующий фрагмент кода вызовет ошибку компилятора - фактические и формальные списки аргументов различаются по длине.

//Java code snippet - compiler error of actual and formal argument //lists differ in length
class Playground {
    public static void main(String[ ] args) {
        System.out.println("Hello Java");
        
        showVar(1);
    }
    
    public static void showVar(int a, int b, int c) {
        System.out.println(a + " " + b + " " + c);
    }
}

Это нормально в Javascript

//Javascript code snippet - working!
function logVar (a, b, c) {
   console.log(a, b, c)
}
//print 1 2 undefined
logVar(1, 2);
//print 1 undefined undefined
logVar(1);

3. Подъем

Начиная с ES6, он вводит let и const, но некоторые из наших существующих проектов все еще используют var

В Java следующий фрагмент кода вызовет ошибку компилятора - ошибка: невозможно найти имя символа, потому что мы используем переменную имени до того, как мы ее объявили.

//Java code snippet - compiler error — error: cannot find symbol 
System.out.println("Hello " + name);
String name = "Johnny";

Это нормально в Javascript

//Javascript code snippet - working!
//print undefined instead of error
console.log(name);
var name = "fifi";

Сзади Javascript понимает такой код

var name = undefined;
console.log(name);
name = "fifi";

Это называется подъемом, при котором Javascript автоматически перемещает объявление переменной наверх.

Технически let и const имеют схожее поведение, но они ничем не инициализируются, поэтому, если вы попытаетесь использовать их перед объявлением, вы получите ошибку (похожую на Java).

4. Сфера применения

В Java переменные находятся в области видимости блока. Рассмотрим следующий фрагмент кода Java. Мы получили ошибку, потому что оператору system.out не удалось получить доступ к переменной имени в блоке If.

//Java code snippet - compiler error — error: cannot find symbol
if (true)   {
    String name = "Johnny";
}
        
System.out.println("Hello " + name);

Однако в Javascript var - это область действия функции, а не область блока. В этом случае объявление в блоке If ничем не отличается от глобального.

//Javascript code snippet - working!
if (true)    { 
    var name = 'fifi'; 
}
//print fifi
console.log(name);

Область действия функции означает, что переменные, объявленные внутри функции, не могут получить доступ за пределами

//Javascript code snippet - Uncaught ReferenceError: fifi is not //defined
function initName() {
    var name = fifi;
}
initName();
console.log(name);

Let и Const - это область видимости блока (которая аналогична Java), что означает, что переменные, объявленные в фигурных скобках {}, не имеют доступа извне, в этом случае она включает область видимости функции.