每日一题(五八)const a=[1,2,3]b=[1,2,3]c=[1,2,4]d =2, e=11console.log([a==b,a===b,a大于c,a小于c,d大于e])

写出正确的打印结果并解释原因:

const a = [1,2,3],
      b = [1,2,3],
      c = [1,2,4],
      d = "2",
      e = "11";
console.log([a==b,a===b,a>c,a<c,d>e]);

答案:

[false, false, false, true, true]

解析:

1、JavaScript 有两种比较方式,严格比较运算符和转换类型比较运算符。

对于严格比较运算符(===)来说,仅当两个操作数的类型相同且值相等为 true ,而对于被广泛使用的比较运算符(==)来说,会在进行比较之前,将两个操作数转换成相同的类型。对于关系运算符(比如<=)来说,会先将操作数转换成原始值,使他们类型相同,再进行比较运算。

当两个操作数都是对象时,JavaScript 会比较其内部的引用,当且仅当他们的引用指向内存中的相同对象(区域)时才相等,即他们在栈内存中的引用地址相同。

JavaScript 中的 Array 也是对象,所以这里 a , b , c 的引用显然是不相同的,所以这里 a == b  , a === b 都为 false 。

2、两个数组进行大小比较,也就是两个对象进行比较。

当两个对象进行比较时,会转为原始类型的值,算法是先调用 valueOf 方法;如果返回的还是对象,再接着调用 toString 方法。

1> valueOf() 方法返回指定对象的原始值。

你很少需要自己调用 valueOf() 方法;当遇到要预期的原始值对象时,JavaScript 会自动调用它。默认情况下,valueOf 方法由 Object 后面的每个对象继承。每个内置的核心对象都会覆盖此方法以返回适当的值。如果对象没有原始值,则 valueOf 返回对象本身。

2> toString() 方法返回一个表示该对象的字符串。

每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 方法返回 "[object type]",其中 type 是对象的类型。(例如我们想要准确的判断数据类型:Object.prototype.toString.call(type))

3> 经过 valueOf , toString 的处理,所以这里 a,c 最终会被转化为 "1,2,3"  "1,2,4";

3、两个字符串比较大小

上边的数组经过转换为字符串后,接着进行大小比较。

MDN 这样描述:字符串比较则是使用基于标准字典的 Unicode 值来进行比较的。

字符串按照字典顺序进行比较。JavaScript 引擎内部首先比较首字符的 Unicode 码点,如果相等,再比较第二个字符的 Unicode 码点,以此类推。

所以这里 "1,2,3"  <  "1,2,4",输出 true ,因为前面字符的 Unicode 码点都相等,所以最后比较 3 和 4 的码点。而 3 的 Unicode 码点是 51,4 的 Unicode 码点是 52,所以 a<c。"2" > "11" 也是同理

猜你喜欢

转载自blog.csdn.net/MFWSCQ/article/details/106526939