下面运行结果是什么?
var a = [1, 2, 3],
b = [1, 2, 3],
c = [1, 2, 4];
console.log(a == b);
console.log(a === b);
console.log(a > c);
console.log(a < c);
运行结果为:false false false true
-
对于
console.log(a == b);
因为a
和b
都是数组,是object
类型,object
类型在进行==
比较时,比较的是对象的引用地址是否相同,很明显,a
和b
不是同一个对象,所以引用地址不同,故返回false
。 -
对于
console.log(a === b);
===
运算符要求两边值和数据类型都要相同,a
和b
的数据类型都是object/Array
,但是由于上面的分析可知,a
和b
的值并不相同,所以也是返回false
。 -
对于
console.log(a > c);
数组进行>
或者<
运算比较时,首先要调用valueOf()
方法进行转换成基本类型的值,因为valueOf()
方法返回的仍然是数组,所以要继续调用toString()
方法进行转换,返回值为数组元素用逗号连接的字符串。于是等价于console.log(a.toString() > c.toString())
,即console.log("1,2,3" > "1,2,4")
。相当于是两个字符串在比较大小,而字符串比较大小时,是字符串从左到右依次转换成 ASCII 码进行比较,前面 "1,2," 相同,所以实际上是比较 "3" 和 "4" 的 ASCII 码值的大小。很明显 "3" 的 ASCII 码比 "4" 的 ASCII 码小,所以返回false
。 -
对于
console.log(a < c);
同上分析,返回true
。
下面运行结果是什么?
var two = 0.2;
var one = 0.1;
var eight = 0.8;
var six = 0.6;
[two - one == one, eight - six == two]
运行结果为:[true, false]
几乎所有语言在进行浮点数四则运算时都会出现精度误差的问题(只不过像 Java 等这些语言已经处理过了,所以误差不那么明显)。这是因为计算机的运算是二进制的,很多小数在转换成二进制时是无限循环的,但计算机不支持无限循环,所以得根据支持的精度进行舍入处理。
- 0.2 的二进制为
0.00110011...001101
- 0.1 的二进制为
0.000110011...001101
因此:
0.2 - 0.1 == 0.1
是true
0.8 - 0.6 == 0.2
是false
下面运行结果是什么?
var a = '8' + 2;
var b = '8' - 2;
运行结果为:82 6
- 字符串和任何类型相加,都会变成字符串拼接,运算时自动先把其他类型转换成字符串类型。
- 任何类型和
Number
类型做减法,先把其他类型转换成Number
类型,转不了的则为NaN
。
下面运行结果是什么?
(function(){
var x = y = 1;
})();
console.log(y);
console.log(x);
运行结果为:1 error
这个题目是变量提升和连等赋值问题。首先连等操作符是从右向左赋值的,y = 1; var x = y;
。变量 x
是用 var
进行声明并赋值的,所以是局部变量,变量 y
是未用 var
声明的变量,在 JavaScript 中是一个隐式全局变量。所以在外面 console.log(y)
会输出 1
,而 console.log(x)
会报错,显示 x is not defined
。
评论区