1 Востаннє редагувалося Betterthanyou (01.02.2018 06:02:15)

Тема: [не питання] Про eval

Я вже бачив дивну поведінку JS

наприклад це

null==0
результат false
null>0
результат false
null>=0
результат true

Це тому що об'єкт конвертується в число (це моя така думка, я її не перевірив...)

typeof(null)
результат "object"
typeof(0)
"number"

Якщо конвертувати об'єкт null в число то
Number(null)==0
результат true

тобто операція '>' конвертує об'єкт в число ..., напевно ..., я не перевіряв

але сьогодні знайшов ще дещо

В цьому куску коду є дві змінних 'myValue' одна локальна інша глобальна, зрозуміло що відповідь буде "1" тому що локальна змінна не впливатиме на глобальну

var myValue = 1;
(function() {
var myValue = 1;
eval('myValue = 2');
})();
alert(myValue);

а от майже такий самий код

var myValue = 1;
(function() {
var myValue = 1;
refEval = eval;
refEval('myValue = 2');
})();
alert(myValue);

але відповідь тут, вже буде "2"

так працювати не буде глобально

(eval)('something')

але можна застосовувати знак коми, отак

(0,eval)('something')

щоб код виконувався глобально
чи будь що інше що поверне eval

(true&&eval)('something')

кома в js

(0,eval)('myValue = 2')

той же результат 2

var myValue = 1;
(function() {
var myValue = 1;
(0,eval)('myValue = 2');
})();
alert(myValue);

Я трохи про це почитав та дізнався що є прямий доступ до eval і через посилання, так ось, (0,eval) якраз дає це посилання. Якщо так виконувати код (0,eval)('something') то це буде виконуватися в глобальній області.

тут можна почитати більше про eval

Подякували: koala, 221VOLT, /KIT\, leofun014

2

Re: [не питання] Про eval

Думав, що тут будуть якісь фокуси з this, але

eval('alert(this.constructor.name)')

і

(0,eval)('alert(this.constructor.name)')

дають один і той самий Window.
Тепер вже цікаво, яким чином перший eval дістається до локальної змінної.

Подякували: 221VOLT, Betterthanyou2

3

Re: [не питання] Про eval

ви десь там бачили щось типу

'use strict';

?

Подякували: Betterthanyou, leofun012

4

Re: [не питання] Про eval

Коротше, JS страшний. Переходьте на Rust.

Подякували: 221VOLT, Betterthanyou, leofun013

5

Re: [не питання] Про eval

koala написав:

Коротше, JS страшний. Переходьте на Rust.

або на erlang  :D

Подякували: koala, Betterthanyou2

6

Re: [не питання] Про eval

eval(''**'')       // 1
eval(''**'') === 1 // true
eval(''**'') ==  1 // true

'' - порожня стрічка,
** - в степені (pow), приводить '' до 0,
Я би казав 0**0 == NaN, але ладно най буде 0**0 == 1, якусь лоґіку сюда можна натягнути.

При цьому

eval(/^/**/^/)         // NaN
eval(/^/**/^/) === NaN // false
eval(/^/**/^/) ==  NaN // false

Потім я згадав шо (NaN == NaN) === false завжди.
В таких випадках треба кликати функцію isNaN(x)

      eval(/^/**/^/)  // NaN
isNaN(eval(/^/**/^/)) // true
isNaN(eval(/^/**/^/)) // true

7

Re: [не питання] Про eval

koala написав:

Коротше, JS страшний. Переходьте на Rust.

Всі мови страшні, особливо коли про них мало знати )
А на rust можна робити якісь веб застосунки (фронтенд)? Навіть якщо й можна то все рівно мусить компілюватись в js.
JavaScript everywhere, але треба переходити на TypeScript ))

8 Востаннє редагувалося mikeos (18.02.2025 10:40:42)

Re: [не питання] Про eval

221VOLT написав:
koala написав:

Коротше, JS страшний. Переходьте на Rust.

або на erlang  :D

Або щось ще краще - Esoteric programming language

Вже для себе приглягнув JSFuck

9

Re: [не питання] Про eval

mikeos написав:
koala написав:

Коротше, JS страшний. Переходьте на Rust.

Всі мови страшні, особливо коли про них мало знати )
А на rust можна робити якісь веб застосунки (фронтенд)? Навіть якщо й можна то все рівно мусить компілюватись в js.
JavaScript everywhere, але треба переходити на TypeScript ))

Є ще WebAssembly.

10

Re: [не питання] Про eval

koala написав:

Є ще WebAssembly.

Ну хіба що так. Ніколи не мав з ним справу, але здається що все рівно без js не обійтись коли треба доступ до browser api, dom.

Згадав часи коли були Java applets, це виглядає щось похоже.