Open lianjianbo opened 5 years ago
地址:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/5/strings/34/
var firstUniqChar = function(s) { if(s.length === 1) return 0 for(let i=0;i<s.length;i++){ if (s.lastIndexOf(s[i]) === s.indexOf(s[i])) { return i; } } return -1; };
lastIndexOf
indexOf
function f(x) { return g(x); }
函数f(x)的最后一步是调用g(x),这就是尾调用。
f(x)
g(x)
function Fibonacci(n,ac1 =1,ac2=2){ if(n<=1){return ac2}; return Fibonacci(n-1,ac2,ac1+ac2); }
JS 在执行的过程中会产生执行环境,这些执行环境会被顺序的加入到执行栈中。如果遇到异步的代码,会被挂起并加入到Task(有多种task)队列中。一旦执行栈为空,Event Loop就会从Task队列中拿出需要执行的代码并放入执行栈中执行
JS
Task
task
Event Loop
console.log('script start'); setTimeout(function() { console.log('setTimeout'); }, 0); console.log('script end');
以上代码虽然setTimeout延时为0,其实还是异步。这是因为HTML5标准规定这个函数第二个参数不得小于4毫秒,不足会自动增加。所以setTimeout还是会在script end之后打印。不同的任务源会被分配到不同的Task队列中,任务源可以分为微任务(microtask)和宏任务(macrotask)。在ES6规范中,microtask称为jobs,macrotask称为task。
setTimeout
HTML5
script end
microtask
macrotask
ES6
jobs
macrotas
console.log('script start'); setTimeout(function() { console.log('setTimeout'); }, 0); new Promise((resolve) => { console.log('Promise') resolve() }).then(function() { console.log('promise1'); }).then(function() { console.log('promise2'); }); console.log('script end');
以上代码输出script start => Promise => script end => promise1 => promise2 => setTimeout 虽然setTimeout写在Promise之前,但是因为Promise属于微任务而setTimeout属于宏任务。所以会有以上的打印。 微任务包括process.nextTick ,promise ,Object.observe,MutationObserver, 宏任务包括script , setTimeout ,setInterval,setImmediate ,I/O ,UI renderin, 宏任务中包括了script,浏览器会先执行一个宏任务,接下来有异步代码的话就先执行微任务 一次 Event loop 顺序是这样的
script start => Promise => script end => promise1 => promise2 => setTimeout
process.nextTick ,promise ,Object.observe,MutationObserver
script , setTimeout ,setInterval,setImmediate ,I/O ,UI renderin
script
Event loop
UI
需养成代码缩进的习惯 : )
ARTS 第十三周(2019.9.30-2019.10.6)
Algorithm 字符串中的第一个唯一字符
地址:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/5/strings/34/
lastIndexOf
是否等于indexOf
Review Object destructuring best practice in Javascript
Tip 近期遇到的tips
函数
f(x)
的最后一步是调用g(x)
,这就是尾调用。Share Eventloop
JS
在执行的过程中会产生执行环境,这些执行环境会被顺序的加入到执行栈中。如果遇到异步的代码,会被挂起并加入到Task
(有多种task
)队列中。一旦执行栈为空,Event Loop
就会从Task
队列中拿出需要执行的代码并放入执行栈中执行以上代码虽然
setTimeout
延时为0,其实还是异步。这是因为HTML5
标准规定这个函数第二个参数不得小于4毫秒,不足会自动增加。所以setTimeout
还是会在script end
之后打印。不同的任务源会被分配到不同的Task
队列中,任务源可以分为微任务(microtask
)和宏任务(macrotask
)。在ES6
规范中,microtask
称为jobs
,macrotas
k称为task
。以上代码输出
script start => Promise => script end => promise1 => promise2 => setTimeout
虽然setTimeout写在Promise之前,但是因为Promise属于微任务而setTimeout属于宏任务。所以会有以上的打印。 微任务包括process.nextTick ,promise ,Object.observe,MutationObserver
, 宏任务包括script , setTimeout ,setInterval,setImmediate ,I/O ,UI renderin
, 宏任务中包括了script
,浏览器会先执行一个宏任务,接下来有异步代码的话就先执行微任务 一次Event loop
顺序是这样的UI
Event loop
,执行宏任务中的异步代码