2021 年最值得学习的 10 种编程语言
首个编程语言是?这要归功于一位英国数学家。事实上,被称为 Ada Lovelace 的 Augusta Ada Byron 定义了首个编程语言。它是一种“汇编”语言,但是,它的分析机一直没有完成。“Plankalkül”紧随 Ada Lovelace 项目之后出现。1942 年,德国计算机科学家和工程师 Konrad Zuse 首次提出了这种为工程应用而开发的编程语言。它是首个为计算机而设计的高级编程语言。这个项目的首个版本发布于 1946 年。 有趣的是,一般来说,由于第二次世界大战的缘故,数字电子计算机很可能是应用于军方(正是因为这场战争以及计算机在军事战略中的重要性)而不是为公众所知。 但是,历史上最重要的编程语言是什么呢?预计下,在 2021 年使用最多的又是哪些呢? 2021 年你可以学习的 10 种编程语言 下面,我们将以年代为单位逐一介绍下历史上的主要编程语言。但是,2021 年的主要编程语言是什么呢?它们是如何发展的呢? https://youtu.be/UNSoPa-XQN0 10、 Go Go 是一种静态强类型、编译型的编程语言,由 Robert Griesemer、Rob Pike 和 Ken Thompson 设计而成。Go 在语法上类似于 C,但它具有内存安全、垃圾回收、结构类型和 CSP-style 的并发性等特性。该语言因其域名(golang.org)而常被称为 Golang,但它真正的名字是 Go。 来源:https://en.wikipedia.org/wiki/Go_(programming_language) 9、Swift Swift 是一种功能强大且直观的编程语言,适用于 macOS、iOS、watchOS、tvOS 等平台。编写 Swift 代码具有交互性和趣味性,它语法简洁而又富有表现力,并且 Swift 包含了很多开发人员喜欢的现代特性。Swift 代码在设计上是安全的,但也能生产出运行速度极快的软件。 来源:https://developer.apple.com/swift/ 8、 R R 是由统计计算 R 基金会支持的用于统计计算和图形学的编程语言和自由软件环境。统计人员和数据挖掘人员广泛使用 R 语言来开发统计软件并进行数据分析。 来源:https://en.wikipedia.org/wiki/R_(programming_language) 7、Ruby Ruby 是一种动态的、开源的编程语言,注重简洁性和效率。它具有优雅的语法,不仅易读而且也易于编写。 来源:https://www.ruby-lang.org/zh_cn/ 6、 […]
View DetailsWebRTC 成为 W3C 和 IETF 正式标准
2021年1月26日,W3C(万维网联盟)和 IETF (互联网工程任务组)同时宣布 WebRTC(Web Real-Time Communications,Web 实时通信)现发布为正式标准,将音视频通信带到 Web 上任何地方。 WebRTC 由用于 Web 实时通信的 JavaScript API 和一组通信协议构成,支持网络上的任何已连接设备成为 Web 上潜在的通信端点。WebRTC 已成为线上通信及协作服务的基石。 目前全球都面临着 COVID-19 疫情,WebRTC 让数十亿人无论其设备或地域如何,在 COVID-19 疫情期间也能保持联络。WebRTC 的使用已经超越了最初的核心设计,即在浏览器和其他生态(例如本地应用)中支持视频会议和协作系统。现在需要更多的特性和优化。 IETF WebTransport (WEBTRANS) 和 WebRTC Ingest Signaling over HTTPS (WISH) 工作组已经在开展工作,在 IETF 其他工作组的基础上进一步协调、拓展相关工作。其中包括 QUIC(定义支持 WebTransport API 开发的新协议)和 HTTPBIS(指定简单、可扩展的、基于 HTTPS 的信令协议),以在广播工具和实时媒体广播网之间建立基于 WebRTC 的单向视听会话。 W3C WebRTC 工作组已经开始研究 WebRTC Next Version Use Cases,规划 WebRTC 的未来,特别是: 在服务器介导的视频会议中的端到端加密 即时处理音视频材料,包括通过机器学习 物联网(例如 IoT 传感器维持长期连接并寻求最小功耗) WebRTC 工作组正对现有及新的用例进行迭代,重点理解全部需求及其优先级。W3C 近期开始的 WebTransport 和 Web Codecs 工作预计将低延迟流媒体的优势引入更广大的媒体和娱乐生态系统。 WebRTC 成为 W3C 为应用程序开发定义开放 Web 平台的众多标准之一,具有前所未有的潜力。其让开发人员能够构建丰富的交互体验,由巨大的数据存储提供动力,可用于任何设备以及环境。 WebRTC 标准文档:https://www.w3.org/TR/webrtc/ from:https://www.oschina.net/news/128093/webrtc-standard
View DetailsGit 代码统计
代码提交作者
|
1 |
git log --pretty='%aN' | sort -u |
代码提交作者个数
|
1 |
git log --pretty='%aN' | sort -u | wc -l |
统计某个yourName的增加,删除,总行数
|
1 |
git log --author="yourName" --pretty=tformat: --numstat | gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc }' |
提交次数top10
|
1 |
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 10 |
统计每个人,和上面统计结果一样,亲测非亲写(搬运工),单行脚本,自己感受下:
|
1 |
git log --shortstat --pretty="%cE" | sed 's/\(.*\)@.*/\1/' | grep -v "^$" | awk 'BEGIN { line=""; } !/^ / { if (line=="" || !match(line, $0)) {line = $0 "," line }} /^ / { print line " # " $0; line=""}' | sort | sed -E 's/# //;s/ files? changed,//;s/([0-9]+) ([0-9]+ deletion)/\1 0 insertions\(+\), \2/;s/\(\+\)$/\(\+\), 0 deletions\(-\)/;s/insertions?\(\+\), //;s/ deletions?\(-\)//' | awk 'BEGIN {name=""; files=0; insertions=0; deletions=0;} {if ($1 != name && name != "") { print name ": " files " files changed, " insertions " insertions(+), " deletions " deletions(-), " insertions-deletions " net"; files=0; insertions=0; deletions=0; name=$1; } name=$1; files+=$2; insertions+=$3; deletions+=$4} END {print name ": " files " files changed, " insertions " insertions(+), " deletions " deletions(-), " insertions-deletions " net";}' |
from:https://www.cnblogs.com/lioa/p/12074127.html
View DetailsJS删除对象中的某一属性(delete)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
var obj= { height: 180, long: 180, weight: 180, hobby: { ball: 'good', music: 'nice' } } delete obj.hobby // 已声明的对象不可删除, 对象中的对象属性可以删除 |
from:https://www.cnblogs.com/juewuzhe/p/11451362.html
View DetailsDapper实现Like参数化
//参数直接写参数名 string Sql = "select * from [table] where field like @field"; //参数值里面加上通配符,varchar类型查询也不加单引号 var Param = new {field = "%{ParamValue}%"}; //执行查询 Dapper.Query<T>(Sql,Param); from:https://www.cnblogs.com/tian2008/p/8491633.html
View DetailsH5与App的通讯方式
前言 现在不管是桌面客户端还是移动客户端,都会夹杂着一部分H5页面,这种混合式的应用也是我们常说的Hybrid App。为什么会出现Hybrid App呢,早期是因为开发一个Android或iOS的客户端,需要的人力成本比较大,开发周期比较长,后来有些团队就通过将部分页面拆分出来,由前端来完成,再通过在客户端里的Webview来展示。 由于小编我半路转行当程序猿,只对前端领域有所了解,对其他编程领域接触较少,故不探讨Webview的实现原理和与H5页面交互的原理。有兴趣的小伙伴自行百度搜索JSBridge的相关知识,或请教下客户端(Windows、MacOS、Android、iOS)开发的同学,看看如何桥接JS与其他编程语言之间的联系。 优缺点 凡事都是有好有坏,没有绝对的解决方案。下面我总结下Hybrid App在开发过程中存在的优缺点,各位同学可自行判断Hybrid App的好坏。 优点 H5页面交由前端进行开发,页面模块之间分开开发和维护,有效减少App的开发周期 H5页面不受限于应用商店繁琐的审核流程和冗长的等待时间,新增页面和功能、修复缺陷都可随时部署到线上 H5页面在有需要时才加载,减小App打包后的大小,缩短App在应用商店下载的时间和减少本地占用手机的空间 H5页面接入App Webview中,不再受限于浏览器,可通过与App交互调用设备更多底层的API来完善更多原本浏览器无法完成的操作 缺点 协定好H5和App之间的通讯协议,定义好全局属性和全局方法在两者之间如何调用 H5页面接入App Webview中,可能会出现很多兼容问题,需要前端和客户端多加注意 开发前需按照需求和交互进行页面划分,哪些页面归前端开发,哪些页面归客户端开发 页面出现Bug有时候很难发现是在哪个环节出错,需要前端和客户端共同调试找出问题所在(可能各抒己见,打架都有份) 通讯方式 以下代码全部基于前端(React)进行演示,客户端如何实现JS交互我就不多说了,可以找客户端开发的同学了解下。通讯方式有如下两种,都是使用JS代码来完成,兼容性还是挺不错的。 前端通知客户端:拦截 客户端通知前端:注入 前端通知客户端 在H5页面里触发链接跳转,App Webview检测到链接跳转再进行拦截,因此可以通过URL上携带参数来告知App下一步应该做些什么。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import React, { Component } from "react"; export default class App extends Component { componentDidMount() { location.href = "lsbox://toast?msg=页面加载完毕"; // 通知App } render() { return ( <div className="app"> <button type="button" onClick={this.openMask.bind(this)}>点它</button> </app> ); } openMask() { location.href = "lsbox://mask?toggle=1"; // 通知App } } |
以上执行了location.href = "lsbox://mask?toggle=1"来通知App打开遮罩层 lsbox:前端和客户端统一定义链接跳转的协议(喜欢怎样定义协议都行) mask:App需要执行的动作(喜欢怎样定义动作都行) toggle=1:动作执行参数(自定义参数,用于告知App怎样做) 如果同步触发两个或以上的location.href(下一个location.href接着上一个location.href),App可能只会接收到一个location.href发出的通知,所以需要对下一个location.href使用setTimeout设置通知时间间隔(可使用Async/Await封装优化)
|
1 2 3 4 5 6 7 |
location.href = "lsbox://toast?msg=one"; setTimeout(() => { location.href = "lsbox://toast?msg=two"; setTimeout(() => { location.href = "lsbox://toast?msg=three"; }, 100); }, 100); |
客户端通知前端 注入一些全局方法,App Webview直接操作全局方法来控制H5页面,使用window.handleFunc = function() {}这样的形式来定义注入的方法。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import React, { Component } from "react"; export default class App extends Component { constructor(props) { super(props); this.state = { list: [0, 1, 2, 3, 4] }; } componentDidMount() { window.addNum = this.addNum.bind(this); // 暴露方法给App } render() { return ( <div className="app"> <ul>{this.state.list.map(v => <li key={v}>{v}</li>)}</ul> </div>; ); } addNum(num) { this.setState(prevState => ({ list: prevState.list.concat(num); })); } } |
以上在组件加载完成后通过window.addNum = this.addNum.bind(this)将指定方法全局暴露到window上,App Webview可直接操作这些方法来控制H5页面。 作者:JowayYoung 链接:https://juejin.cn/post/6844904020201455624 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
View Details中高级前端必须注意的40条移动端H5坑位指南 | 网易三年实践
前言 不知不觉在网易已有三年半,占了一半时间都在与移动端打交道,整个阶段都是遇坑填坑的学习过程。移动端开发在前端里像神一样地存在,不是说它多难而是说它坑位实在太多了,怎样填都填不完。Android和iOS各显神通,Android的系统版本和屏幕分辨率多得难以一招兼容,iOS的顽固标准和未知特性多得难以快速掌握。 三年半沉淀通过本文记录下所遇到的坑位,或许有些坑位还未遇到,但本文记录的40条坑位绝对能让同学们少走很多弯路,特别是前端小白。为了减少废话提高本文质量,对以下内容做一些约定。 提及的安卓系统包括Android和基于Android开发的系统 提及的苹果系统包括iOS和iPadOS 本文针对的开发场景是移动端浏览器,因此大部分坑位的解决方案在桌面端浏览器里不一定有效 解决方案若未提及适用系统就默认在安卓系统和苹果系统上都适用,若提及适用系统则会详细说明 Webkit及其衍生内核在移动端浏览器市场占有率里达到惊人的97%,因此无需太过担心CSS3、ES6和浏览器新特性的兼容性 每次填坑都是一次实践过程,全部坑位的源码都按语言方向记录在笔者Github上,若有未记录的坑位可提PR让笔者合并,给个Star支持下咧! 本来想为每个坑位都截图或录播GIF作为演示,但考虑到目前掘金的Markdown编辑器操作图片还存在缺陷就放弃了,每次上传图片都会花费很多时间甚至上传失败(望掘金的产品小姐姐和程序小哥哥优化喔)。若需演示只能自行复制代码了。 HTML方向 调用系统功能 使用<a>能快速调用移动设备的电话/短信/邮件三大通讯功能,使用<input>能快速调用移动设备的的图库/文件。 这些功能方便了页面与系统的交互,关键在于调用格式一定要准确,否则会被移动端浏览器忽略。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<!-- 拨打电话 --> <a href="tel:10086">拨打电话给10086小姐姐</a> <!-- 发送短信 --> <a href="sms:10086">发送短信给10086小姐姐</a> <!-- 发送邮件 --> <a href="mailto:young.joway@aliyun.com">发送邮件给JowayYoung</a> <!-- 选择照片或拍摄照片 --> <input type="file" accept="image/*"> <!-- 选择视频或拍摄视频 --> <input type="file" accept="video/*"> <!-- 多选文件 --> <input type="file" multiple> |
忽略自动识别 有些移动端浏览器会自动将数字字母符号识别为电话/邮箱并将其渲染成上述调用系统功能里的<a>。虽然很方便却有可能违背需求。
|
1 2 3 4 5 6 7 8 |
<!-- 忽略自动识别电话 --> <meta name="format-detection" content="telephone=no"> <!-- 忽略自动识别邮箱 --> <meta name="format-detection" content="email=no"> <!-- 忽略自动识别电话和邮箱 --> <meta name="format-detection" content="telephone=no, email=no"> |
弹出数字键盘 使用<input type="tel">弹起数字键盘会带上#和*,适合输入电话。推荐使用<input pattern="\d*">弹起数字键盘,适合输入验证码等纯数字格式。
|
1 2 3 4 5 |
<!-- 纯数字带#和* --> <input type="tel"> <!-- 纯数字 --> <input pattern="\d*"> |
唤醒原生应用 通过location.href与原生应用建立通讯渠道,这种页面与客户端的通讯方式称为URL Scheme,其基本格式为scheme://[path][?query],笔者曾经发表过《H5与App的通讯方式》讲述URL Scheme的使用。 scheme:应用标识,表示应用在系统里的唯一标识 path:应用行为,表示应用某个页面或功能 query:应用参数,表示应用页面或应用功能所需的条件参数 URL Scheme一般由前端与客户端共同协商。唤醒原生应用的前提是必须在移动设备里安装了该应用,有些移动端浏览器即使安装了该应用也无法唤醒原生应用,因为它认为URL Scheme是一种潜在的危险行为而禁用它,像Safari和微信浏览器。还好微信浏览器可开启白名单让URL Scheme有效。 若在页面引用第三方原生应用的URL Schema,可通过抓包第三方原生应用获取其URL。
|
1 2 3 4 5 6 7 8 9 10 11 |
<!-- 打开微信 --> <a href="weixin://">打开微信</a> <!-- 打开支付宝 --> <a href="alipays://">打开支付宝</a> <!-- 打开支付宝的扫一扫 --> <a href="alipays://platformapi/startapp?saId=10000007">打开支付宝的扫一扫</a> <!-- 打开支付宝的蚂蚁森林 --> <a href="alipays://platformapi/startapp?appId=60000002">打开支付宝的蚂蚁森林</a> |
禁止页面缩放 在智能手机的普及下,很多网站都具备桌面端和移动端两种浏览版本,因此无需双击缩放查看页面。禁止页面缩放可保障移动端浏览器能无遗漏地展现页面所有布局。
|
1 |
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1"> |
禁止页面缓存 Cache-Control指定请求和响应遵循的缓存机制,不想使用浏览器缓存就禁止呗!
|
1 |
<meta http-equiv="Cache-Control" content="no-cache"> |
禁止字母大写 有时在输入框里输入文本会默认开启首字母大写纠正,就是输入首字母小写会被自动纠正成大写,特么的烦。直接声明autocapitalize=off关闭首字母大写功能和autocorrect=off关闭纠正功能。
|
1 |
<input autocapitalize="off" autocorrect="off"> |
针对Safari配置 贴一些Safari较零散且少用的配置。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!-- 设置Safari全屏,在iOS7+无效 --> <meta name="apple-mobile-web-app-capable" content="yes"> <!-- 改变Safari状态栏样式,可选default/black/black-translucent,需在上述全屏模式下才有效 --> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <!-- 添加页面启动占位图 --> <link rel="apple-touch-startup-image" href="pig.jpg" media="(device-width: 375px)"> <!-- 保存网站到桌面时添加图标 --> <link rel="apple-touch-icon" sizes="76x76" href="pig.jpg"> <!-- 保存网站到桌面时添加图标且清除默认光泽 --> <link rel="apple-touch-icon-precomposed" href="pig.jpg"> |
针对其他浏览器配置 贴一些其他浏览器较零散且少用的配置,主要是常用的QQ浏览器、UC浏览器和360浏览器。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<!-- 强制QQ浏览器竖屏 --> <meta name="x5-orientation" content="portrait"> <!-- 强制QQ浏览器全屏 --> <meta name="x5-fullscreen" content="true"> <!-- 开启QQ浏览器应用模式 --> <meta name="x5-page-mode" content="app"> <!-- 强制UC浏览器竖屏 --> <meta name="screen-orientation" content="portrait"> <!-- 强制UC浏览器全屏 --> <meta name="full-screen" content="yes"> <!-- 开启UC浏览器应用模式 --> <meta name="browsermode" content="application"> <!-- 开启360浏览器极速模式 --> <meta name="renderer" content="webkit"> |
让:active有效,让:hover无效 有些元素的:active可能会无效,而元素的:hover在点击后会一直处于点击状态,需点击其他位置才能解除点击状态。给<body>注册一个空的touchstart事件可将两种状态反转。
|
1 |
<body ontouchstart></body> |
CSS方向 自动适应布局 针对移动端,笔者通常会结合JS依据屏幕宽度与设计图宽度的比例动态声明<html>的font-size,以rem为长度单位声明所有节点的几何属性,这样就能做到大部分移动设备的页面兼容,兼容出入较大的地方再通过媒体查询做特别处理。 笔者通常将rem布局比例设置成1rem=100px,即在设计图上100px长度在CSS代码上使用1rem表示。
|
1 2 3 4 5 6 7 8 9 10 |
function AutoResponse(width = 750) { const target = document.documentElement; if (target.clientWidth >= 600) { target.style.fontSize = "80px"; } else { target.style.fontSize = target.clientWidth / width * 100 + "px"; } } AutoResponse(); window.addEventListener("resize", () => AutoResponse()); |
当然还可依据屏幕宽度与设计图宽度的比例使用calc()动态声明<html>的font-size,这样就能节省上述代码。不对,是完全代替上述代码。
|
1 2 3 |
html { font-size: calc(100vw / 7.5); } |
若以iPad Pro分辨率1024px为移动端和桌面端的断点,还可结合媒体查询做断点处理。1024px以下使用rem布局,否则不使用rem布局。
|
1 2 3 4 5 |
@media screen and (max-width: 1024px) { html { font-size: calc(100vw / 7.5); } } |
自动适应背景 使用rem布局声明一个元素背景,多数情况会将background-size声明为cover。可能在设计图对应分辨率的移动设备下,背景会完美贴合显示,但换到其他分辨率的移动设备下就会出现左右空出1px到npx的空隙。 此时将background-size声明为100% 100%,跟随width和height的变化而变化。反正width和height都是量好的实际尺寸。
|
1 2 3 4 5 |
.elem { width: 1rem; height: 1rem; background: url("pig.jpg") no-repeat center/100% 100%; } |
监听屏幕旋转 你还在使用JS判断横屏竖屏调整样式吗?那就真的Out了。
|
1 2 3 4 5 6 7 8 |
/* 竖屏 */ @media all and (orientation: portrait) { /* 自定义样式 */ } /* 横屏 */ @media all and (orientation: portrait) { /* 自定义样式 */ } |
[…]
View Details这些一行 JS 实现功能的代码,让你看起来像一个前端专家
JavaScript 可以做很多神奇的事情! 从复杂的框架到处理 API,有太多的东西需要学习。 但是,它也能让你只用一行代码就能做一些了不起的事情。 看看这 13 句 JavaScript 单行代码,会让你看起来像个专家! 1. 获取一个随机布尔值 (true/false) 这个函数使用 Math.random() 方法返回一个布尔值(true 或 false)。Math.random 将在 0 和 1 之间创建一个随机数,之后我们检查它是否高于或低于 0.5。这意味着得到真或假的几率是 50%/50%。
|
1 2 3 |
const randomBoolean = () => Math.random() >= 0.5; console.log(randomBoolean()); // Result: a 50/50 change on returning true of false |
2. 检查日期是否为工作日 使用这个方法,你就可以检查函数参数是工作日还是周末。
|
1 2 3 4 5 |
const isWeekday = (date) => date.getDay() % 6 !== 0; console.log(isWeekday(new Date(2021, 0, 11))); // Result: true (Monday) console.log(isWeekday(new Date(2021, 0, 10))); // Result: false (Sunday) |
3. 反转字符串 有几种不同的方法来反转一个字符串。以下代码是最简单的方式之一。
|
1 2 3 |
const reverse = str => str.split('').reverse().join(''); reverse('hello world'); // Result: 'dlrow olleh' |
4. 检查当前 Tab 页是否在前台 我们可以通过使用 document.hidden 属性来检查当前标签页是否在前台中。
|
1 2 3 |
const isBrowserTabInView = () => document.hidden; isBrowserTabInView(); // Result: returns true or false depending on if tab is in view / focus |
5. 检查数字是否为偶数 最简单的方式是通过使用模数运算符(%)来解决。如果你对它不太熟悉,这里是 Stack Overflow 上的一个很好的图解。
|
1 2 3 4 5 |
const isEven = num => num % 2 === 0; console.log(isEven(2)); // Result: true console.log(isEven(3)); // Result: false |
6. 从日期中获取时间 通过使用 toTimeString() 方法,在正确的位置对字符串进行切片,我们可以从提供的日期中获取时间或者当前时间。
|
1 2 3 4 5 |
const timeFromDate = date => date.toTimeString().slice(0, 8); console.log(timeFromDate(new Date(2021, 0, 10, 17, 30, 0))); // Result: "17:30:00" console.log(timeFromDate(new Date())); // Result: will log the current time |
7. 保留小数点(非四舍五入) 使用 Math.pow() 方法,我们可以将一个数字截断到某个小数点。
|
1 2 3 4 5 6 7 8 |
const toFixed = (n, fixed) => ~~(Math.pow(10, fixed) * n) / Math.pow(10, fixed); // Examples toFixed(25.198726354, 1); // 25.1 toFixed(25.198726354, 2); // 25.19 toFixed(25.198726354, 3); // 25.198 toFixed(25.198726354, 4); // 25.1987 toFixed(25.198726354, 5); // 25.19872 toFixed(25.198726354, 6); // 25.198726 |
8. 检查元素当前是否为聚焦状态 我们可以使用 document.activeElement 属性检查一个元素当前是否处于聚焦状态。
|
1 2 3 |
const elementIsInFocus = (el) => (el === document.activeElement); elementIsInFocus(anyElement) // Result: will return true if in focus, false if not in focus |
9. 检查浏览器是否支持触摸事件
|
1 2 3 4 5 |
const touchSupported = () => { ('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch); } console.log(touchSupported()); // Result: will return true if touch events are supported, false if not |
10. 检查当前用户是否为苹果设备 我们可以使用 navigator.platform 来检查当前用户是否为苹果设备。
|
1 2 3 |
const isAppleDevice = /Mac|iPod|iPhone|iPad/.test(navigator.platform); console.log(isAppleDevice); // Result: will return true if user is on an Apple device |
11. 滚动到页面顶部 […]
View Details命名秘籍周获近五千星——GitHub 热点速览 v.21.04
作者:HelloGitHub-小鱼干 命名一直是编程界的难点,这次 naming-cheatsheet 就能帮上你的忙。按照它的 SID(Short.、Intuitive、Descriptive)原则,你一定能取出极佳的变量 / 函数名。同样,能解决你可视化问题的还有 Apache 的 superset。如果你想了解 Google、微软、Netflix 之类的大厂在生产环境应用了哪些机器学习技术,applied-ml 就能娓娓道来各大科技公司的 ml 技术。 这期依旧是小鱼干自由发挥的一期热点趋势,和原来一样如果你想了解特定主题的 GitHub Repo,小鱼干定会留意这周的 GitHub Trending。 以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 New,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知 🌝 本文目录 本周特推 1.1 命名秘籍:naming-cheatsheet 1.2 机器学习库:best-of-ml-python GitHub Trending 周榜 2.1 免费编程书籍:free-programming-books 2.2 大厂的技术实践:applied-ml 2.3 新的编译方式:Svelte 2.4 可视化工具:superset 2.5 模拟数据:faker.js 2.6 角色扮演:ActionRoguelike 往期回顾 1. 本周特推 1.1 命名秘籍:naming-cheatsheet 本周 star 增长数:4,900+ naming-cheatsheet 是一个两年之前的项目,这周焕发了新生一周获得了近 5k star。本项目旨在帮你解决命名困难的问题,教你如何便捷、轻松地进行命名。命名谨记以下三点(SID): 短:一个名字一定不要花很长的时间来键入,因此,记住; 直观:一个名字必须读起来自然,尽可能接近日常用语; 描述性:一个名字必须以最有效的方式反映它所做 / 拥有的东西。 GitHub 地址→github.com/kettanaito/… 1.2 机器学习库:best-of-ml-python 本周 star 增长数:2,750+ […]
View DetailsNaming cheatsheet
Naming things is hard. This sheet attempts to make it easier. Although these suggestions can be applied to any programming language, I will use JavaScript to illustrate them in practice. English language Use English language when naming your variables and functions.
|
1 2 3 4 5 6 7 |
/* Bad */ const primerNombre = 'Gustavo' const amigos = ['Kate', 'John'] /* Good */ const firstName = 'Gustavo' const friends = ['Kate', 'John'] |
Like it or not, English is the dominant language in programming: the syntax of all programming languages is written in English, as well as countless documentations and educational materials. By writing your code in English you dramatically increase its cohesiveness. Naming convention Pick one naming convention and […]
View Details