下面运行结果是什么?
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是true0.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。
评论区