侧边栏壁纸
  • 累计撰写 225 篇文章
  • 累计创建 275 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

前端面试题(五)

DGF
DGF
2018-03-16 / 0 评论 / 0 点赞 / 15 阅读 / 0 字

下面运行结果是什么?

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); 因为 ab 都是数组,是 object 类型,object 类型在进行 == 比较时,比较的是对象的引用地址是否相同,很明显,ab 不是同一个对象,所以引用地址不同,故返回 false

  • 对于 console.log(a === b); === 运算符要求两边值和数据类型都要相同,ab 的数据类型都是 object/Array,但是由于上面的分析可知,ab 的值并不相同,所以也是返回 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.1true
  • 0.8 - 0.6 == 0.2false

下面运行结果是什么?

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

0

评论区