JS超经典面试题

260 阅读3分钟

在平时做题中遇到了几个有意思的经典题目,由易到难给大家整理了一下(末尾有彩蛋)

一、JavaScript 中的强制转型

在 JavaScript 中,两种不同的内置类型间的转换被称为强制转型。强制转型在 JavaScript 中有两种形式:显式和隐式

这是一个显式强制转型的例子:

var a = "42";
var b = Number( a );
a; // "42" -- 是个字符串
b; // 42 -- 是个数字!

这是一个隐式强制转型的例子:

var a = "42";
var b = a * 1; // "42" 隐式转型成 42 
a; // "42" -- 是个字符串
b; // 42 -- 是个数字!

二、JavaScript中“==”和“===”的区别。

JavaScript 中有严格比较和类型转换比较:

严格比较(例如 ===):在不允许强制转型的情况下检查两个值是否相等;
抽象比较(例如 ==):在允许强制转型的情况下检查两个值是否相等。

举个栗子:

var a = "42";
var b = 42;
a == b; // true
a === b; // false

那么在什么场景下使用它们呢?

  1. 如果被比较的任何一个值可能是 true 或 false,要用 ===,而不是 ==;
  2. 如果被比较的任何一个值是这些特定值(0、“”或 []),要用 ===,而不是 ==;
  3. 在其他情况下,可以安全地使用 ==。它不仅安全,而且在很多情况下,它可以简化代码,并且提升代码可读性。

三、匿名函数和命名函数区别

var foo = function() { // 赋给变量 foo 的匿名函数
 // ..
};
var x = function bar(){ // 赋给变量 x 的命名函数 bar
 // ..
};
foo(); // 实际执行函数
x();

我将他们简单划分就是那个function后面的()紧贴前面的,如果()前面没有就是匿名函数,如果有就是命名函数。

四、this的指向

在 JavaScript 中,this 是指正在执行的函数的“所有者”,或者更确切地说,指将当前函数作为方法的对象。

function foo() {
 console.log( this.bar );
}
var bar = "global";
var obj1 = {
 bar: "obj1",
 foo: foo
};
var obj2 = {
 bar: "obj2"
};
foo(); // "global"
obj1.foo(); // "obj1"
foo.call( obj2 ); // "obj2"
new foo(); // undefined

js中有两个方法可以改变this指向call和apply

apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。

call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法

五、稀疏数组与Array.filter

var ary = [0,1,2];
ary[10] = 10;
ary.filter(function(x) { return x === undefined;});

答案:[]
解析: 这边的ary 是一个稀疏数组,index从3到9都没有定义,所以ary[3~9]的值是undefined(可以在chrome tool里通过ary[index]来查看),那么乍一看这个题的答案应该是返回7个undefined组成的数组。
但是这里返回的是[],原因在于filter函数的作用。

彩蛋:

哈哈哈 偶然遇到个很有意思的题目分享一下

[1 < 2 < 3, 3 < 2 < 1]

答案: true, true

解析:1<2<3 等价于1<2=> true; true<3 => 1<3=> true; 3<2=> false; false<1 => 0<1=> true.