
关于JavaScript的一些理解
元无心
2023年尽量不摆烂
展开
-
前端做题家之JavaScript
最近精神状态不太好,没心思写博客。前段时间听说了牛客网,看到上面全是面试题,虽然并不打算找工作,但是做题家的属性觉醒了,就每天做点题玩一玩。虽然我一直自诩“语言律师”,但是看到这些刁钻的面试题,还是有点应付不过来……不过,今天已经把JS的技能值刷满了,稍微有点心得,想了想觉得还是写个博客,摘录一些我觉得比较有意思的题目。名义上是JS的题目,其实并不完全是,还是有一些别的领域的内容。如果不给cookie设置过期时间会怎么样?会在浏览器会话结束时过期。事实上,我还真没试过……不过我倒是想到了sess原创 2020-09-27 20:32:08 · 449 阅读 · 0 评论 -
关于JavaScript中new运算符的一些理解
最近看到一道很有意思的面试题,问输出是多少:var name = "global";var obj = { name: "local", foo: function () { this.name = "foo"; }.bind(window)};var bar = new obj.foo();setTimeout(function () { console.log(window.name);}, 0);console.log(bar.name);var bar3 =原创 2020-09-09 22:09:41 · 305 阅读 · 0 评论 -
精读ECMAScript规范:截断
之所以要写这个,是因为之前遇到了一个老生常谈的问题:如何在JS中实现截断,也就是向0取整,也就是保留数字的整数部分?JS使用的是基于IEEE 754的浮点数,这个大家都知道。IEEE 754所带来的浮点数精度问题(比如著名的0.1 + 0.2 != 0.3,==还是===都是一样的,因为都是number),以及大整数的误差问题(比如著名的2**53+1 == 2**53),我们也都很清楚。关于这些问题,ES6以后提供了类似于Number.EPSILON、BigInt等一系列特性去解决这些问题,就不在这里赘原创 2020-05-29 10:26:16 · 464 阅读 · 0 评论 -
精读ECMAScript规范:全局对象
今天看到一个很有意思的问题:setTimeout是不是全局函数?这个问题,我第一反应是“是”,因为setTimeout是挂在window对象的一个方法(也就是window.setTimeout),而window是浏览器环境下的全局对象,所以setTimeout显然是全局函数。但是也有人说不是,因为方法(methods)和函数(functions)是两码事,全局函数应该是不通过任何对象即可调用的,而setTimeout是隐式的window.setTimeout调用。从这个角度来说,setTimeout应该原创 2020-09-09 20:07:29 · 390 阅读 · 0 评论 -
精读ECMAScript规范:完成记录(Completion Record)
其实本来是想写很长的,但是后来读到阮一峰老师的《ES6标准入门》,感觉“前人之述备矣”,无心再写下去。姑且放上已经写好的这一节。本文基于EMCA 2019规范。之所以下定决心写这个东西,是因为今天遇到了一个问题。你肯定见过这样的语句(暂且先不考虑==和===的问题,虽然我觉得一般都会用===):let a = 0;while (a == 10) { ++a; }可能你也和我一样,曾经因为少写了一个等号而导致死循环:let a = 0;while (a = 10) { ++a; }为此.原创 2020-05-14 23:38:54 · 942 阅读 · 0 评论 -
关于JavaScript中类型的一些理解
什么是类型?我觉得吧,两个值的具有的行为不同,它们的类型也应该不同。事实上,变量没有类型,值才有。虽然定义争论很多,但我还是觉得强类型和弱类型语言的区别,大概就在于在不经过显式强制类型转换的情况下,变量是否始终保持初始化时获得的类型。比如,对于Java来说,int a = 1;之后,如果不经过转换,变量a就一直是int类型了,如果赋值为其他类型会报错。显然,a = "foo";是会报错的。而对于...原创 2019-07-26 17:57:53 · 151 阅读 · 0 评论 -
第三次谈JavaScript中的this
这是第三次研究this的用法了。经过前两次的研究后,我觉得自己已经完全明白了this的机制。结果今天又遇到问题了,匿名函数里的this指向了undefined:function logId () { 'use strict'; customerIdArray.forEach(function (id) { console.log(this.db.get(id));...原创 2019-07-19 08:45:35 · 235 阅读 · 0 评论 -
关于JavaScript中异步的一些理解
这是由一个问题引发的阅读和思考。肯定还会有后续的。问题的开端是这样,有人来问我,我这个代码为什么一直undefined,我说你让我看看。他的代码大概长这样:var arr = [1, 2, 3];for (var i = 0; i < arr.length; ++i) { $.ajax({ type: 'GET', async: true, ...原创 2019-05-19 19:15:11 · 229 阅读 · 0 评论 -
再谈JavaScript中的this
之前一篇文章里我曾经谈过this的事情,当时觉得那几种常规的绑定方式没啥可说的,当时的着眼点是Node环境,然而用jQuery的时候(要恰饭的嘛)遇到了一些很有意思的事情,觉得在浏览器环境中的使用也还是有必要一说的,就决定再写一篇。直接上代码吧(导包的过程就略去不表了),当然,也不要太在意这种老式写法:<div> <ul> <li id="...原创 2019-04-03 18:32:04 · 210 阅读 · 0 评论 -
关于JavaScript的重载实现
在写数据库操作的时候,习惯性地想按照Java的写法写几个重载的函数,突然发现JavaScript好像没有重载这个操作……但是不用重载感觉整个人都不舒服,所以就去查了一下,还真的看到了一点有趣的东西,就记录一下。其实最容易想到的是利用arguments和switch来实现重载的效果,但是这种写法太丑陋了,所以不予考虑:function foo() { switch(arguments.len...原创 2019-02-05 23:06:37 · 496 阅读 · 0 评论 -
关于JavaScript中this的一些理解
this的使用方法已经被历代JavaScript使用者们写烂了,在此不再赘述this的基本使用方法,诸如默认绑定、隐式绑定、显式绑定、new绑定之类的就不说了。我想说的是一件很有意思的事情:Node.js环境和浏览器环境下的全局变量是不一样的,Node的全局变量是global,而浏览器的全局变量是window。插一句,Node这东西实质上是对Chrome V8引擎进行了封装。这大概能解释在本地N...原创 2019-01-24 14:17:55 · 294 阅读 · 0 评论 -
关于JavaScript作用域的一些理解
这其实是《You Don’t Know JS》的读书笔记,加上一点个人的理解。首先需要明确的是,JavaScript里的作用域是词法作用域,也是函数作用域。在解释词法作用域的概念之前,首先需要明确的是,JavaScript虽然实际上依赖于解释执行,但是会有一个编译的阶段,这一点与Java是非常接近的(编译+解释执行,只不过Java生成可以在多平台移植的.class文件,而JavaScrip...原创 2019-01-23 18:05:12 · 220 阅读 · 0 评论