饿了么 Nodejs 面试题
原文:https://github.com/ElemeFE/node-interview/tree/master/sections/zh-cn
JavaScript 基础问题
类型判断
关键字: typeof
、 instanceof
、 toString
、 constructor
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(临时死区)。初始化没有提升。
参考:
- http://www.infoq.com/cn/articles/es6-in-depth-let-and-const
- let到底有没有提升?https://zhuanlan.zhihu.com/p/28140450
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)是最常用的求值策略: 函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。
参考:
浅拷贝和深拷贝也是一个点。