이전 단어
ES6에 TypedArray가 도입되기 전에는 JavaScript 언어에 바이너리 데이터 스트림을 읽거나 작동하는 메커니즘이 없었습니다. Buffer 클래스는 Nodejs API의 일부로 도입되어 TCP 스트리밍 및 파일 시스템 작업과 같은 시나리오에서 이진 데이터 스트림을 처리할 수 있습니다. 이제 TypedArray가 ES6에 추가되었으므로 Buffer 클래스는 Node.js 사용 사례에 더 좋고 더 적합한 방식으로 Uint8Array를 구현합니다. 이 글에서는 버퍼 객체에 대해 자세히 소개하겠습니다
개요
다양한 애플리케이션 시나리오로 인해 Node에서 애플리케이션은 네트워크 프로토콜 처리, 데이터베이스 운영, 이미지 처리, 업로드된 파일 수신 등을 수행해야 합니다. 네트워크 운영에서 많은 양의 바이너리 데이터를 처리하려면 JavaScript 자체의 문자열이 이러한 요구를 충족시키지 못하기 때문에 Buffer 객체가 등장하게 된 것은 JavaScript와 C++를 결합한 것입니다. 성능 관련 부분은 C++로, 비성능 부분은 C++로 변환합니다. Buffer 클래스의 인스턴스는 크기가 고정되어 있고 물리적 메모리가 V8 힙 외부에 할당된다는 점을 제외하면 정수 배열과 유사합니다. Buffer의 크기는 생성될 때 결정되며 크기를 조정할 수 없습니다.
Buffer는 너무 흔하기 때문에 프로세스가 시작될 때 Node에서 이를 로드하여 전역 객체(global)에 배치했습니다. 그래서 Buffer를 사용할 때는 require() 없이 바로 사용할 수 있습니다.
/*{ [Function: Buffer] poolSize: 8192, from: [Function], alloc: [Function], allocUnsafe: [Function], allocUnsafeSlow: [Function], isBuffer: [Function: isBuffer], compare: [Function: compare], isEncoding: [Function], concat: [Function], byteLength: [Function: byteLength] } */console.log(Buffer);
Create
Node.js v6 이전 버전에서는 Buffer
인스턴스가 Buffer를 통해 전달됩니다.
생성자에 의해 생성되며 제공된 매개변수에 따라 다양한 버퍼를 반환하며, 새로운 버전의 nodejs에서는 해당 메서드
1.new Buffer(size)를 제공합니다. Buffer()에 첫 번째 매개변수(예: new Buffer(10))로 값을 전달하고 지정된 크기의 새 Buffer 객체를 할당합니다Buffer
实例是通过Buffer
构造函数创建的,它根据提供的参数返回不同的 Buffer,而新版本的nodejs则提供了对应的方法
1、new Buffer(size)。传一个数值作为第一个参数给Buffer()(如new Buffer(10)),则分配一个指定大小的新建的Buffer对象
分配给这种Buffer实例的内存是未初始化的(没有用0填充)。虽然这样的设计使得内存的分配非常快,但已分配的内存段可能包含潜在的敏感旧数据
这种Buffer实例必须手动地被初始化,可以使用buf.fill(0)或写满这个Buffer。虽然这种行为是为了提高性能而有意为之的,但开发经验表明,创建一个快速但未初始化的Buffer与创建一个慢点但更安全的Buffer之间需要有更明确的区分
var buf = new Buffer(5); console.log(buf);//<buffer>buf.fill(0); console.log(buf);//<buffer></buffer></buffer>
[注意]当我们为一个Buffer对象分配空间大小后,其长度就是固定的,不能更改
var buf = new Buffer(5); console.log(buf);//<buffer>buf[0] = 1; console.log(buf);//<buffer>buf[10] = 1; console.log(buf);//<buffer></buffer></buffer></buffer>
【Buffer.allocUnsafe(size)】
在新版本中,由Buffer.allocUnsafe(size)方法替代,来分配一个大小为 size
字节的新建的没有用0填充的Buffer。可以使用buf.fill(0)
初始化Buffer
var buf = Buffer.allocUnsafe(10); console.log(buf);//<buffer>buf.fill(0); console.log(buf);//<buffer></buffer></buffer>[참고] 공간 크기를 할당할 때 버퍼 객체, 길이는 고정되어 있으며 변경할 수 없습니다
var buf = Buffer.alloc(5); console.log(buf);//<buffer></buffer>【Buffer.allocUnsafe(size)】 새 버전에서는 Buffer.allocUnsafe(size) 메서드 대신 0이 아닌 새로운 버퍼를 할당합니다.
size
바이트 크기입니다. buf.fill(0)
을 사용하여 Buffer
인스턴스를 0
var buf1 = new Buffer([1, 2, 3, 4, 5]); console.log(buf1);//<buffer>var buf2 = new Buffer(buf1); console.log(buf2);//<buffer></buffer></buffer>【Buffer.alloc(size[, fill[, 인코딩]])으로 초기화할 수 있습니다. 】 새 버전에서는 Buffer.alloc(size) 메서드를 사용하여 안전한 버퍼 개체를 생성합니다. 매개변수 크기
var buf1 = Buffer.from([1, 2, 3, 4, 5]); console.log(buf1);//<buffer>var buf2 = Buffer.from(buf1); console.log(buf2);//<buffer></buffer></buffer>2.new Buffer(어레이 또는 버퍼)로 채워집니다. 첫 번째 매개변수로 배열이나 Buffer를 전달한 후 전달된 객체의 데이터를 Buffer에 복사합니다
var buf1 = new Buffer('this is a tést'); console.log(buf1.toString());//this is a téstconsole.log(buf1.toString('ascii'));//this is a tC)stvar buf2 = new Buffer('7468697320697320612074c3a97374', 'hex'); console.log(buf2.toString());//this is a tést【Buffer.from(array or buffer)】 새 버전에서는 Buffer.from(array or buffer ) 메소드 대신
'ascii' - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。'utf8' - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。'utf16le' - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。'ucs2' - 'utf16le' 的别名。'base64' - Base64 编码。当从字符串创建 Buffer 时,这种编码可接受“URL 与文件名安全字母表”。'latin1' - 一种把 Buffer 编码成一字节编码的字符串的方式。'binary' - 'latin1' 的别名。'hex' - 将每个字节编码为两个十六进制字符。3.new Buffer(string[, 인코딩]). 첫 번째 매개변수는 문자열이고, 두 번째 매개변수는 인코딩 방식입니다. 기본값은 'utf-8'
var buf1 = Buffer.from('this is a tést'); console.log(buf1.toString());//this is a téstconsole.log(buf1.toString('ascii'));//this is a tC)stvar buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex'); console.log(buf2.toString());//this is a tést현재 Node.js에서 지원하는 문자 인코딩은 다음과 같습니다.
var arr = new Uint16Array(2); arr[0] = 5000; arr[1] = 4000;var buf = new Buffer(arr.buffer); console.log(buf);//<buffer>arr[1] = 6000; console.log(buf);//<buffer></buffer></buffer>【Buffer.from( string[ , 인코딩])】 새 버전에서는 Buffer.from(string[, 인코딩] 메서드
var arr = new Uint16Array(2); arr[0] = 5000; arr[1] = 4000;var buf = Buffer.from(arr.buffer); console.log(buf);//<buffer>arr[1] = 6000; console.log(buf);//<buffer></buffer></buffer>4.new Buffer(arrayBuffer[, byteOffset [, length]])로 대체되었습니다. 매개변수 arrayBuffer
console.log(Buffer.from('test'));//<buffer></buffer>Buffer.from(arrayBuffer[, byteOffset [, length]])】 새 버전에서는 Buffer.from(arrayBuffer[, byteOffset [, length]]) 메서드로 대체되었습니다. 🎜🎜
var buf = Buffer.from('match'); console.log(buf.length);//5var buf = Buffer.from('火柴'); console.log(buf.length);//6🎜🎜 🎜🎜클래스 배열🎜🎜 Buffer 객체는 배열과 유사하며 해당 요소는 두 자리 16진수, 즉 0에서 255까지의 값입니다🎜🎜
var buf = Buffer.alloc(10); console.log(buf.length); // => 10🎜
【长度】
不同编码的字符串占用的元素个数各不相同,中文字在UTF-8编码下占用3个元素,字母和半角标点符号占用1个元素
var buf = Buffer.from('match'); console.log(buf.length);//5var buf = Buffer.from('火柴'); console.log(buf.length);//6
【下标】
Buffer受Array类型的影响很大,可以访问length属性得到长度,也可以通过下标访问元素
var buf = Buffer.alloc(10); console.log(buf.length); // => 10
上述代码分配了一个长10字节的Buffer对象。我们可以通过下标对它进行赋值
buf[0] = 100; console.log(buf[0]); // => 100
要注意的是,给元素的赋值如果小于0,就将该值逐次加256,直到得到一个0到255之间的整数。如果得到的数值大于255,就逐次减256,直到得到0~255区间内的数值。如果是小数,舍弃小数部分,只保留整数部分
buf[0] = -100; console.log(buf[0]); // 156buf[1] = 300; console.log(buf[1]); // 44buf[2] = 3.1415; console.log(buf[2]); // 3
【fromcharcode】
通常地,创建的buffer对象的内容是其uft-8字符编码
var buf = Buffer.from('match'); console.log(buf); //<buffer></buffer>
如果要访问其对应的字符,则需要使用字符串的fromCharCode()方法
console.log(String.fromCharCode(buf[0]));//'m'
内存分配
Buffer对象的内存分配不是在V8的堆内存中,而是在Node的C++层面实现内存的申请的。因为处理大量的字节数据不能采用需要一点内存就向操作系统申请一点内存的方式,这可能造成大量的内存申请的系统调用,对操作系统有一定压力。为此Node在内存的使用上应用的是在C++层面申请内存、在JavaScript中分配内存的策略
为了高效地使用申请来的内存,Node采用了slab分配机制。slab是一种动态内存管理机制,最早诞生于SunOS操作系统(Solaris)中,目前在一些*nix操作系统中有广泛的应用,如FreeBSD和Linux。简单而言,slab就是一块申请好的固定大小的内存区域。slab具有如下3种状态:full:完全分配状态;partial:部分分配状态;empty:没有被分配状态
当我们需要一个Buffer对象,可以通过以下方式分配指定大小的Buffer对象:
new Buffer(size);//旧Buffer.alloc(size);//新
【poolSize】
poolSize属性是用于决定预分配的、内部 Buffer
实例池的大小的字节数。默认地,Node以8KB为界限来区分Buffer是大对象还是小对象:
Buffer.poolSize = 8 * 1024;
这个8KB的值也就是每个slab的大小值,在JavaScript层面,以它作为单位单元进行内存的分配
1、分配小Buffer对象
如果指定Buffer的大小少于8KB,Node会按照小对象的方式进行分配。Buffer的分配过程中主要使用一个局部变量pool作为中间处理对象,处于分配状态的slab单元都指向它。以下是分配一个全新的slab单元的操作,它会将新申请的SlowBuffer对象指向它:
var pool;function allocPool() { pool = new SlowBuffer(Buffer.poolSize); pool.used = 0; }
构造小Buffer对象时的代码如下:
new Buffer(1024);//旧Buffer.alloc(1024);//新
这次构造将会去检查pool对象,如果pool没有被创建,将会创建一个新的slab单元指向它:
if (!pool || pool.length - pool.used
同时当前Buffer对象的parent属性指向该slab,并记录下是从这个slab的哪个位置(offset)开始使用的,slab对象自身也记录被使用了多少字节,代码如下:
this.parent = pool; this.offset = pool.used; pool.used += this.length;if (pool.used & 7) pool.used = (pool.used + 8) & ~7;
这时候的slab状态为partial。当再次创建一个Buffer对象时,构造过程中将会判断这个slab的剩余空间是否足够。如果足够,使用剩余空间,并更新slab的分配状态。下面的代码创建了一个新的Buffer对象,它会引起一次slab分配:
new Buffer(3000);//旧Buffer.alloc(3000);//新
如果slab剩余的空间不够,将会构造新的slab,原slab中剩余的空间会造成浪费。例如,第一次构造1字节的Buffer对象,第二次构造8192字节的Buffer对象,由于第二次分配时slab中的空间不够,所以创建并使用新的slab,第一个slab的8KB将会被第一个1字节的Buffer对象独占。下面的代码一共使用了两个slab单元:
new Buffer(1);//旧Buffer.alloc(1);//新new Buffer(8192);//旧Buffer.alloc(8192);//新
要注意的是,由于同一个slab可能分配给多个Buffer对象使用,只有这些小Buffer对象在作用域释放并都可以回收时,slab的8KB空间才会被回收。尽管创建了1个字节的Buffer对象,但是如果不释放它,实际可能是8KB的内存没有释放
2、分配大Buffer对象
如果需要超过8KB的Buffer对象,将会直接分配一个SlowBuffer对象作为slab单元,这个slab单元将会被这个大Buffer对象独占
// Big buffer, just alloc onethis.parent = new SlowBuffer(this.length); this.offset = 0;
这里的SlowBuffer类是在C++中定义的,虽然引用buffer模块可以访问到它,但是不推荐直接操作它,而是用Buffer替代
上面提到的Buffer对象都是JavaScript层面的,能够被V8的垃圾回收标记回收。但是其内部的parent属性指向的SlowBuffer对象却来自于Node自身C++中的定义,是C++层面上的Buffer对象,所用内存不在V8的堆中
综上,真正的内存是在Node的C++层面提供的,JavaScript层面只是使用它。当进行小而频繁的Buffer操作时,采用slab的机制进行预先申请和事后分配,使得JavaScript到操作系统之间不必有过多的内存申请方面的系统调用。对于大块的Buffer而言,则直接使用C++层面提供的内存,而无需细腻的分配操作
转换
Buffer对象可以与字符串之间相互转换。目前支持的字符串编码类型有如下几种:ASCII、UTF-8、UTF-16LE/UCS-2、Base64、Binary、Hex
【write()】
一个Buffer对象可以存储不同编码类型的字符串转码的值,调用write()方法可以实现该目的
buf.write(string, [offset], [length], [encoding])
string
offset
length
encoding
根据 encoding 的字符编码写入 string 到 buf 中的 offset 位置。 length 参数是写入的字节数。 如果 buf 没有足够的空间保存整个字符串,则只会写入 string 的一部分。 只部分解码的字符不会被写入
var buf = Buffer.alloc(5); console.log(buf); //<buffer>var len = buf.write('test',1,3); console.log(buf);//<buffer>console.log(len);/3</buffer></buffer>
由于可以不断写入内容到Buffer对象中,并且每次写入可以指定编码,所以Buffer对象中可以存在多种编码转化后的内容。需要小心的是,每种编码所用的字节长度不同,将Buffer反转回字符串时需要谨慎处理
【toString()】
实现Buffer向字符串的转换也十分简单,Buffer对象的toString()可以将Buffer对象转换为字符串
buf.toString([encoding], [start], [end])
encoding - 使用的编码。默认为 'utf8'
start - 指定开始读取的索引位置,默认为 0
end - 结束位置,默认为缓冲区的末尾
返回 - 解码缓冲区数据并使用指定的编码返回字符串
var buf =Buffer.alloc(26);for (var i = 0 ; i
【toJSON()】
将 Node Buffer 转换为 JSON 对象
buf.toJSON()
返回 buf
的 JSON 格式
var buf = Buffer.from('test');var json = buf.toJSON(buf); console.log(json);//{ type: 'Buffer', data: [ 116, 101, 115, 116 ] }
【isEncoding()】
目前比较遗憾的是,Node的Buffer对象支持的编码类型有限,只有少数的几种编码类型可以在字符串和Buffer之间转换。为此,Buffer提供了一个isEncoding()函数来判断编码是否支持转换
Buffer.isEncoding(encoding)
将编码类型作为参数传入上面的函数,如果支持转换返回值为true,否则为false。很遗憾的是,在中国常用的GBK、GB2312和BIG-5编码都不在支持的行列中
console.log(Buffer.isEncoding('utf8'));//trueconsole.log(Buffer.isEncoding('gbk'));//false
类方法
【Buffer.byteLength(string[, encoding])】
Buffer.byteLength()方法返回一个字符串的实际字节长度。 这与 String.prototype.length 不同,因为那返回字符串的字符数
string
encoding
返回:
var str = '火柴';var buf = Buffer.from(str); console.log(str.length);//2console.log(buf.length);//6console.log(buf.byteLength);//6
【Buffer.compare(buf1, buf2)】
该方法用于比较 buf1 和 buf2 ,通常用于 Buffer 实例数组的排序。 相当于调用 buf1.compare(buf2)
buf1
buf2
Returns:
var buf1 = Buffer.from('1234');var buf2 = Buffer.from('0123');var arr = [buf1, buf2];var result = Buffer.compare(buf1,buf2); console.log(result);//1console.log(arr.sort());//[ <buffer>, <buffer> ]</buffer></buffer>
【Buffer.concat(list[, totalLength])】
该方法返回一个合并了 list 中所有 Buffer 实例的新建的 Buffer
list
totalLength
返回:
如果 list 中没有元素、或 totalLength 为 0 ,则返回一个新建的长度为 0 的 Buffer 。如果没有提供 totalLength ,则从 list 中的 Buffer 实例计算得到。 为了计算 totalLength 会导致需要执行额外的循环,所以提供明确的长度会运行更快
var buf1 = Buffer.alloc(10);var buf2 = Buffer.alloc(14);var buf3 = Buffer.alloc(18);var totalLength = buf1.length + buf2.length + buf3.length; console.log(totalLength);//42var bufA = Buffer.concat([buf1, buf2, buf3], totalLength); console.log(bufA);//<buffer>console.log(bufA.length);//42</buffer>
【Buffer.isBuffer(obj)】
如果 obj
是一个 Buffer
则返回 true
,否则返回 false
var buf = Buffer.alloc(5);var str = 'test'; console.log(Buffer.isBuffer(buf));//trueconsole.log(Buffer.isBuffer(str));//false
实例方法
【buf.slice([start[, end]])】
该方法返回一个指向相同原始内存的新建的 Buffer,但做了偏移且通过 start 和 end 索引进行裁剪
start
end
返回:
var buffer1 =Buffer.from('test'); console.log(buffer1);//<buffer>var buffer2 = buffer1.slice(1,3); console.log(buffer2);//<buffer>console.log(buffer2.toString());//'es'</buffer></buffer>
[注意]修改这个新建的 Buffer
切片,也会同时修改原始的 Buffer
的内存,因为这两个对象所分配的内存是重叠的
var buffer1 =Buffer.from('test'); console.log(buffer1);//<buffer>var buffer2 = buffer1.slice(1,3); console.log(buffer2);//<buffer>buffer2[0] = 0; console.log(buffer1);//<buffer>console.log(buffer2);//<buffer></buffer></buffer></buffer></buffer>
【buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])】
该方法用于拷贝 buf 的一个区域的数据到 target 的一个区域,即便 target 的内存区域与 buf 的重叠
target
targetStart
sourceStart
sourceEnd
返回:
var buffer1 =Buffer.from('test');var buffer2 = Buffer.alloc(5);var len = buffer1.copy(buffer2,1,3); console.log(buffer1);//<buffer>console.log(buffer2);//<buffer>console.log(len);//1</buffer></buffer>
【buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])】
该方法比较 buf 与 target,返回表明 buf 在排序上是否排在 target 之前、或之后、或相同。 对比是基于各自 Buffer 实际的字节序列
target
targetStart
targetEnd
sourceStart
sourceEnd
返回:
如果 target 与 buf 相同,则返回 0
如果 target 排在 buf 前面,则返回 1
如果 target 排在 buf 后面,则返回 -1
var buf1 = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9]);var buf2 = Buffer.from([5, 6, 7, 8, 9, 1, 2, 3, 4]);// 输出: 0(buf2中的1234对比buf2中的1234)console.log(buf1.compare(buf2, 5, 9, 0, 4));// 输出: -1(buf2中的567891对比buf1中的56789)console.log(buf1.compare(buf2, 0, 6, 4));// 输出: 1(buf2中的1对比buf2中的6789)console.log(buf1.compare(buf2, 5, 6, 5));
【buf.equals(otherBuffer)】
如果 buf 与 otherBuffer 具有完全相同的字节,则返回 true,否则返回 false
otherBuffer
返回:
var buf1 = Buffer.from('ABC');var buf2 = Buffer.from('ABC');var buf3 = Buffer.from('abc'); console.log(buf1.equals(buf2));//trueconsole.log(buf1.equals(buf3));//false
【buf.fill(value[, offset[, end]][, encoding])】
value
offset
end
encoding
返回:
如果未指定 offset 和 end,则填充整个 buf。 这个简化使得一个Buffer的创建与填充可以在一行内完成
var b = Buffer.allocUnsafe(10).fill('h'); console.log(b.toString());//hhhhhhhhhh
【buf.indexOf(value[, byteOffset][, encoding])】
value
byteOffset
encoding
返回:
如果value是字符串,则 value 根据 encoding 的字符编码进行解析;如果value是Buffer,则value会被作为一个整体使用。如果要比较部分 Buffer 可使用 buf.slice();如果value是数值,则 value 会解析为一个 0 至 255 之间的无符号八位整数值
var buf = Buffer.from('this is a buffer');// 输出: 0console.log(buf.indexOf('this'));// 输出: 2console.log(buf.indexOf('is'));// 输出: 8console.log(buf.indexOf(Buffer.from('a buffer')));// 输出: 8// (97 是 'a' 的十进制 ASCII 值)console.log(buf.indexOf(97));// 输出: -1console.log(buf.indexOf(Buffer.from('a buffer example')));// 输出: 8console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8)));
【buf.lastIndexOf(value[, byteOffset][, encoding])】
与 buf.indexOf() 类似,除了 buf 是从后往前搜索而不是从前往后
var buf = Buffer.from('this buffer is a buffer');// 输出: 0console.log(buf.lastIndexOf('this'));// 输出: 17console.log(buf.lastIndexOf('buffer'));// 输出: 17console.log(buf.lastIndexOf(Buffer.from('buffer')));// 输出: 15// (97 是 'a' 的十进制 ASCII 值)console.log(buf.lastIndexOf(97));// 输出: -1console.log(buf.lastIndexOf(Buffer.from('yolo')));// 输出: 5console.log(buf.lastIndexOf('buffer', 5));// 输出: -1console.log(buf.lastIndexOf('buffer', 4));
【buf.includes(value[, byteOffset][, encoding])】
该方法相当于 buf.indexOf() !== -1
value
byteOffset
encoding
返回:
var buf = Buffer.from('this is a buffer');// 输出: trueconsole.log(buf.includes('this'));// 输出: trueconsole.log(buf.includes('is'));// 输出: trueconsole.log(buf.includes(Buffer.from('a buffer')));// 输出: true// (97 是 'a' 的十进制 ASCII 值)console.log(buf.includes(97));// 输出: falseconsole.log(buf.includes(Buffer.from('a buffer example')));// 输出: trueconsole.log(buf.includes(Buffer.from('a buffer example').slice(0, 8)));// 输出: falseconsole.log(buf.includes('this', 4));
위 내용은 nodeJS의 바이너리 버퍼 객체 인스턴스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

예, JavaScript의 엔진 코어는 C로 작성되었습니다. 1) C 언어는 효율적인 성능과 기본 제어를 제공하며, 이는 JavaScript 엔진 개발에 적합합니다. 2) V8 엔진을 예를 들어, 핵심은 C로 작성되며 C의 효율성 및 객체 지향적 특성을 결합하여 C로 작성됩니다.

JavaScript는 웹 페이지의 상호 작용과 역학을 향상시키기 때문에 현대 웹 사이트의 핵심입니다. 1) 페이지를 새로 고치지 않고 콘텐츠를 변경할 수 있습니다. 2) Domapi를 통해 웹 페이지 조작, 3) 애니메이션 및 드래그 앤 드롭과 같은 복잡한 대화식 효과를 지원합니다. 4) 성능 및 모범 사례를 최적화하여 사용자 경험을 향상시킵니다.

C 및 JavaScript는 WebAssembly를 통한 상호 운용성을 달성합니다. 1) C 코드는 WebAssembly 모듈로 컴파일되어 컴퓨팅 전력을 향상시키기 위해 JavaScript 환경에 도입됩니다. 2) 게임 개발에서 C는 물리 엔진 및 그래픽 렌더링을 처리하며 JavaScript는 게임 로직 및 사용자 인터페이스를 담당합니다.

JavaScript는 웹 사이트, 모바일 응용 프로그램, 데스크탑 응용 프로그램 및 서버 측 프로그래밍에서 널리 사용됩니다. 1) 웹 사이트 개발에서 JavaScript는 HTML 및 CSS와 함께 DOM을 운영하여 동적 효과를 달성하고 jQuery 및 React와 같은 프레임 워크를 지원합니다. 2) 반응 및 이온 성을 통해 JavaScript는 크로스 플랫폼 모바일 애플리케이션을 개발하는 데 사용됩니다. 3) 전자 프레임 워크를 사용하면 JavaScript가 데스크탑 애플리케이션을 구축 할 수 있습니다. 4) node.js는 JavaScript가 서버 측에서 실행되도록하고 동시 요청이 높은 높은 요청을 지원합니다.

Python은 데이터 과학 및 자동화에 더 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 더 적합합니다. 1. Python은 데이터 처리 및 모델링을 위해 Numpy 및 Pandas와 같은 라이브러리를 사용하여 데이터 과학 및 기계 학습에서 잘 수행됩니다. 2. 파이썬은 간결하고 자동화 및 스크립팅이 효율적입니다. 3. JavaScript는 프론트 엔드 개발에 없어서는 안될 것이며 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축하는 데 사용됩니다. 4. JavaScript는 Node.js를 통해 백엔드 개발에 역할을하며 전체 스택 개발을 지원합니다.

C와 C는 주로 통역사와 JIT 컴파일러를 구현하는 데 사용되는 JavaScript 엔진에서 중요한 역할을합니다. 1) C는 JavaScript 소스 코드를 구문 분석하고 추상 구문 트리를 생성하는 데 사용됩니다. 2) C는 바이트 코드 생성 및 실행을 담당합니다. 3) C는 JIT 컴파일러를 구현하고 런타임에 핫스팟 코드를 최적화하고 컴파일하며 JavaScript의 실행 효율을 크게 향상시킵니다.

실제 세계에서 JavaScript의 응용 프로그램에는 프론트 엔드 및 백엔드 개발이 포함됩니다. 1) DOM 운영 및 이벤트 처리와 관련된 TODO 목록 응용 프로그램을 구축하여 프론트 엔드 애플리케이션을 표시합니다. 2) Node.js를 통해 RESTFULAPI를 구축하고 Express를 통해 백엔드 응용 프로그램을 시연하십시오.

웹 개발에서 JavaScript의 주요 용도에는 클라이언트 상호 작용, 양식 검증 및 비동기 통신이 포함됩니다. 1) DOM 운영을 통한 동적 컨텐츠 업데이트 및 사용자 상호 작용; 2) 사용자가 사용자 경험을 향상시키기 위해 데이터를 제출하기 전에 클라이언트 확인이 수행됩니다. 3) 서버와의 진실한 통신은 Ajax 기술을 통해 달성됩니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
