How does bitwise-and operator work on objects in javascript?
我正在开发一个开源项目,遇到了位运算符。我确实理解这些原则,而且JavaScript将非零整数值计算为真(如果我错了,请在这里更正我;在另一篇文章中的一个可接受的答案中找到这条语句)。
相关代码如下:
1 2 3 4 5 6 7 8 9 10 | function example(){ var args = arguments; var j = 1 & args[0]; . . . } var test = {keyA: 1, keyB: 2}; example(test); |
我的问题是:
对象的二进制等价物是什么?
据我所知,如果
请帮帮我,伙计们。我花了最后一个小时在这里搜索任何几乎相关的帖子,大多数主题是关于数字的,一两个是关于布尔值的,就是这样。
编辑:由于上面给出的代码示例似乎不像我想的那么清楚,这里是我找到的完整功能(和工作):
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 26 27 28 29 30 | function Extend() { var args = arguments; var target; var options; var propName; var propValue; var deep = 1 & args[0]; var i = 1 + deep; target = args[i - 1] || {}; for (; i < args.length; i++) { // Only deal with non-null/undefined values if (options = args[i]) { // Extend the base object for (propName in options) { propValue = options[propName]; if (propValue !== undefined) { propValue = options[propName]; target[propName] = (deep && IsPlainObject(target[propName])) ? Extend(deep, {}, propValue) : propValue; } } } } // Return the modified object return target; } var _someVariable = Extend({keyA: 1, keyB: 2, keyC: 10}, _someOtherVariable); |
1 | Extend({keyA: {a: 1}, keyB: 2}, {keyC: 3, keyA: {b: 2}}); |
和
1 | Extend(true, {keyA: {a: 1}, keyB: 2}, {keyC: 3, keyA: {b: 2}}); |
第一个变量将返回:
1 | {keyA: {b: 2}, keyB: 2, keyC: 3} |
第二个目的是返回:
1 | {keyA: {a: 1, b: 2}, keyB: 2, keyC: 3} |
因此,函数实际上允许第一个可选参数,这将使函数递归地应用扩展,从而得到一个深的而不是浅的扩展对象。您还可以通过分析递归调用来了解这种意图,其中第一个参数是
1 | var i = 1 + deep; |
由于
附带说明:由于一个bug,第二个版本返回与第一个版本相同的结果。要修复错误,请更换
1 2 | target[propName] = (deep && IsPlainObject(target[propName])) ? Extend(deep, {}, propValue) : propValue; |
用:
1 2 | target[propName] = (deep && IsPlainObject(target[propName])) ? Extend(deep, target[propName], propValue) : propValue; |
现在,从本质上来说:
1 | var deep = 1 & args[0]; |
位运算符的使用必须是一种将效率规则置于清晰度之上的想法。其目的是,如果第一个参数表示可选参数,则将
1 | Extend(["3"], {myattr: 2}); |
我们希望使用附加的自定义属性
1 | {0:"3", length: 1, myattr: 2} |
但是,当前的
1 | {myattr: 2} |
结论:最好避免使用这种隐式的位运算符,并这样做:
1 | var deep = args.length > 0 && typeof args[0] === 'boolean' && args[0]; |
在公共语言中:当至少有一个参数且该参数是布尔值且其值为真时,让
最后,最好向该函数添加注释,以澄清第一个可选参数的用法。
位运算符可以处理32位(非)有符号整数。如果传入的内容不是数字,则会隐式强制为数字。这是使用对象的
检查