在C++中,将变量的限制存储在变量中比评估值更快吗?
例如:
这是一种较慢的使用方法
for(int i=0; i<n*n+2*n; ++i)
{ .... }
Run Code Online (Sandbox Code Playgroud)
而不是做以下?
for(int i=0, limit=n*n+2*n; i<limit; ++i)
{ .... }
Run Code Online (Sandbox Code Playgroud)
为清楚起见,假设n
某个给定变量在循环过程中保持不变.
因此,在弱类型 C 中,0 在布尔上下文(如条件表达式)中被评估为 false,而其他所有内容都是 true。现代动态语言似乎在零是否为假的问题上存在分歧:Python、PHP 和 Javascript 说是,而 Ruby、Lua、Clojure 和 Racket 说不是。
问题是,为什么?我用谷歌搜索了我的问题标题,并在黑客新闻上找到了这个帖子,其中有有趣的内容,但没有回答我的问题。在我的搜索中用“lisp”替换 Clojure 没有产生任何历史参考。
因此,为了更准确地阐述我的问题:在条件表达式中零评估是否有实际的技术优势,或者它只是成为动态语言中的准标准(不受 C 的影响)早期的口齿不清?对于习惯 C/Python/Javascript 的程序员来说,这绝对有点奇怪。
所以我最近了解到将你的js置于DOM的底部是过时的,我应该再次将它们放入<head>
"async"和"defer"属性中.
大.但基于优先级,我对应该使用哪个有点困惑.
所以我有:
哪个应该异步,哪个应该延迟?
如果我理解了这一切,那些对网站外观没有直接影响的应该延迟,而其他一切都是异步的.正确?或者我把这些混淆了.
我正在使用模块格式在节点中编写一个快速/简单的部署脚本,mjs
以便我可以使用模块语法。
我在文件中所做的一件事是根据当前模块的目录从相对路径解析绝对路径。
过去我会做类似的事情:
const path = require("path")
const distPath = path.resolve(__dirname, "..", "dist")
Run Code Online (Sandbox Code Playgroud)
但在模块 js 中我丢失了__dirname
符号并收到错误:
ReferenceError: __dirname is not defined
Run Code Online (Sandbox Code Playgroud)
所以我跳到网上看看这是什么 mjs 版本(woof,搜索“mjs 中的解析路径”或任何排列,这是粗略的b/c 一切都指向原始的执行方式:P),以及从什么我了解到我可以这样做:
import { dirname, resolve } from "path"
import { fileURLToPath } from "url"
const distPath = resolve(dirname(fileURLToPath(import.meta.url)), "..", "dist")
Run Code Online (Sandbox Code Playgroud)
这是有效的,但打字很困难。
如果这是正确的方法,那么我只会记住新方法,但这感觉像是一个常见的任务,必须有更好的方法在模块 js 中执行它,但我只是还没有找到它。
还有其他选择吗?
许多语言都有一个运算符,允许您将一个操作的结果传递给另一个操作的调用(例如|
bash中的|>
操作符,F#中的操作符).
我对javascript中方法链接的常用习语的一个很大的好处是它从上到下,从左到右读取:
var fooOddSquares = [1, 2, 3, 4, 5]
.filter(x => x % 2)
.map(x => "foo" + x * x)
.reduce(((acc, str, i) => acc[i + 1] = str; return acc), {});
// => {1: "foo1", 2: "foo9", 3: "foo25"}
Run Code Online (Sandbox Code Playgroud)
与组成代码相比:
var something = func5(
func4(
func3(
func2(
func1(
somedata
)
)
)
)
);
Run Code Online (Sandbox Code Playgroud)
从右到左,从下到上阅读.我意识到这可以通过功能组合来清理,但这不一定是重点.只是为了清楚地了解我正在寻找的东西:
var something = func1(somedata)
|> func2
|> func3
|> func4
//etc...
Run Code Online (Sandbox Code Playgroud)
在javascript中对管道运算符进行谷歌搜索主要会显示有关按位OR运算的信息.随着一些挖,但是我能挖了这个文章描述运算符重载的卑劣破解版本,可以实现什么我谈论的东西.我还挖掘了这个描述所述运算符的要点,并说"它已被提议用于javascript".
看看ES 2016,我看到了一个求幂运算符和绑定运算符的提议.两者都很有用,但不是我想要的.所以根据要点的标题,有没有人真的为javascript提出这个?
通常我不会问这样的问题,但是python似乎有1.一个不同寻常的社区对习语的共识,并且倾向于通过使它们更高效来鼓励它们(例如列表理解对比地图,过滤器).
这是我在编码时发现自己使用的模式,请考虑以下JavaScript:
var f = (function() {
var closedOver = "whatever"
return function(param) {
// re-uses closure variable again and again with different param
}
})();
Run Code Online (Sandbox Code Playgroud)
或者C:
int foo(int x)
{
/*
compile-time constant, will not be recalced for every call,
name 'someConst' not visible in other scopes
*/
const int someConst = 134;
/* do stuff */
return whatever;
}
Run Code Online (Sandbox Code Playgroud)
一些可能的方法转换为python:
globalConstant = someConstant
def foo(param):
# does stuff with param and constant
return whatever
Run Code Online (Sandbox Code Playgroud)
或者可能:
from functools import …
Run Code Online (Sandbox Code Playgroud) 为什么 Typescript 编译器会抱怨以下代码?
type Foo = {
a: string
}
type Bar = {
b: number
}
type Baz = Foo | Bar;
function f(x: Baz): number {
if (x.a) { // property 'a' does not exist on type Bar!
return 0;
}
if (x.b) { // property 'b' does not exist on type Foo!
return 1;
}
return -1;
}
Run Code Online (Sandbox Code Playgroud)
element.onkeypress = function(e) {
if(e.keyCode) {
element.keyCode = e.keyCode;
} else {
element.keyCode = e.charCode;
}
};
Run Code Online (Sandbox Code Playgroud)
同样在java脚本中,也有
<input onChange="a(event)"/>
<script>
function a(event) {
alert(event.target.value);
}
</script>
Run Code Online (Sandbox Code Playgroud)
作为参数接收,我如何知道是否必须为参数而不是e设置事件?第二个例子不会工作,如果它的参数是除了事件以外的任何东西都不是javascript?
我有一个仓库,我从 github 上的一个项目中分叉出来,结构如下:
myfork.git
|
-- packages
|
--subpackage1
|
--package.json
|
--subpackage2
|
--package.json
Run Code Online (Sandbox Code Playgroud)
我在一个单独的分支 foo 中对 subpackage1 做了一些小的修改。现在我想在一个项目中使用它。所以我尝试了以下
yarn add https://github.com/myuser/myfork.git/subpackage1#foo
yarn add https://github.com/myuser/myfork.git/packages/subpackage1#foo
Run Code Online (Sandbox Code Playgroud)
然后我尝试没有分支说明符。然后我尝试npm install
代替yarn add
. 然后我尝试只安装除了基本 url 之外的任何东西都失败了,因为顶级package.json
. 我显然在这里遗漏了一些东西,但我无法弄清楚是什么。
假设我有一个cljs
包含以下内容的文件:
(ns foo)
(defn add [x y]
(+ x y))
Run Code Online (Sandbox Code Playgroud)
并希望将其作为JavaScript库提供给非ClojureScript开发人员(主要侧重于node.js)。我可以做这个:
clj -m cljs.main -c foo
Run Code Online (Sandbox Code Playgroud)
但是问题在于输出是针对Google闭包的模块系统(例如goog.require
)的。我可以将目标设置为none
带有-t
标志(而不是浏览器或节点),并且...无法解决此问题。将其设置为node
还不能解决问题:否index.js
(在Java中称为main),no module.exports = blah blah
。似乎它面向的是独立的全节点应用程序,而不是库。
我知道ClojureScript使用google闭包作为其自身的子模块,并且我不一定要摆脱所有这些问题(我不确定您可以这样做)。而且我知道es2015本机JavaScript模块由于其静态特性而退出市场。
我可以手动或通过脚本对输出进行按摩,以使其与npm生态系统完美配合,但是令我惊讶的是,没有编译器选项可以实际输出npm友好模块。还是在那里?我只是读--help
错了吗?
javascript ×5
html ×2
asynchronous ×1
c++ ×1
clojure ×1
clojurescript-javascript-interop ×1
github ×1
jquery ×1
lerna ×1
narrowing ×1
node.js ×1
npm ×1
optimization ×1
python ×1
typescript ×1
yarnpkg ×1