javascript
文章平均质量分 80
theanarkh
这个作者很懒,什么都没留下…
展开
-
如何实现 JS 运行时的 Inspector 能力
无原创 2022-10-03 03:21:11 · 739 阅读 · 0 评论 -
利用 V8 的 trace API 追踪代码
V8 和 Node.js 提供了 trace_event 机制,但是因为稳定性原因,Node.js 目前没有支持用户自定义 trace event 能力,所以写了一个 addon 支持该能力(npm i v8_trace_event)。更多信息可以参考。https://github.com/nodejs/node/pull/42462https://nodejs.org/dist/latest-v18.x/docs/api/tracing.htmlhttps://zhuanlan.zhihu.com原创 2022-05-04 05:24:25 · 810 阅读 · 0 评论 -
V8 新生代垃圾回收的实现
前言:因为最近在做一些 gc track 的事情,所以打算了解一下 V8 GC 的实现。介绍 V8 GC 的文章网上已经有很多,就不打算再重复介绍。本文主要介绍一下新生代 GC 的实现,代码参考 V8 10.2,因为 GC 的实现非常复杂,只能介绍一些大致的实现,读者需要对 V8 GC 有一定的了解,比如新生代是分为 from 和 to 两个 space,然后在 GC 时是如何处理的。说到 GC 首先需要介绍内存,具体来说,是堆内存,V8 把内存分为新生代和老生代,其中老生代又分为很多种类型,不过本文只关原创 2022-04-29 02:36:49 · 350 阅读 · 0 评论 -
Node.js 的底层原理
前言:之前分享了 Node.js 的底层原理,主要是简单介绍了 Node.js 的一些基础原理和一些核心模块的实现,本文从 Node.js 整体方面介绍 Node.js 的底层原理。分享内容主要包括五个部分。第一部分是首先介绍一下 Node.js 的组成,还有他的代码架构。然后接下来会介绍一下 Node.js 中的 Libuv, 还有 V8 和模块加载器。然后最后介绍一下 Node.js 的服务器架构。1 Node.js 的组成下面我们先来看一下Node.js 的组成。Node.js 主要是由 V8、原创 2021-11-06 16:12:19 · 2685 阅读 · 7 评论 -
在Node.js中使用SO_RESUEPORT
前言:今天下载了Node.js最新版代码,并为Node.js增加了SO_RESUEPORT的能力,本文介绍具体的实现,关于SO_RESUEPORT的知识可以参考之前的文章或者网上文章。1 LibuvSO_RESUEPORT是操作系统内核提供的能力,所以第一步首先修改Libuv。考虑到操作系统兼容性的问题,目前只支持Linux系统,旧版Mac OS也支持相关shuxing...原创 2021-07-23 02:43:54 · 287 阅读 · 3 评论 -
BigInt杂谈
最近遇到了一个要在js里处理uint64位数字的问题,折腾了一下,记录一下,有经验的小伙伴欢迎交流。nodejs和后台通信的时候,经常会碰到后台需要uint64类型的字段,但是js里又无法表示这么大的数字,以前我们没办法,但是新版V8支持了BigInt,让我们看到了一线生机。比如JSON.stringify(BigInt('11111111111111111111111111'));但是,非常不幸报错了JSON.stringify的时候无法对BigInt类型进行序列化。那。。。那么办?我们来分析原创 2021-02-24 21:50:39 · 399 阅读 · 0 评论 -
为什么要读nodejs源码?
前几天有个同学和我说,他在看nodejs源码,但是不知道为什么需要看,也不知道从中可以学到什么。所以今天想聊一下关于阅读nodejs源码的意义。阅读其他源码也类似。首先,阅读源码的目的无非两个1深入了解和理解他或一些底层的原理2 从中学到一些优秀的设计思想和实践。如果你没有两个目的,那其实就没有必要去看源码了。那接下来聊一下从阅读nodejs源码中,可以得到什么。首先我们要深刻理解到nodejs是什么?大家都知道nodejs是一个js的运行时。那么到底nodejs里面...原创 2021-02-13 15:33:51 · 208 阅读 · 0 评论 -
nodejs源码分析第十九章 -- udp模块
第十九章 udpudp不是面向连接的协议,所以使用上会比tcp简单,但是作为传输层的协议,udp虽然没有tcp那么复杂,但是他和tcp一样,使用四元组来标记通信的双方(单播的情况下)。我们看看udp作为服务器和客户端的时候的流程。1 在c语言中使用udp1.1 服务器流程(伪代码)// 申请一个socketint fd = socket(...);// 绑定一个众所周知的地址,像tcp一样bind(fd, ip, port);// 直接阻塞等待消息的到来,因为udp不是面向连接的,所以不需要原创 2020-09-19 21:39:31 · 342 阅读 · 0 评论 -
nodejs源码解析之udp服务器
我们从一个使用例子开始看看udp模块的实现。const dgram = require('dgram');// 创建一个socket对象const server = dgram.createSocket('udp4');// 监听udp数据的到来server.on('message', (msg, rinfo) => { // 处理数据});// 绑定端口server.bind(41234);我们看到创建一个udp服务器很简单,首先申请一个socket对象,在nodejs中和操原创 2020-09-10 01:39:44 · 390 阅读 · 0 评论 -
如何控制nodejs的线程数
之前实现了一个版本的线程池,夜深人静,花了一个多小时,又写了一个版本。这个版本看起来容易很多,也更实用,缺点就是有线程的新建和销毁,带来一点点系统开销。之前版本是一开始就创建(或者增量创建)多个线程,然后一直在工作,缺点是可能长时间有空闲线程。暂且不讨论那么多。我们看一下这一版的实现。1 线程池配置的实现,使用Proxy,劫持一下对象,可以做一些事情,目前没有。// 线程池配置,使用Proxy,可以劫持属性的读写,做点事情const CONFIG = new Proxy({ MAX_THREA原创 2020-08-02 04:56:19 · 1276 阅读 · 0 评论 -
nodejs源码分析之connect
今天我们来分析connect函数。connect是发起tcp连接的api。本质上是对底层tcp协议connect函数的封装。我们看一下nodejs里做了什么事情。我们首先看一下connect函数的入口定义。// connect(options, [cb])// connect(port, [host], [cb])// connect(path, [cb]);// 对socket connect的封装function connect(...args) { // 处理参数 var norma原创 2020-07-27 00:18:50 · 383 阅读 · 0 评论 -
关于nodejs源码的研究
回首对nodejs的源码研究,时间已经过去了一年多。我很喜欢js这门语言,有时候感觉他和c语言一样,在c语言里,很多东西都需要自己实现,让我们可以发挥无限的创造力和想象力,js虽然很多东西在v8里已经提供,但是用js,依然可以创造很多好玩的东西,还有好玩的写法。js应该我见过唯一的一门没有实现网络和文件功能的语言。或者说没有向用户提供这种功能。这也是我对js最大的偏见。因为网络和文件,是一个很重要的能力。对于程序员来说,也是很核心很基础的知识。因为js的使用场景是运行在浏览器。如果js提供了文件操作的话,这原创 2020-07-26 02:51:17 · 325 阅读 · 2 评论 -
实现自己的应用层协议和解析器
我们每天都在使用应用层协议,http协议,smtp协议,dns协议等。但是我们有没有想过实现自己的应用层协议呢?有没有想过应用层协议的实现和解析呢?本文就着这些问题,分享一下如何实现定义一个简单的应用层协议,并实现对应的解析器。1 定义协议协议,顾名思义,就是一种通信的约定,通信双方都能理解就行,我们可以定义复杂的协议,也可以定义简单的协议。本文在于讲解原理,定义一个几乎最简单的协议。格式如下开始字符一字节|整个报文长度四字节|序列号四字节|数据部分n字节|结束字符一字节// 开始标识符cons原创 2020-07-11 01:35:22 · 317 阅读 · 0 评论 -
用js模拟一下操作系统
var TASKNUM = 10; var STATE = { RUNNING: 0, HANGON: 1, STOP: 2 }; var DEFAULTPRI = 10; var lastPid = 0; function Task(config = {}) { this.pid = lastPid++; this.state = STATE.RUNNING;...原创 2020-04-11 12:46:36 · 278 阅读 · 0 评论 -
js实现无限操作
function add(x, y) { if (isNaN(+x)) { x = 0; } if (isNaN(+y)) { y = 0; } return x + y;}var operator = (function(op) { let result = null; return function (x) { if (x) { result = op(x...原创 2020-04-11 10:43:24 · 273 阅读 · 0 评论 -
js实现展开一个数组
function flatten(arr) { let result = []; for (let i = 0; i < arr.length; i++) { if (Array.isArray(arr[i])) { result = result.concat(flatten(arr[i])); } else { result.push(arr[i]); } ...原创 2020-04-11 10:20:35 · 1615 阅读 · 0 评论 -
深度优先、广度优先创建n叉树
1function makeTree(layer) { const root = {}; makeNode(root, layer); return root;}function makeNode(node, layer, keys = ['left', 'right']) { if (!--layer) { keys.forEach((k...原创 2019-10-24 23:19:06 · 203 阅读 · 0 评论 -
表单中的一些隐晦的bug
平时我们都是按照前人的用法和经验去使用一些知识,但我们并不是很了解其中的原理,直到我们遇到bug,才开始去深入分析和学习。直接上代码。 var form = document.getElementById('form'); form.submit();运行以上的代码,会出现error,信息是submit不是一个函数,下面我们来大概分原创 2016-01-19 14:38:15 · 826 阅读 · 0 评论 -
利用闭包实现bind函数
bind函数是Function.prototype里的一个函数,我们试着重写他,看一下他的原理。只是简单化的实现,bind函数的作用是给函数绑定一个对象,然后返回一个新的函数,但是这个函数没有prototype属性(这里并没有实现这个功能)。其实bind的大致原理就是利用闭包把一些信息(例如需要绑定的对象和传入的函数参数等)保存在内存中,然后返回一个新的函数,新的函数调用时使用的信息是之前原创 2016-01-19 16:47:52 · 1800 阅读 · 0 评论 -
对象新建属性对原型链的影响
1:function f(){}:f.prototype={x:function(){}}b =new f()c=new f()c.x=10console.log(c.x)console.log(b.x)2:function f(){}f.prototype={x:1}b =new f()c=new f()c.x=10console.原创 2016-01-19 19:00:10 · 664 阅读 · 0 评论 -
js中变量声明的问题
1. var a; function a(){} alert(typeof a)输出:function 2. function a(){} var a; alert(typeof a)输出:function3. function a(){} var a=1; alert(typeof a)原创 2016-01-22 01:34:40 · 423 阅读 · 0 评论 -
forEach和$.each的知识
[1,2,3].forEach(function(e){if(e==2)return false;(return,return true)elseconsole.log(e)})输出结果:1,3 $.each([1,2,3],function(i,j){if(j==2)return true //(return )else console原创 2016-01-14 21:58:07 · 491 阅读 · 0 评论 -
js事件的冒泡和捕获
aa var a=document.getElementById("d");a.addEventListener("click",function(){alert('2')},true) //1a.addEventListener("click",function(){alert('3')},false) //2var c=document.getEle原创 2016-01-14 22:37:26 · 430 阅读 · 0 评论 -
js中三种事件绑定之间的关系和事件处理函数里的this值
输出:div元素本身 var c=document.getElementById("b");c.onclick=function(){console.log(1)} 输出:1onclick的绑定方式会覆盖内联式的事件绑定。也可以在c.onclick里输出this,可知道this代表div元素本身。原创 2016-01-14 22:56:12 · 5780 阅读 · 0 评论 -
jsonp的简单原理
jsonp和跨域原创 2016-04-08 22:54:23 · 718 阅读 · 0 评论 -
简单的命令行模式
命令模式主要对操作和具体的实现进行解耦。我们只需告诉系统我们需要什么操作,而不关心具体是怎么怎么实现了这个操作。这样当我们需要修改对外的接口时也不会影响用户的功能。-->var sqlOperation={id:0,//数据唯一索引db:{},//数据存储对象argumentsConfig:{select:1,add:1,delete:1原创 2016-05-28 01:14:59 · 726 阅读 · 0 评论 -
解析JavaScript对象间的关系
JavaScript里万物皆对象,但是对象之间的关系异常复杂和混乱,所以决定花时间把他们之间的核心关系搞清楚,并制作成图,分享出来,了解了这个图,再也不用买步步高点读机了,以下程序在ie11,chrome49,firfox46,opera37下都是true,ie10之前的ie版本访问__proto__会出错。啥也不说了,尽在图和代码中。-->原创 2016-05-28 04:01:59 · 757 阅读 · 1 评论 -
关于Dom元素的属性(property)和特性(attribute)
关于这两个的问题一直是前端程序员的困惑,前几天看了一下网上的资料,前天恰好看了jquery作者的讲解,我的理解是属性是类似于js对象里的属性,可以随便写一个,特性是html里固有的变量,比如id和class等。下面说一下测试发现的结果。假设element变量代表一个dom元素。通过setAttribute("xxx",1)和element.xxx=1的形式设置值的时候,1.如果xxx是原创 2016-05-28 05:52:51 · 1482 阅读 · 0 评论 -
iframe跨域应用
http://www.cyb.com/iframe.html document.domain="cyb.com"document.getElementById('w').onload=function(){ document.getElementById('w').contentWindow.fn()} /*setTi原创 2016-05-05 00:01:11 · 562 阅读 · 0 评论 -
csrf攻击
概念性的东西就不多说了,大概说一下实践的过程和涉及的相关知识。网站A:if(!isset($_COOKIE['username'])){ if(isset($_GET["login"])){setcookie("username","cyb");//,time()+3600*24echo "登录成功~";}elseecho '登录失败~';}else原创 2016-04-24 19:14:05 · 477 阅读 · 0 评论 -
浏览器滚动条的兼容性问题
通用的属性window.pageXoffset,window.pageYoffset.(ie8以下版本不支持)ie,火狐下:document.body.scrollTop:0document.documentElement.scrollTop:xchrome:document.body.scrollTop:xdocument.documentElement.sc原创 2016-06-01 19:41:47 · 6477 阅读 · 0 评论 -
浏览器的各自位置和偏移
offsetLeft相对最近的定位父元素的内容边框左上角的左偏移,如果没有定位的父元素,则为body。offsetTop相对最近的定位父元素的内容边框左上角的左偏移,如果没有定位的父元素,则为body。offsetParent定位的父元素offsetLeft,offsetTop的参照物。clientLeft元素的左边框宽度clientTop元素的上边框宽度clientWid原创 2016-05-31 20:45:16 · 1071 阅读 · 0 评论 -
localStorage和sessionStorage
localStorage存储的变量可以在同域名的页面里互相访问,在不同域名的网页里是无法访问的,sessionStorage存储的是会话变量,浏览器关闭之后就会销毁变量。用http://localhost/1.html和http://www.cyb.com/1.html两个url访问,可以看到a变量在两个页面里是独立的,这时我再写一个http://www.cyb.com/2.html,代码和1原创 2016-05-31 18:25:30 · 627 阅读 · 0 评论 -
全局eval的实现
我们在函数里调用eval的时候,所创建变量的作用域是在当前的作用域下的,比如下面的代码:(function(){eval("var a=1")})()console.log(a)上面的代码所创建的变量是属于函数作用域的,在函数外面我们使用不了,所以下面说一下几种实现全局eval的方法1,使用execScript,这个函数在低版原创 2016-05-22 03:52:17 · 1265 阅读 · 0 评论 -
自制模态框和关于z-index的知识
clickhello確定取消world!確定取消$(function() {$("#one").click(function(){$("#dialog").show()})$("#ok").click(function(){$("#two").show()原创 2016-05-22 15:03:52 · 2840 阅读 · 0 评论 -
js的中for in
for in 可以用来枚举对象,默认行为是会枚举对象自己和原型链上所有可枚举的属性。所以一般要用Object.hasOwnProperty进行过滤。通过Object.getOwnPropertyDescriptor(对象,属性)可得到对象属性的描述符,enumerable:为true的会打印出来。所以把他过滤掉var a=[1, 2, 3, 4, 5, 6];Object.getO原创 2016-07-12 02:45:22 · 344 阅读 · 0 评论 -
简单的订阅者/发布者模式
my loginvar zym={};zym.on=function() {var arg=Array.prototype.slice.call(arguments);var eventType=arg.shift();var callback=arg.shift();this.list || (this.list={});this.list[eve原创 2016-07-25 01:03:57 · 1062 阅读 · 0 评论 -
window.name做跨域应用
跨域的方法很多,不一一列举,今晚尝试了一下window.name这种方法,条件是a域名想拿到b域名的数据,并且a,b完全不同域,也就是不能通过设置document.domain来拿数据。像我们项目的前端后端代码不是放在一个服务器的,但是在一个子域名下,所以可以通过设置domain解决跨域问题,所以现在针对另一种情况进行实践。直接看代码。前端代码:原创 2016-07-14 00:22:42 · 848 阅读 · 0 评论 -
js柯里化
简单版:function curring(x){return function(y){return x+y;}}curring(1)(2) //3缺点是参数个数是固定的,高级点的:function curring(){var argList=Array.prototype.slice.call(arguments);return functi原创 2016-06-19 14:41:31 · 482 阅读 · 1 评论 -
利用window.open实现阻止图片下载
最近的项目有个需要是,在页面中有个链接,点击后在新页面打开一个图片,这本来是很容易的事情,但是问题在于公司的图片资源统一储存在一个服务器中的,而且返回的数据中设置了Content-Disposition: attachment; filename="xxx.jpg"头,服务器可能是在web服务器设置了这个头,或者是在应用服务器代码里设置的,下面利用php模拟这个过程,如果我这样写:xxx,不设置C原创 2016-07-19 01:20:13 · 6630 阅读 · 2 评论