November 28, 2018

饿了么 Nodejs 面试题

原文:https://github.com/ElemeFE/node-interview/tree/master/sections/zh-cn

JavaScript 基础问题

类型判断

关键字: typeofinstanceoftoStringconstructor

Value               function   typeof
-------------------------------------
"foo"               String     string
new String("foo")   String     object
1.2                 Number     number
new Number(1.2)     Number     object
true                Boolean    boolean
new Boolean(true)   Boolean    object
new Date()          Date       object
new Error()         Error      object
[1,2,3]             Array      object
new Array(1, 2, 3)  Array      object
new Function("")    Function   function
/abc/g              RegExp     object
new RegExp("meow")  RegExp     object
{}                  Object     object
new Object()        Object     object 

参考:

作用域

一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量。这套规则被称为作用域。

let 与 var 的区别,这里有一个有趣的问题:let到底有没有提升?

let x; // 此时 x 为 undefined
x = 1;

{ // block scope
  console.log(x) // Uncaught ReferenceError: x is not defined
  let x = 2
}

let 在创建的时候会到块顶部,从块顶部到该变量的初始化语句,这块区域叫做 TDZ(临时死区)。初始化没有提升。

参考:

const:不一定是常量

const obj = {a:1}
obj.a=2
obj.b=2

是可行的,

const obj = {a:1}
obj = {a:2}

不可行

参考:https://read.douban.com/reader/ebook/12051836

引用传递

[1] == [1] // false

两个数组是不同对象。

== 会做一次类型转换。

参考:Javascript 中 == 和 === 区别是什么? - 云澹的回答 - 知乎
https://www.zhihu.com/question/31442029/answer/53641960

关于传递引用和引用传递。
按值传递(call by value)是最常用的求值策略: 函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。

参考:

浅拷贝和深拷贝也是一个点。