javascript 的 var xx=aa||bb; 赋值用法

本文解析了JavaScript中逻辑运算符&&、||与位运算符&、|的区别及应用场景,特别是对于null、undefined值的处理技巧。

今天看 给MTools 框架加东西的时候,发现 MTools 里面有好多这种用法,

猛一看,没看懂,呵呵。

立即google下,才明白其意义,很好用。 在此记录下,(本人菜,大虾莫笑)

 

例如: var t = T || '*'

当 T 的值不是null或undefined的时候, T的值会赋给t。反之则*会赋给t

 

 

 

 

 

下面附上,google到的资料

 

 

 

 

 

*********************************************************************

JS的&&和&,||和|运算符两个不同点


1.性能上的比较

如果&&的第一个运算数是false,就不再考虑第二个运算数,直接返回false;如果||的第一个运算数是true,也不再考虑第二个运算数,直接返回true。&和|运算符却不是这样的,它们总是要比较两个运算数才得出结果,因而性能上&&和||会比&和|好。

由于&&和||可能不考虑第二个运算数,所以我们应尽量避免在它们右边使用具有副作用(赋值、递增、递减和函数调用)的表达式,除非非常清楚自己再做什么。


if((a == null) && (b++ >10)) stop(); //b++递增运算可能不被执行
if((b++ >10) && (a == null)) stop(); //保证b++递增运算都被执行

2.逐位运算

&和|除了可以进行"逻辑运算"[1]外,还可以进行逐位运算,而&&和||只能进行逻辑运算。

3.JS的&和|与C#的&和|

在JS中,&和|只是逐位运算符,而在C#中,&和|既是逻辑运算符,又是位运算,通过以下代码可以看出。


document.write(true & false); //JS,结果为0

document.write(1 & 0); //JS,结果为0
bool a = true & false; //C#,结果为false
int b = 1 & 0; //结果为0


注[1]:&和|本是逐位运算符,之所以可以进行"逻辑运算",是由于JS是无类型的语言、各数据类型可以自由转换这一特性决定的,当用&和|进行"逻辑运算"时,实际上true被转换成1,false被转换成0,再进行逐位运算。也正是由于&和|是逐位运算符,才出现了第一点中所说的,它们总是要比较两个运算数才得出结果,才导致性能会比&&和||低一些。

// ==Auto.js== // @name 【精简版】列表扫描 + 磨损筛选 + CSV记录(ES5) // @desc 去除所有重复代码,仅保留必要逻辑 auto.waitFor(); console.show(); device.keepScreenDim(); setScreenMetrics(1236, 2676); // 请按实际设备修改 // ================ 配置常量 ================ var LIST_PAGE_ID = "recyclerview"; // 列表 RecyclerView ID var DEPOSIT_ID = "min_deposit_tv"; // 在售字段 ID var NAME_ID = "name_tv"; // 商品名称 ID var WEAR_FILTER_ID = "tv_abrade_filter"; // 磨损过滤器 ID var SORT_LIST_ID = "rv_sort_list"; // 排序面板列表 ID var SELLING_PRICE_ID = "tv_selling_price_value"; // 售卖价 ID var CATEGORY_CONTAINER_ID = "item_category_ll"; // 分类容器 ID var MAX_WAIT_MS = 5000; // 控件等待超时 var CSV_PATH = "/sdcard/AIM/Aa1.csv"; // CSV 输出路径 var successCount = 0; // 创建目录 var File = java.io.File; var parentDir = new File(CSV_PATH).getParentFile(); if (!parentDir.exists()) parentDir.mkdirs(); // ================ 工具函数(ES5,仅定义一次) ================ function round(num, digits) { var d = digits || 0; var f = Math.pow(10, d); return Math.round((num + '') * f) / f; } function extractNumber(text) { if (!text) return null; var clean = String(text).replace(/[^\d.]/g, ''); var m = clean.match(/^\d*\.\d+$|^\d+$/); if (!m) return null; var n = parseFloat(m[0]); return isNaN(n) ? null : n; } function normalizeString(str) { if (typeof str !== 'string') str = String(str); return str.trim().toLowerCase() .replace(/\s+/g, ' ') .replace(/[^\w\u4e00-\u9fa5]/g, ''); } function formatDateTime() { var now = new Date(); function pad(n) { return n < 10 ? '0' + n : n; } return now.getFullYear() + " " + pad(now.getHours()) + ":" + pad(now.getMinutes()) + ":" + pad(now.getSeconds()); } function clickCenter(bounds) { if (!bounds) return false; click(bounds.centerX(), bounds.centerY()); sleep(800); return true; } function waitFor(query, timeout) { var start = new Date().getTime(); var t = timeout || MAX_WAIT_MS; while ((new Date().getTime() - start) < t) { try { var w = query.findOne(1000); if (w) return w; } catch (e) {} sleep(300); } return null; } function waitForVisible(idStr) { var start = new Date().getTime(); while ((new Date().getTime() - start) < MAX_WAIT_MS) { try { var w = id(idStr).findOne(1000); if (w && w.visibleToUser && w.visibleToUser()) return w; } catch (e) {} sleep(300); } return null; } // ================ 数据采集函数 ================ function getTaskName() { try { var w = id("tv_order_details_title").findOne(3000); var txt = w ? (w.text() || w.desc() || "未知") : "未知"; log("📋 名称: " + txt); return txt; } catch (e) { log("⚠️ 获取名称失败: " + e.message); return "异常"; } } function getSellingPrice() { var w = waitFor(id(SELLING_PRICE_ID), 3000); if (!w) { log("❌ 未找到售卖价控件"); return null; } var price = extractNumber(w.text()); if (price === null) log("❌ 解析售价失败: " + w.text()); else log("✅ 我的售价: " + price); return price; } function getCurrentCategoryPrice() { var list = id(CATEGORY_CONTAINER_ID).find(); for (var i = 0; i < list.size(); i++) { var c = list.get(i); try { if (c.selected && typeof c.selected === 'function' && c.selected()) { var pricing = extractPricingFrom(c); if (pricing !== null) return pricing; } } catch (e) {} } return null; } function extractPricingFrom(parent) { try { var children = parent.children(); for (var i = 0; i < children.size(); i++) { var ch = children.get(i); var text = (ch.text && ch.text()) || (ch.desc && ch.desc()) || ''; var num = extractNumber(text); if (num !== null && num > 1) return num; } } catch (e) {} return null; } function getWearLevel() { var w = waitFor(id(WEAR_FILTER_ID), 2000); return w ? (w.text() || w.desc() || "未获取") : "未获取"; } function getAbraidFilterRange() { var w = waitFor(id(WEAR_FILTER_ID).className("android.widget.TextView"), 2000); if (!w) return null; var txt = (w.text && w.text()) || (w.desc && w.desc()) || ''; txt = String(txt).trim(); var m = txt.match(/(\d+\.\d+)\s*[-~\u81F3]\s*(\d+\.\d+)/); if (!m) return null; var minW = parseFloat(m[1]), maxW = parseFloat(m[2]); if (isNaN(minW) || isNaN(maxW) || minW >= maxW) return null; return { min: minW, max: maxW }; } // ================ 滑动 & 图像识别辅助 ================ function swipeUp() { var h = device.height, w = device.width; try { gesture(500, [w/2, h*0.7], [w/2, h*0.3]); sleep(1000); return true; } catch (e) { sleep(800); return false; } } function performBitmapClicks() { var cap = captureScreen(); var tem = images.read("/sdcard/脚本/小图/筛选.png"); if (cap && tem) { var p = images.findImage(cap, tem, { region: [957, 293, 242, 67], threshold: 0.9 }); if (!p) { device.setMusicVolume(7); media.playMusic("/sdcard/Music/My love 请别让爱凋落.mp3"); sleep(media.getMusicDuration() || 5000); engines.myEngine().forceStop(); } cap.recycle(); if (tem) tem.recycle(); } } // ================ 核心:磨损筛选逻辑 ================ function processWearFilter() { log("🔧 开始处理磨损筛选..."); // Step 1: 点击【磨损区间】 if (text("磨损区间").exists()) { var widget = text("磨损区间").findOne(2000); if (widget && widget.bounds) { clickCenter(widget.bounds()); log("🖱️ 已点击【磨损区间】"); sleep(1000); } } // Step 2: 等待 rv_sort_list 加载,并点击索引1 var list = waitFor(id(SORT_LIST_ID), 5000); if (!list) { toast("❌ 未找到磨损列表"); return false; } var items = list.children(); if (items.size() <= 5) { toast("❌ 选项不足,无法点击索引1"); return false; } var target1 = items[1]; if (!clickCenter(target1.bounds())) return false; log("✅ 成功点击索引1"); sleep(1000); // Step 3: 循环 step=2 to 4 var initialMinWear = null; var finalMaxWear = null; var categoryPrice = null; var diff = null; for (var step = 2; step <= 4; step++) { var sellingPrice = getSellingPrice(); if (!sellingPrice) break; categoryPrice = getCurrentCategoryPrice(); if (!categoryPrice) break; diff = round(sellingPrice - categoryPrice, 2); log("📊 当前差价: " + diff.toFixed(2)); if (diff <= 5) { log("🔴 差价≤5,终止推进"); break; } if (initialMinWear === null) { var range = getAbraidFilterRange(); if (range) initialMinWear = range.min; } // 重新打开面板 var filter = waitFor(id(WEAR_FILTER_ID), 3000); if (!filter || !clickCenter(filter.bounds())) break; list = waitFor(id(SORT_LIST_ID), 4000); if (!list) break; items = list.children(); if (step >= items.size()) break; var target = items[step]; if (!clickCenter(target.bounds())) break; log("✅ 已点击第 %d 档", step); sleep(1000); var currentRange = getAbraidFilterRange(); if (currentRange) finalMaxWear = currentRange.max; } // 返回是否成功完成且差价 > 5 return finalMaxWear !== null && diff > 5; } // ================ CSV 记录 ================ function writeToCSV(data) { try { var file = new File(CSV_PATH); var needsHeader = !file.exists() || file.length() === 0; var fw = new java.io.FileWriter(file, true); // 追加模式 var bw = new java.io.BufferedWriter(fw); if (needsHeader) { bw.write("物品名称,最小磨损,最大磨损,定价,售价,差价,时间\n"); } var escapedName = data.name.replace(/"/g, '""'); var line = [ '"' + escapedName + '"', '"' + data.wear + '"', data.category.toFixed(2), data.selling.toFixed(2), data.diff.toFixed(2), data.time ].join(",") + "\n"; bw.write(line); bw.close(); fw.close(); successCount++; toastLog("📌 已记录: " + data.name + " | 差价:" + data.diff); } catch (e) { log("❌ CSV写入失败: " + e.message); } } // ================ 主循环 ================ toast("✅ 脚本启动,请进入列表页..."); var processedKeys = {}; while (true) { log("🔄 ========== 新一轮循环开始 =========="); // A: 等待列表页 if (!waitForVisible(LIST_PAGE_ID)) { log("🔙 返回中..."); back(); sleep(2000); continue; } // B: 扫描并点击符合条件的商品 var rv = id(LIST_PAGE_ID).findOne(2000); if (!rv) { log("❌ 未找到商品列表"); continue; } var found = false; var children = rv.children(); for (var i = 0; i < children.size(); i++) { var item = children.get(i); var depositWidget = item.findOne(id(DEPOSIT_ID)); if (!depositWidget) continue; var deposit = extractNumber(depositWidget.text()); if (isNaN(deposit) || deposit <= 500) continue; var nameWidget = item.findOne(id(NAME_ID)); var name = (nameWidget && (nameWidget.text() || nameWidget.desc())) || "未命名-" + deposit; var key = normalizeString(name) + "@" + Math.round(deposit * 100); if (processedKeys[key]) { log("🔁 跳过已处理: " + name); continue; } log("🎯 发现目标: " + name + " | 在售¥" + deposit); if (item.click()) { processedKeys[key] = true; found = true; break; } else { log("❌ 点击失败"); } } if (!found) { log("📭 无新目标,上滑加载"); performBitmapClicks(); // 图像检测音乐提醒 if (swipeUp()) { sleep(1500); continue; } else { toastLog("🔚 已到底部,脚本结束"); break; } } // C: 进入详情页后执行磨损筛选 sleep(2000); var shouldRecord = processWearFilter(); if (shouldRecord) { var name = getTaskName(); var selling = getSellingPrice(); var category = getCurrentCategoryPrice(); var wear = getWearLevel(); var diff = round(selling - category, 2); if (selling && category && diff > 5) { writeToCSV({ name: name, wear: wear, category: category, selling: selling, diff: diff, time: formatDateTime() }); } } else { log("🟡 条件不满足,跳过记录"); } // 返回列表 back(); sleep(1500); } 用ES5语法修改auto脚本
11-11
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值