Node.js中的缓冲区比较

Node.js中的缓冲区比较,node.js,Node.js,我是Node.js的新手。没有缓冲区比较,我应该为这些功能使用类似的模块 但当我在纯节点中比较缓冲区对象时,我看到了一种非常奇怪的行为 > var b1 = new Buffer([170]); > var b2 = new Buffer([171]); > b1 <Buffer aa> > b2 <Buffer ab> > b1 < b2 false > b1 > b2 false > b1 == b2 false

我是Node.js的新手。没有缓冲区比较,我应该为这些功能使用类似的模块

但当我在纯节点中比较缓冲区对象时,我看到了一种非常奇怪的行为

> var b1 = new Buffer([170]);
> var b2 = new Buffer([171]);
> b1
<Buffer aa>
> b2
<Buffer ab>
> b1 < b2
false
> b1 > b2
false
> b1 == b2
false
>var b1=新缓冲区([170]);
>var b2=新缓冲区([171]);
>b1
>b2
>b1b1>b2
假的
>b1==b2
假的

>var b1=新缓冲区([10]);
>var b2=新缓冲区([14]);
>b1
>b2
>b1>b2
假的
>b1b1==b2
假的

引擎盖下到底发生了什么?

这就是比较运算符处理对象的方式:

var a = {}, b = {};
a === b; //false
a == b; //false
a > b; //false
a < b; //false

var c = { valueOf : function () { return 0; } };
var d = { valueOf : function () { return 1; } };
c === d; //false
c == d; //false
c > d; //false
c < d; //true
第二部分:对比回击 有趣的部分来了。让我们看看关系运算符(
)是如何工作的。让我们按照这两种情况下的呼叫链进行操作

x = b1 //<Buffer aa>
y = b2 //<Buffer ab>

//11.8.5 The Abstract Relational Comparison Algorithm (http://es5.github.com/#x11.8.5)
Let px be the result of calling ToPrimitive(x, hint Number).
Let py be the result of calling ToPrimitive(y, hint Number).

//9.1 ToPrimitive (http://es5.github.com/#x9.1)
InputType is Object, therefore we call the internal [[DefaultValue]] method with hint Number.

//8.12.8 [[DefaultValue]] (hint) http://es5.github.com/#x8.12.8
We try and fetch the object's toString method. If it's defined, call it.

好吧,那没用。您会注意到在抽象关系比较算法中(对
来说,这是一个多么华丽的名字啊,已经有了一个公认的答案,但我想我还是插上一句话,因为我觉得公认的答案并不特别清楚或有用。即使只是因为它回答了OP没有问到的问题,这也是不正确的。因此,让我们把它归结为:

> var b1 = new Buffer([170]);
> var b2 = new Buffer([171]);
> b1 < b2
> b1 > b2
> b1 == b2
>var b1=新缓冲区([170]);
>var b2=新缓冲区([171]);
>b1b1>b2
>b1==b2
所要求的只是:“如何在缓冲区上执行等价性和小于/大于比较(也称为(总)排序)”

答案是:

  • 通过单步遍历两个缓冲区的所有字节手动执行,并在相应字节之间执行比较,例如,
    b1[idx]===b2[idx]

  • 或者使用
    Buffer.compare(b1,b2)
    ,它给出了
    -1
    0
    +1
    中的一个,这取决于第一个缓冲区是在第二个缓冲区之前排序,还是在第二个缓冲区之后排序(排序包含缓冲区的列表
    d
    d.sort(Buffer.compare)


观察我在第一个例子中使用的
====
;我经常在这个网站上评论JavaScript中的
==
滥用,这应该清楚地说明为什么会这样。

在这两种情况下,你是如何声明
b1
b2
的?你能提供b1和b2的定义吗。(1)永远不要在JavaScript中使用
==
,除非你知道自己在做什么;相反,始终使用
==
(2)除了
未定义的
空的
真的
假的
,数字(包括
无限
,但不包括
南的
)之外,JavaScript中没有等价测试,和字符串;
==
,bc本质上是一个值标识运算符。
x===y
表示
x
y
共享相同的分配内存/是相同的对象。
x===y
总是
false
否则,因此例如
[]==[]
错误的
-另请看我对下面已被接受的答案的评论。一个有趣问题的精彩答案:)你所谓的“抽象平等”(abstract equality)(
==
)实际上应该被称为“虚假平等”或“善意但实施不当的奇特平等”;你所谓的“严格平等”(
==
)它既不是关于严格,也不是关于平等,而是检查价值认同
x = b1 //<Buffer aa>
y = b2 //<Buffer ab>

//11.8.5 The Abstract Relational Comparison Algorithm (http://es5.github.com/#x11.8.5)
Let px be the result of calling ToPrimitive(x, hint Number).
Let py be the result of calling ToPrimitive(y, hint Number).

//9.1 ToPrimitive (http://es5.github.com/#x9.1)
InputType is Object, therefore we call the internal [[DefaultValue]] method with hint Number.

//8.12.8 [[DefaultValue]] (hint) http://es5.github.com/#x8.12.8
We try and fetch the object's toString method. If it's defined, call it.
> b1.toString()
'�'
> b2.toString()
'�'
> b1.toString().charCodeAt(0)
65533
> b2.toString().charCodeAt(0)
65533
b1 < b2 //is
b1.toString().charCodeAt(0) < b2.toString().charCodeAt(0) //is
65533 < 65533 //false
b1 > b2 //following same logic as above, false
b1 <= b2 //true
b1 >= b2 //true
> var b1 = new Buffer([170]);
> var b2 = new Buffer([171]);
> b1 < b2
> b1 > b2
> b1 == b2