Algorithm 每周至少一道算法题:力扣 20. 有效括号
/**
* s 仅由括号 '()[]{}' 组成
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let stack = []
let obj = {
'{':'}',
'[':']',
'(':')'
}
for(let i = 0; i < s.length; i++){
const element = s[i]
// 如果匹配到左边的括号 则入栈
if( element in obj){
stack.push(element)
} else {
// 没有匹配到左边的 则弹出栈中括号进行匹配
// 如果没有匹配到 说明不是有效括号
if( element != obj[stack.pop()]){
return false
}
}
}
// 如果栈是空的则说明都匹配到了
return !stack.length
};
复制代码
Review 阅读并点评至少一篇英文技术文章:前端开发和后端开发的区别到底是什么?
Front End Developer vs Back End Developer – Definition and Meaning In Practice
其实一开始没有前后端这一说法,随着项目结构越来越庞大,慢慢的一部分人专注于处理数据来源和组合逻辑,另外一部分人更关注界面 UI 交互,就分离出了前端和后端。
前端语言基本是 js 的天下,随着 nodejs 日益完善,js 语言也可以跑在服务器上了。
Jeff Atwood 曾提出过 "any application that can be written in JavaScript, will eventually be written in JavaScript."
我相信以后开发者可以使用一种语言就可以开发应用。
Tip 学习至少一个技术技巧:Web Components 的使用
web components 主要用于封装自定义的元素达到复用代码的效果。
由 3 部分组成:
**Custom elements(自定义元素):**一组 JavaScript API,允许您定义 custom elements 及其行为,然后可以在您的用户界面中按照需要使用它们。
Shadow DOM(影子 DOM):一组 JavaScript API,用于将封装的“影子”DOM 树附加到元素(与主文档 DOM 分开呈现)并控制其关联的功能。通过这种方式,您可以保持元素的功能私有,这样它们就可以被脚本化和样式化,而不用担心与文档的其他部分发生冲突。
HTML templates(HTML 模板): [` 和 `` 元素使您可以编写不在呈现页面中显示的标记模板。然后它们可以作为自定义元素结构的基础被多次重用。
基本使用:
// 创建一个类似 bootstrap 的消息弹窗组件 msg-modal
class MsgModal extends HTMLElement{
// 表示私有属性
#shadowDom;
constructor(){
super();
// model open 表示展示虚拟节点
this.#shadowDom = this.attachShadow({mode:"open"});
// 创建对话框
let content = `
<div class="mask"></div>
<div class="modal-container">
<div class="header">
<span class="title">提示</span><span class="close">X</span>
</div>
<div class="body">
<span>这是一段文本</span>
<input type="text" />
</div>
<div class="footer">
<span class="cancel">取消</span>
<span class="primary">确定</span>
</div>
</div> `;
this.#shadowDom.appendChild(content);
this.#close();
this.addEvent();
}
addEvent(){
let modal = this.#shadowDom.querySelector("modal-container");
modal.onclick = e=>{
switch(e.target.className){
case 'close':
this.#close();
this.dispatchEvent(new CustomEvent('cancel'));
break;
case 'cancel':
this.dispatchEvent(new CustomEvent('cancel'));
this.#close();
break;
case 'primary':
this.dispatchEvent(new CustomEvent('success'));
this.#close();
break;
}
}
}
#close(){
this.#shadowDom.querySelector(".mask").style.display = "none";
this.#shadowDom.querySelector(".modal-container").style.display = "none";
}
open(){
this.#shadowDom.querySelector(".mask").style.display = "block";
this.#shadowDom.querySelector(".modal-container").style.display = "block";
}
}
customElements.define("msg-modal",MsgModal);
复制代码
Share 分享一篇观点和思考的技术文章:
什么是 WebGL
评论