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';

?

Подякували: Betterthanyou1

4

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

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

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

5

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

koala написав:

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

або на erlang  :D

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