Python.v.JavaScript

JavaScript for Pythonistas. Python for JavaScripters

Типы и сравнение

Python и JavaScript — языки с динамической типизацией. Переменные не имеют типов, но их значения — имеют. Преобразование типов данных (явное и неявное) может привести к различным сюрпризам, особенно если вы переходите с Python на JavaScript.

Python Javascript
Преобразование чисел и строк #
a = '32'
b = 7
a + b
Exception: TypeError
can only concatenate str (not "int") to str
a * b
'32323232323232'
a = '32'
b = 7a + b;
327
a - b;
25
a * b;
224
a / b;
4.571428571428571
Неявное преобразование списка в строку #
first_list = [1, 2, 10]
second_list = [5, 3]
first_list + second_list
[1, 2, 10, 5, 3]
var first_array = [1, 2, 10];
var second_array = [5, 3];first_array + second_array;
1,2,105,3

Ой. Что это, Бэрримор? А вот что: если оператор + видит что-то, что он не может сложить (то есть не два числа), то он превращает все свои аргументы в строки и дальше их конкатенирует (как строки).


var first_array = [1, 2, 10];
var second_array = [5, 3];first_array.concat(second_array);
[ 1, 2, 10, 5, 3 ]
Сравнение и приведение типов #
a = '12'
b = 12
if a == b:
    print("a is equal to b")
else:
    print("a is not equal to b")
if str(a) == str(b):
    print("str(a) is equal to str(b)")
if int(a) == int(b):
    print("int(a) is equal to int(b)")
a is not equal to b
str(a) is equal to str(b)
int(a) is equal to int(b)
var a = '12';
var b = 12;
if (a == b) {
    console.log("a is equal to b",
                "(coercions allowed)");
}
if (a === b) {
    console.log("a is strictly equal to b", 
                "(coercions are not allowed)");
}
if (Number(a) === Number(b)) {
    console.log("Number(a) is equal", 
                "to Number(b)");
}
if (String(a) === String(b)) {
    console.log("String(a) is equal", 
                "to String(b)");
}
a is equal to b (coercions allowed)
Number(a) is equal to Number(b)
String(a) is equal to String(b)
Особые случаи в сравнении #
[] == 0
False
[] == False
False
"" == []
False
"" == 0
False
[] == 0;
true
[] == false;
true
"" == [];
true
"" == 0;
true
Сравнение списков / массивов #
first_list = [1, 2, 3]
second_list = [1, 2, 3]
third_list = first_list
first_list == second_list
True
first_list == third_list
True
first_list is second_list
False
first_list is third_list
True

Списки сравниваются поэлементно. Если вы хотите убедиться, что две переменные указывают на один и тот же список, а не просто на списки, совпадающие поэлементно, необходимо использовать оператор is.

var first_array = [1, 2, 3];
var second_array = [1, 2, 3];
var third_array = first_array;first_array == second_array;
false
first_array === second_array;
false
first_array == third_array;
true
first_array === third_array;
true
first_array == "1,2,3";
true
first_array === "1,2,3";
false

Если оба аргумента оператора сравнения (== или ===) являются массивами (или любыми другими объектами), то результат сравнения является истиной только в том случае, когда оба аргумента являются одним и тем же объектом. Поэлементного сравнения не производится. Если один из аргументов сравнения является строкой, а другой объектом (например, массивом), и используется сравнение с разрешенным приведением типов (==), то объект приводится к строковому представлению и затем сравниваются строковые представления. Если используется === и аргументы имеют разный тип (строка и список), то возвращает false. О том, как сделать поэлементное сравнение, см. в этом треде.

Числовые типы #
a = 2
b = 2.0
type(a)
<class 'int'>
type(b)
<class 'float'>
a == b
True
type(a) == type(b)
False
my_list = [0, 10, 20, 30]
my_list[b]
Exception: TypeError
list indices must be integers or slices, not float

Python различает целые числа (int) и числа с плавающей запятой (float). В некоторых контекстах допустимы числа одого из этих типов (например, в качестве индексов списков могут выступать только целые числа).

var a = 2;
var b = 2.0;typeof(a);
number
typeof(b);
number
a === b;
true
typeof(a) === typeof(b);
true
var my_array = [0, 10, 20, 30]my_array[b];
20

В JavaScript целые числа и числа с плавающей запятой не различаются. (На самом деле, все числа являются числами с плавающей запятой.)

© Ilya V. Schurov and contributors, 2017
Licenses: CC BY (text), MIT (code).
contribute on github