Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个JavaScript函数可以工作?_Javascript_Arrays_Functional Programming_Numbers_Primes - Fatal编程技术网

为什么这个JavaScript函数可以工作?

为什么这个JavaScript函数可以工作?,javascript,arrays,functional-programming,numbers,primes,Javascript,Arrays,Functional Programming,Numbers,Primes,对于这个模糊的标题,我深表歉意,但我需要详细说明。下面是我读到的有问题的代码: 这是我第一次看到apply和every,请耐心听我说,但我的理解是apply基本上调用数组函数,其中第一个参数是它的This的替换,第二个是输出……我永远不会认为这是有用的,但是这个函数似乎有效,所以 在这里,他们似乎正在创建一个长度等于所讨论数字平方根的数组。我认为这是有道理的,因为平方根可能是所讨论的数字的最大因子 好的,从这里开始,如果我们要记录该数组的第一个数字,它将如下所示: > var i = 23

对于这个模糊的标题,我深表歉意,但我需要详细说明。下面是我读到的有问题的代码:

这是我第一次看到
apply
every
,请耐心听我说,但我的理解是
apply
基本上调用数组函数,其中第一个参数是它的
This
的替换,第二个是输出……我永远不会认为这是有用的,但是这个函数似乎有效,所以

在这里,他们似乎正在创建一个长度等于所讨论数字平方根的数组。我认为这是有道理的,因为平方根可能是所讨论的数字的最大因子

好的,从这里开始,如果我们要记录该数组的第一个数字,它将如下所示:

> var i = 23;
undefined
> Array.apply(0, Array(1 + ~~Math.sqrt(i)));
[ undefined, undefined, undefined, undefined, undefined ]
太好了,所以它是一个由五个
未定义的
组成的数组。好的,从这里开始,
each
方法应该检查数组中的每个元素是否通过回调函数测试(或其他)

Microsoft文档为
every
方法指定了三个可能的参数:

  • 价值观
  • 索引
  • 排列
因此,在本例中,
x
是值,即
未定义
,而
y
是索引

我们的产出与这一结论一致。但是,我仍然不清楚嵌套的返回语句(如果最低的返回,它的父语句是否也返回?),这里的
|
操作符(如果第一个测试通过,每个循环是否停止?),以及它的工作方式


编辑

日志应该是x,而不是y。我的错误是:

console.log(y + ' ' + i % y); -> console.log(x + ' ' + i % y);

解释

你会问,我是怎么发现这个代码的?当然,在Java中检查素数的最简单方法如下:

public static boolean isPrime(double num) {
    for (double i = 2.0; i < sqrt(num); i++) {
        if (num % i == 0.0) {
            return true;
        }
    }
    return false;
}
public静态布尔值isPrime(双数值){
for(双i=2.0;i
还是蟒蛇

def isPrime(num):
    x = 2
    isPrime = True
    while x < math.sqrt(num):
        if num % x == 0:
            isPrime = False
            break
        x = x + 1
    return isPrime
def isPrime(num):
x=2
isPrime=True
当x
或js

函数isPrime(n){
对于(var i=2.0;i

但是假设我想检查像
600851475143
这样的数字的最大素因子,这些循环方法会花费太长时间,对吗?我认为,正如我们所描述的,这种“黑客”可能效率更低,因为它使用数组而不是整数或浮点数,但即使如此,我只是在寻找一种更有效的方法来解决这个问题。

那篇文章中的代码基本上是垃圾。教人们在使用黑客的同时编写代码是垃圾。是的,黑客有他们的位置(优化),但教育者应该展示不依赖于他们的解决方案

黑客1

// the 0 isn't even relevant here. it should be null
Array.apply(0, Array(1 + ...))
黑客2

// This is just Math.floor(x), but trying to be clever  
~~x
黑客3

// this is an outright sin; totally unreadable code
// I bet most people don't know the binding precedence of % over +
y + ' ' + i % y

// this is evaluated as
y + ' ' + (i % y)

// example
2 + ' ' + (5 % 2) //=> "2 1"

我仍然对嵌套的返回语句不太清楚(如果最低的返回,它的父语句是否也返回?)

否。A
return
仅返回语句所在的函数

这里的| |运算符(如果第一次测试通过,每个循环是否停止?)

否。
Array.prototype。只要回调返回一个
false
,每个
都将返回
false
。如果从不从回调返回
false
。每个
都将返回'true'

function isEven(x) { return x % 2 === 0; }
[2,4,5,6].every(isEven); //=> false, stops at the 5
[2,4,6].every(isEven);   //=> true
下面是一个
短路的例子

[1,2,3,4,5,6].every(x=> {console.log(x, x<4); return x<4;});
// 1 true
// 2 true
// 3 true
// 4 false
//=> false

[1,2,3,4,5,6].every(x=>{console.log(x,x那篇文章中的代码基本上是垃圾。教人们在同时使用黑客的同时编写代码是垃圾。是的,黑客有自己的位置(优化),但教育者应该展示不依赖于他们的解决方案

黑客1

// the 0 isn't even relevant here. it should be null
Array.apply(0, Array(1 + ...))
黑客2

// This is just Math.floor(x), but trying to be clever  
~~x
黑客3

// this is an outright sin; totally unreadable code
// I bet most people don't know the binding precedence of % over +
y + ' ' + i % y

// this is evaluated as
y + ' ' + (i % y)

// example
2 + ' ' + (5 % 2) //=> "2 1"

我仍然对嵌套的返回语句不太清楚(如果最低的返回,它的父语句是否也返回?)

否。A
return
仅返回语句所在的函数

这里的| |运算符(如果第一次测试通过,每个循环是否停止?)

否。
Array.prototype。只要回调返回
false
,每个
都将返回
false
。如果回调从未返回
false
。每个
都将返回“true”

function isEven(x) { return x % 2 === 0; }
[2,4,5,6].every(isEven); //=> false, stops at the 5
[2,4,6].every(isEven);   //=> true
下面是一个
短路的例子

[1,2,3,4,5,6].every(x=> {console.log(x, x<4); return x<4;});
// 1 true
// 2 true
// 3 true
// 4 false
//=> false

<代码> [1,2,3,4,5,6]。(x= > {控制台。log(x,席绝对不得到相同的<代码>控制台)。()(代码)>代码> >输出,我并不感到意外。<代码> y>代码>永远不应是<代码>未定义< /COD>。
trick.是的,我读了博客,但被这部分卡住了。我想不出来,所以来了这里。我肯定没有得到与您相同的
console.log()
输出,我一点也不奇怪。
y
不应该是
未定义的
。您发现的博客中有一整篇关于
Array()的文章
trick。是的,我读了博客,但被这部分卡住了。我想不出来,所以来了这里。同意这些废话。这是一个聪明的把戏,但它违反了在博客上发布示例代码的第一条规则:代码越糟糕,将其嵌入到某一天可能至关重要的软件中的人就越多为了你的生存。那么,为什么每个index-of-0成员在
(y<2)上都不返回true呢
?我的意思是,我来到这个博客的唯一原因是,我用来检查Euler项目上某个数字的素数因子的for循环花费的时间太长。@pward这段代码并不比任何其他暴力素数测试更有效。如果你想让它更快,你需要构建