-
Notifications
You must be signed in to change notification settings - Fork 441
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
你有必要知道的 25 个 JavaScript 面试题 #17
Comments
关于第 5 题严格模式下的好处我看到过另外一个版本大致是说:使用严格模式会增加代码检查的步骤并降低代码的执行效率,通常情况下在开发时使用严格模式,而在发布到生产环境时去掉严格模式的定义。与文中所述的“提高编译器效率,增加运行速度”完全相反。不知道哪个版本才是正确可行的,望指教,谢谢。 |
还漏掉了一些 ES6 特性,比如 12 题可以用剩余参数实现,避免访问性能不佳的 arguments。 |
mark |
reverse() 会改变数组本身,并返回原数组的引用。不是返回原数组吧,返回的是颠倒后的数组 |
赞! |
第一条,用 obj.constructor 和 arr.constructor 也可以区分,不过 null 不行。 |
第19条,'0'不是false。另外,如果能顺便解释一下[]==![]就更好了 |
@honwenle 第二个问题可以直接参考这篇文章:https://www.h5jun.com/post/why-false-why-true.html |
@jerrybendy 谢谢耐心解答,对于==我看过很多资料,还是不能完全理解,不过尽量都用===就好了 |
|
谢谢~作为初学者学到了很多! |
这些题目在笔试的时候应该会出现 |
只有我觉得这些东西出在面试题中没什么必要么.... |
老铁说的有道理👏 |
赞 虽然工作中 一查就到 但是…… 面试考需要瞬间答上来 所以……还是看吧 明白其中原理的同学也不能松懈 毕竟 过一阵子不看又忘了-_-# |
第七題 |
@honwenle [] == ![] 解析器是这样解析的:左边 --> [].valueOf() 返回对象, 继续调用toString() --> "", 右边 --> false --> 0, 最终变成 "" == 0 , 所以返回true |
console.log(undefined===undefined)//这里应该是true |
第二条中 console,log(typeof a); //undefined,但是应该为number吧? 运行出来的结果也是这样 |
var myObject = { 所以第三个输出会报错,因为 this 在可访问到的作用域内是 undefined |
绕晕了。。。我还是继续看js的调用栈补补基础 |
console.log(undefined === undefined); //true |
问题14的关键点是push()方法, 与reverse()方法的关系不大: |
问题14: |
第19题: 在非if语句中, 0, '0', +0, -0, false, '', null, undefined, null, NaN都被视为false。然而, 在if分支语句判断时, '0', [0], []被视为true,因为他们并非空元素(not null)。 |
在if分支语句判断时,只有0, false, '', null, undefined, NaN等6个值被视为false。 |
请问 @dwqs 第14条,为什么 |
@juzhiyuan: 你的问题是“JavaScript 是单线程, 为什么前面的语句会显示出程序完全执行后的结果?”。 |
@juzhiyuan: |
@tianmingzuo 非常感谢! |
第3题语法错误看不下去:::
改成
|
Actually, both syntaxes are correct. Although yours is used more often and
make a better sense.
…On Thu, Oct 25, 2018 at 8:12 AM yiminanci ***@***.***> wrote:
第3题语法错误看不下去:::
(function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}());
改成
(function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
})();
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#17 (comment)>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/AY3vL9eik6bua5_ZWXDZXn1PfAmvoEL0ks5uoaqxgaJpZM4JbyBs>
.
|
@tianmingzuo 嗯嗯, |
确实是返回原数组,因为会改变数组本身,所以原数组已经已经颠倒了。 |
求截图的 JS 语法规范的网站地址。 |
都可以的喔,前面用+号都行。 |
你的第十三题在我看来是错误的 |
1、使用
typeof bar === "object"
判断bar
是不是一个对象有神马潜在的弊端?如何避免这种弊端?使用
typeof
的弊端是显而易见的(这种弊端同使用instanceof
):从上面的输出结果可知,
typeof bar === "object"
并不能准确判断bar
就是一个 Object。可以通过Object.prototype.toString.call(bar) === "[object Object]"
来避免这种弊端:而
[] === false
是返回false
的。2、下面的代码会在 console 输出神马?为什么?
这跟变量作用域有关,输出换成下面的:
拆解一下自执行函数中的变量赋值:
所以
b
成了全局变量,而a
是自执行函数的一个局部变量。3、下面的代码会在 console 输出神马?为什么?
第一个和第二个的输出不难判断,在 ES6 之前,JavaScript 只有函数作用域,所以
func
中的 IIFE 有自己的独立作用域,并且它能访问到外部作用域中的self
,所以第三个输出会报错,因为this
在可访问到的作用域内是undefined
,第四个输出是bar
。如果你知道闭包,也很容易解决的:4、将 JavaScript 代码包含在一个函数块中有神马意思呢?为什么要这么做?
换句话说,为什么要用立即执行函数表达式(Immediately-Invoked Function Expression)。
IIFE 有两个比较经典的使用场景,一是类似于在循环中定时输出数据项,二是类似于 JQuery/Node 的插件和模块开发。
上面的输出并不是你以为的0,1,2,3,4,而输出的全部是5,这时 IIFE 就能有用了:
而在 JQuery/Node 的插件和模块开发中,为避免变量污染,也是一个大大的 IIFE:
5、在严格模式('use strict')下进行 JavaScript 开发有神马好处?
6、下面两个函数的返回值是一样的吗?为什么?
在编程语言中,基本都是使用分号(;)将语句分隔开,这可以增加代码的可读性和整洁性。而在JS中,如若语句各占独立一行,通常可以省略语句间的分号(;),JS 解析器会根据能否正常编译来决定是否自动填充分号:
在上述情况下,为了正确解析代码,就不会自动填充分号了,但是对于
return
、break
、continue
等语句,如果后面紧跟换行,解析器一定会自动在后面填充分号(;),所以上面的第二个函数就变成了这样:所以第二个函数是返回
undefined
。7、神马是 NaN,它的类型是神马?怎么测试一个值是否等于 NaN?
NaN
是 Not a Number 的缩写,JavaScript 的一种特殊数值,其类型是 Number,可以通过isNaN(param)
来判断一个值是否是NaN
:ES6 中,
isNaN()
成为了 Number 的静态方法:Number.isNaN()
.8、解释一下下面代码的输出
JavaScript 中的 number 类型就是浮点型,JavaScript 中的浮点数采用IEEE-754 格式的规定,这是一种二进制表示法,可以精确地表示分数,比如1/2,1/8,1/1024,每个浮点数占64位。但是,二进制浮点数表示法并不能精确的表示类似0.1这样 的简单的数字,会有舍入误差。
由于采用二进制,JavaScript 也不能有限表示 1/10、1/2 等这样的分数。在二进制中,1/10(0.1)被表示为
0.00110011001100110011……
注意0011
是无限重复的,这是舍入误差造成的,所以对于 0.1 + 0.2 这样的运算,操作数会先被转成二进制,然后再计算:双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100...因浮点数小数位的限制而截断的二进制数字,这时候,再把它转换为十进制,就成了 0.30000000000000004。
对于保证浮点数计算的正确性,有两种常见方式。
一是先升幂再降幂:
二是是使用内置的
toPrecision()
和toFixed()
方法,注意,方法的返回值字符串。9、实现函数
isInteger(x)
来判断 x 是否是整数可以将
x
转换成10进制,判断和本身是不是相等即可:ES6 对数值进行了扩展,提供了静态方法
isInteger()
来判断参数是否是整数:JavaScript能够准确表示的整数范围在
-2^53
到2^53
之间(不含两个端点),超过这个范围,无法精确表示这个值。ES6 引入了Number.MAX_SAFE_INTEGER
和Number.MIN_SAFE_INTEGER
这两个常量,用来表示这个范围的上下限,并提供了Number.isSafeInteger()
来判断整数是否是安全型整数。10、在下面的代码中,数字 1-4 会以什么顺序输出?为什么会这样输出?
这个就不多解释了,主要是 JavaScript 的定时机制和时间循环,不要忘了,JavaScript 是单线程的。详解可以参考 从setTimeout谈JavaScript运行机制。
11、写一个少于 80 字符的函数,判断一个字符串是不是回文字符串
这个题我在
codewars
上碰到过,并收录了一些不错的解决方式,可以戳这里:Palindrome For Your Dome12、写一个按照下面方式调用都能正常工作的 sum 方法
针对这个题,可以判断参数个数来实现:
13、根据下面的代码片段回答后面的问题
1、点击
Button 4
,会在控制台输出什么?2、给出一种符合预期的实现方式
1、点击5个按钮中的任意一个,都是输出5
2、参考 IIFE。
14、下面的代码会输出什么?为什么?
会输出什么呢?你运行下就知道了,可能会在你的意料之外。
MDN 上对于
reverse()
的描述是酱紫的:reverse()
会改变数组本身,并返回原数组的引用。slice
的用法请参考:slice15、下面的代码会输出什么?为什么?
输出什么,自己去运行吧,需要注意三个点:
同样,可以在数字前添加
''
,将数字转为字符串NaN
这张图是运算转换的规则
16、如果 list 很大,下面的这段递归代码会造成堆栈溢出。如果在不改变递归模式的前提下修善这段代码?
原文上的解决方式是加个定时器:
解决方式的原理请参考第10题。
17、什么是闭包?举例说明
可以参考此篇:从作用域链谈闭包
18、下面的代码会输出什么?为啥?
请往前面翻,参考第4题,解决方式已经在上面了
19、解释下列代码的输出
逻辑与和逻辑或运算符会返回一个值,并且二者都是短路运算符:
false
的操作数 或者 最后一个是true
的操作数如果某个操作数为
false
,则该操作数之后的操作数都不会被计算true
的操作数 或者 最后一个是false
的操作数如果某个操作数为
true
,则该操作数之后的操作数都不会被计算如果逻辑与和逻辑或作混合运算,则逻辑与的优先级高:
在 JavaScript,常见的
false
值:要注意空数组([])和空对象({}):
所以在
if
中,[]
和{}
都表现为true
:20、解释下面代码的输出
请参考前面第14题运算符转换规则的图。
21、解释下面代码的输出
输出是 456,参考原文的解释:
22、解释下面代码的输出
结果是10的阶乘。这是一个递归调用,为了简化,我初始化 n=5,则调用链和返回链如下:
23、解释下面代码的输出
输出1,闭包能够访问外部作用域的变量或参数。
24、解释下面代码的输出,并修复存在的问题
将
getSecretIdentity
赋给stoleSecretIdentity
,等价于定义了stoleSecretIdentity
函数:stoleSecretIdentity
的上下文是全局环境,所以第一个输出undefined
。若要输出John Doe
,则要通过call
、apply
和bind
等方式改变stoleSecretIdentity
的this
指向(hero)。第二个是调用对象的方法,输出
John Doe
。25、给你一个 DOM 元素,创建一个能访问该元素所有子元素的函数,并且要将每个子元素传递给指定的回调函数。
函数接受两个参数:
原文利用 深度优先搜索(Depth-First-Search) 给了一个实现:
文章参考:
25 Essential JavaScript Interview Questions
JavaScript中的立即执行函数表达式
Javascript 严格模式详解
声明:文中对问题的回答仅代表博主个人观点
The text was updated successfully, but these errors were encountered: