LINUX.ORG.RU
ФорумTalks

Почему JS?

 


0

1

Почему на веб-страницах используется только JS и производные? Я знаю про попытки сделать python на js и запускать python скрипты на страницах, но почему браузеры по-умолчанию понимают только js?

★★★★★

Ответ на: комментарий от Shadow

Он выглядит, как императивный
На нем написать синхронный код (совместимый с асинхронный) сложнее, чем чисто асинхронный.

Потому что ты засрал себе мозги.
Какая тебе разница императивный или декларативный, пиши так как задачи это больше подходит (в JS можно и так и так).
Рантайм жует код в каком то совершенно произвольном и непрогнозируемом порядкеб поэтому писать надо так что бы куски поменьше зависили друг от друга и от глобалов.
Нет я конечно понимаю что записать все попорядку проще, и даже согласен отчасти что разбирать легче (хотя кому как), но переписывать потом такое - это жопа полная.

uin ★★★
()
Ответ на: комментарий от uin

Джава это язык того же порядка что и Си.

Не того же. Вообще не того же. Займись чем-нибудь другим лучше.

crutch_master ★★★★★
()
Ответ на: комментарий от quwy

Динамика это динамика, это когда у нас переменные такие коробочки в которые можно положить и поменять содержимое на все что угодно, тогда как в статике переменная это определенный тип, у которого есть значение.

И я не понимаю о каком безумии ты говоришь, под сегодняшним «безумием» подразумевают вот это https://developer.mozilla.org/en-US/docs/Web/API
какой язык сюда не приделай, хоть питон, хоть Алгол-68 KeyboardEvent() никуда не исчезнет, потому что он в коде браузера а не в языке.

uin ★★★
()
Последнее исправление: uin (всего исправлений: 1)
Ответ на: комментарий от Vit

Ну я в js Нуб. Сейчас пили себе что-то, что транслирует сложные модели python peewee в формы, совместимые с ангуляром. И генерит модели ангуляра. И вот ногу отстреливать ну очень легко.

Shadow ★★★★★
()
Ответ на: комментарий от uin

У меня все на большую rdbm завязано. Хочу увидеть сферические в вакууме relations, обрабатываем в произвольном порядке.

Shadow ★★★★★
()
Ответ на: комментарий от uin

Эй, полегче. Управление реакциями на события в Js легко и комфортно. Вот описание этих реакций - непростая задача.

Shadow ★★★★★
()

Потому что JS может использовать самый последний дебил, поэтому JS и победил. Не утруждайся так с вопросом, подыщи лучше транслятор, чем заниматься вбросом.

blue_trava
()
Ответ на: комментарий от Shadow

Управление реакциями на события в Js легко и комфортно. Вот описание этих реакций - непростая задача.

Лол, так вот что в JS не так - на нем приходится еще и писать, а не только функции из библиотек дергать.

uin ★★★
()
Ответ на: комментарий от Shadow

Синхронность, строгая типизация, тайпчекер, ide с автокомплитом, памперсы, слюнявчик, погремушка...

int64
()
Ответ на: комментарий от quwy

Я на js написал многие тысячи строк когда.

Это немного. Тысяча LOC — это неделя неспешного программирования.

язык — говно

Для столь громких заявлений должны быть не менее громкие аргументы.

его динамическая типизация — говно

Да как бы в Питоне не лучше, например.

С его помощью невозможно создать ничего нормального, и миллионы хипсторских говносервисов подтверждают это каждый день.

С его помощью можно создать приложения какой угодно сложности, и миллионы уже имеющихся приложений подтверждают это каждый день. GMail, например.

Wizard_ ★★★★★
()
Ответ на: комментарий от Shadow

На нем алгоритмы, как учили в школе или на блок-схемах, просто так не закодишь.

А какие проблемы?

Он выглядит, как императивный, но как зыбучий песок, такой же не настоящий.

Это называется «гибкий». И это, если правильно использовать, очень удобно и эффективно.

Но он не такой же, как остальные, он вообще другой.

Да, за то и любим мной, например :)

Но реализовать императивную блок-схему на асинхронном коде - тот еще извращение.

И тут мы плавно приходим к тому, что программистам на JS при программировании на JS нужно писать именно на JS, а не на фортране, си или джаве.

Wizard_ ★★★★★
()
Ответ на: комментарий от Shadow

От задач тоже зависит наверное, видимо мне пока везет. Тут надо уже что-то конкретное брать и смотреть, чтобы сказать наверняка.

Мне самому интересна статистика, когда пора валить на тайпскрипт.

Vit ★★★★★
()
Ответ на: комментарий от uin

Не совсем. Если не лезть в недра unsafe - у нас в разы меньше способов прострелить себе ногу.

Jefail ★★★★
()
Ответ на: комментарий от ekzotech

javascript и java это что-то родственное

Открой Википедию и узнай, что это таки что-то родственное. Что, впрочем, по названию ясно. Ясно даже, что именно у них родственное [скрытый текст: вендор]. Также, как по названию ясно, что это разные языки. Так что на самом деле даже Википедию читать не нужно. Достаточно понимать значение пробела (или его отсутствия) в языках и почувствовать имя собственное.

nightingale
()
Ответ на: комментарий от cvs-255

последние 2 вообще супер. Ты всерьез считаешь, что язык с таким поведением - адекватен?

Ты всерьез считаешь, что интерпретатор должен понимать все ЯП, включая живущий исключительно у тебя в голове?

nightingale
()
Ответ на: комментарий от cvs-255

В этом примере я явно указал привести тип.

О, Боже. Какой ты лжец. Нет никакого явного приведения в твоем пример. КАКАЯ-ТО МАГИЯ, и все меняет тип само собой!!!

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

Так вот, если ты не знаешь арифметики, это не значит, что она говно. Но если ты клеймишь говном все, что не понимаешь, то стоит задуматься, не являешься ли говном ты сам.

int64
()
Ответ на: комментарий от cvs-255

Но ведь его никто не любит. Почему бы не писать скрипты на каком-нибудь более адекватном языке

Это ты про php что ли?

А по теме - индустрия сделала выбор. JS сейчас повсюду. С приходом WASM, вообще будет бомба. В общем, зря ты так.

th3m3 ★★★★★
()
Ответ на: комментарий от cvs-255

Это нормально, потому что в JS на самом деле нет типов (ну почти нет), есть объекты которые говорят что они такие-то типы, но это не так

>> typeof []
<- "object"


Похоже когда то их хотели сделать (всмысле наделать конструкций объектов которые будут говорить что они конкретные типы), но потом передумали в виду того что переосмыслили значимость типов для языков такого уровня.
var date = new Date()  //--> Date "2016-10-05T05:09:33.000Z"

console.log(typeof date)  //--> "object"

console.log(date + "- test_test")  //--> "Wed Oct 05 2016 05:09:39 GMT+0000 (XXX) - test_test"


Объект который представляется строкой и ведет себя как строка, но при этом он не строка.
А что такое сама строка? Это хитрый объект который показывает и ведет себя как строка
 >> new String(-123)
 <- String { "-123", 0: '-', 1: '1', 2: '2', 3: '3', length: 4 }

 >> var abcd = "abcd"
 >> abcd.funct = function() {
    console.log(typeof abcd)
 }
 <- function abcd.funct()
 >> abcd.funct()
 <- x TypeError: abcd.funct is not a function

Но все свойства которые мы ему задаем как обычному объекту он выбрасывает

var aColl = document.getElementsByTagName("a")
/*  aColl: HTMLCollection [ <a#sitetitle>, <a>, <a>, <a>, <a>, <a>, <a>, <a>, <a>, <a>, ещё 237… ]  */

var sitetitle = document.querySelector("a#sitetitle")

aColl.indexOf(sitetitle);
//--> TypeError: aColl.indexOf is not a function


Серьезно, забудь о таких типах как int, float, string, char, они остались внизу, на уровне рантайма
В JS у тебя «типов» бесконечное множество
String
Number
Array
NodeList
HTMLCollection
ArrayBuffer
DataView
Date
...
SpiderMan
YuiHirasawa

uin ★★★
()
Последнее исправление: uin (всего исправлений: 3)
Ответ на: комментарий от uin

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

Shadow ★★★★★
()
Ответ на: комментарий от Wizard_

О да, на карте тоже надо ездить не как на седане с автоматом. Только почему-то все ездят на нормальных машинах.

Shadow ★★★★★
()
Ответ на: комментарий от Wizard_

А зачем ты так делаешь?

Потому что может! Гибко, молодежно.

Shadow ★★★★★
()

JS — это «глобальный и надёжный» в своей категории.

Valeg ★★★
()
Ответ на: комментарий от uin

Это не типов бесконечное множество ты описал, а сложных типов (классов, в понимании js).

Типов в js всего ничего

null
undefined
symbol
boolean
string
number
function
object

null и undefined являются константами представляющими сами себя.

symbol примитив, представляющий собой уникальное значение

boolean, string и number примитивы, имеющие литерал для своего объявления и объектный врапер. Каждый раз при вызове метода и свойства примитива он ищется в этом врапере. Можно считать что каждый раз когда ты делаешь что-то типа

'string'.ololo
в рантайме создается динамически объект, встроенным конструктором String, и свойство ololo ищется в нем, после чего объект сразу уничтожается. Именно поэтому нельзя сделать
x = 'string'; x.ololo = 1
Потому что у примитива нет никакого постоянного объекта, есть лишь враппер. А (new String) вернет уже полноценный объект, у которого тайпоф будет объект, а инстансоф - String

Последние два типа function и object являются сложными типами, которые образуют все остальные. При чем в твоем списке ты перечислил именно конструкторы, которые вернуться по instanceof но у объекта вообще может не быть конструктора, но при этом может быть длинная цепочка прототипов. При этом такой объект все е будет иметь тип object но instanceof Object вернет false

Короче говоря, типы в js есть, и их строго определенное количество. А все остальные строятся из них.

Именно поэтому у тебя [] это объект - не считаешь ли ты что массив то примитив?

А HTMLCollection это не массив, и в его прототипе не определен никакой метод indexOf, поэтому нет ничего странного в твоем примере. Если тебя так смущает, что у него доступ к элементам по числовому индексу, так это универсальность акссесеров js.

({0:1})[0] // 1
К слову, сами массивы [] и объекты {} под капотом движка создаются одними и теми же примитивами, с той лишь раницей, что по разному оптимизируются. (например, массивы содержащие значения одного типа, оптимизированны лучше).

int64
()
Ответ на: комментарий от x3al

Нет, отдельный тип function

вы опять путаете типы и классы. Функция имеет тип function но по цепочке прототипов наследуется от Object

typeof (i => {}) //function
(i => {}) instanceof Function //true
(i => {}) instanceof Object //true

Разницу между typeof и instanceof уловите.

int64
()
Ответ на: комментарий от int64

Забыл написать в самом начале, что typeof null возвращает object, и это единственное несовсем очевидное легаси поведение которое мне встречалось за 15 лет кодинга на js. Но, даже оно вполне себе адекватно объяснимо при желании. Так как у объектов цепочка наследования начинается именно с null (он стоит во главе всего), а наследоваться и наследовать можно только то, что имеет typeof - object, это вполне логично.

int64
()
Ответ на: комментарий от int64

можно только то, что имеет typeof - object/function

самофикс.

int64
()

Данная тема раскрыта у первоисточника - по ТЗ требовалось «чтобы типа Java», и в очень сжатые сроки.

CaptainFarrell
()
Ответ на: комментарий от cvs-255

сишечка плоха тем, что если ее компилировать в бинарник, она слишком много сможет.

сама по себе? может всё-таки от кривости рук кодера зависит, дорогуша?

darkenshvein ★★★★★
()
Ответ на: комментарий от int64

typeof часто врёт.

function — всего лишь специальный объект, поэтому не является базовым типом (как и Error, Array и прочие).

x3al ★★★★★
()
Ответ на: комментарий от x3al

typeof не врет. врете вы. вернее просто не понимаете разницы между typeof и instanceof

Error и Array это не базовые типы. НЕ ТИПЫ,

int64
()
Ответ на: комментарий от x3al

Любой объект, примитив, константа имеет тип. Но тип типа не имеет. Тип это неделимая, абстрактная сущность.

Error, Array и прочие

Это объекты с типом function. Это объекты, а не типы.

int64
()
Ответ на: комментарий от x3al

Я к тому, что говорить, что function это частный случай object, крайне неверно.

В сущности да, function это callable object, но это не частный случай типа object, а отдельный, независимый тип.

Любой function может вести себя как Объект, но ни один Объект не может вести себя как function

int64
()
Ответ на: комментарий от int64

Любой function может вести себя как Объект, но ни один Объект не может вести себя как function

Любой Array может вести себя как объект, но ни один объект не может вести себя как Array.

Вообще — http://www.ecma-international.org/ecma-262/7.0/index.html#sec-ecmascript-data... держи. Найди там function.

x3al ★★★★★
()
Ответ на: комментарий от x3al

но ни один объект не может вести себя как Array.

Это ложь. Мало того, что это легко делается наследованием от Array так и без этого, можно сэмулировать любое поведение массива для объекта.

Найди там function.

Читай раздел про typeof Там описана разновидность by implements

int64
()
Ответ на: комментарий от int64

можно сэмулировать любое поведение массива для объекта.

Proxy? Да и то — частично.

Читай раздел про typeof

typeof — не про базовые типы.

Базовые типы — это

An ECMAScript language type corresponds to values that are directly manipulated by an ECMAScript programmer using the ECMAScript language. The ECMAScript language types are Undefined, Null, Boolean, String, Symbol, Number, and Object. An ECMAScript language value is a value that is characterized by an ECMAScript language type.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Proxy? Да и то — частично.

При чем тут прокси.

Скажи мне, какое поведение массива ты не можешь сэмулирвовать на обычно объекте?

Базовые типы — это

про specification types ты конечно не знаешь

int64
()
Ответ на: комментарий от int64

Скажи мне, какое поведение массива ты не можешь сэмулирвовать на обычно объекте?

Всё, что указано здесь, начиная с length.

про specification types ты конечно не знаешь

A specification type corresponds to meta-values that are used within algorithms to describe the semantics of ECMAScript language constructs and ECMAScript language types. The specification types are Reference, List, Completion, Property Descriptor, Lexical Environment, Environment Record, and Data Block. Specification type values are specification artefacts that do not necessarily correspond to any specific entity within an ECMAScript implementation. Specification type values may be used to describe intermediate results of ECMAScript expression evaluation but such values cannot be stored as properties of objects or values of ECMAScript language variables.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Всё, что указано здесь, начиная с length.

Лол, и что именно тебе мешает это имитировать, я не понимаю тебя. Ты не умеешь делать методы объекта, чтобы реализовать concat\forEach\map\etc, или не знаешь о геттерах, сеттерах, чтобы сделать length? Или что у тебя там не получается? Итератор? Пиши конкретнее.

int64
()
Ответ на: комментарий от x3al

Если тебе надо, чтобы built-in методы принимали твой кастомный объект как за родной массив, например Array.isArray, так используй наследование, Люк. class YourCustomArray extends Array {}

Но это никакого отношения к поведению не имеет, так как Array.isArray проверяет не является ли объект массивом или ведет себя как массив, а является ли объект подлинным экземпляром Array.

Для имитации поведения, ты в своем YourCustomArray должен реализовать свой метод YourCustomArray.isYourCustomArray, который бы проверял точно ли это твой кастомный array а ни какой-нибудь еще.

int64
()
Ответ на: комментарий от int64

Понятно, ты просто не знаешь спецификацию.

В двух словах: Function — не сильно более специальный объект, чем Array или Error и не является отдельным типом точно так же, как Array и Error не являются ими. typeof не возвращает тип, и спецификация напрямую это говорит.

Ты не умеешь делать методы объекта, чтобы реализовать concat\forEach\map\etc, или не знаешь о геттерах, сеттерах, чтобы сделать length? Или что у тебя там не получается? Итератор? Пиши конкретнее.

var myArray = new myArray(1, 2, 3);
var extendedArray = [4, 5].concat(myArray);

До ES6 тупо нет способа реализовать myArray так, чтобы это работало (полифиллы/babel не помогут). Ну, кроме возврата настоящего Array из myArray, но тут будут другие недостатки.

x3al ★★★★★
()
Последнее исправление: x3al (всего исправлений: 1)
Ответ на: комментарий от cvs-255

Я не программист, но если в а

>> a='1'
1
лежит строка, то результат
>>> a+1
11
вполне логичен, но, чёрт побери, почему тогда
>>> a-1
0

З.Ы. хотел было изучить js для одной игры, где управление производится js скриптами, плюс можно получить навыки, которые потом пригодятся для веба, тем более, что везде уверяют, что выучить js можно легко, почитав несколько страниц с описанием синтаксиса и примерами, но прочитав описание и глянув на примеры, я решил забить на игрушку и прочее и изучать С или что-то подобное, компилируемое.

flyshoot
()
Ответ на: комментарий от uin

Его любят все кто с ним работает.

просто мерзость, а не язык. без подсветки синтаксиса и IntelliSense с ним вообще работать невозможно. PHP и то лучше как язык будет.

Loki13 ★★★★★
()
Ответ на: комментарий от int64

А HTMLCollection это не массив, и в его прототипе не определен никакой метод indexOf

Да я знаю, но его легко дописать

HTMLCollection.prototype.indexOf = function(match) {
   var index = -1;

   for ( var i = 0; i < this.length; i++ ) {
      if (match === this[i]) {
          index = i;
          break;
      }
   }

   return index;
}


А по поводу типов можно спорить бесконечно, но полезней принять что их нет.
Я вообще воспринимаю как вот на реакте пишут <a title"Joht">1121-131-456</a> и потом это конваертируется в React.createElement("a" ... ) так же и JS в плюсокод (ну или на чем бызироваться будет) превращается в рантайме, а типы и все вот это что/с чем можно спаривать он сам расставил где как надо, разработчику думать об этом уже не надо. То есть как бы еще более высокоуровневая надстройка над языком. Как вот lua С.

uin ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.