isequal (or also == FWIW) only compares the value. It ignores many other properties of the object being compared.
As examples.
julia> a = [1, 2, 3]; b = 1:3
1:3
julia> isequal(a, b)
true
julia> push!(a, 1)
4-element Array{Int64,1}:
1
2
3
1
julia> push!(b, 1)
ERROR: MethodError: no method matching resize!(::UnitRange{Int64}, ::Int64)
Closest candidates are:
resize!(::Array{T,1} where T, ::Integer) at array.jl:1016
resize!(::BitArray{1}, ::Integer) at bitarray.jl:773
Stacktrace:
[1] _append!(::UnitRange{Int64}, ::Base.HasLength, ::Tuple{Int64}) at ./array.jl:920
[2] append!(::UnitRange{Int64}, ::Tuple{Int64}) at ./array.jl:914
[3] push!(::UnitRange{Int64}, ::Int64) at ./array.jl:915
[4] top-level scope at REPL[4]:1
julia> isequal(0x1, 1)
true
julia> -0x1
0xff
julia> -1
-1
OTOH, is (or ===) checks if the two objects are the same one. There is not a general way to compare if the two objects “behaves identically” since that’s not really a well defined concept anyway…