如何在JavaScript中将字符串转换为整数?
我正在查看Mozilla的代码,它为Array添加了一个过滤方法,它有一行代码让我很困惑.
var len = this.length >>> 0;
Run Code Online (Sandbox Code Playgroud)
我以前从未见过用于JavaScript的>>>.
它是什么,它做了什么?
当传递一个大的毫秒值时,我遇到了一些意想不到的行为setTimeout().例如,
setTimeout(some_callback, Number.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)
和
setTimeout(some_callback, Infinity);
Run Code Online (Sandbox Code Playgroud)
两者都导致some_callback几乎立即运行,好像我已经通过0而不是大量的延迟.
为什么会这样?
我最近发现了这段JavaScript代码:
Math.random() * 0x1000000 << 0
Run Code Online (Sandbox Code Playgroud)
我知道第一部分只是生成0到0x1000000(== 16777216)之间的随机数.
但第二部分似乎很奇怪.执行0位移位有什么意义?我不认为它会做任何事情.然而,经过进一步调查,我注意到0的偏移似乎截断了数字的小数部分.此外,无论是右移,左移,还是无符号右移,都无关紧要.
> 10.12345 << 0
10
> 10.12345 >> 0
10
> 10.12345 >>> 0
10
Run Code Online (Sandbox Code Playgroud)
我用Firefox和Chrome测试过,行为是一样的.那么,这个观察的原因是什么?它只是JavaScript的细微差别,还是也出现在其他语言中?我以为我理解了位移,但这令我感到困惑.
可能重复:
零填充位移0有什么用?(a >>> 0)
我一直在尝试我的一个项目中的一些函数式编程概念,我正在阅读Array.prototype.map,这是ES5中的新功能,看起来像这样:
Array.prototype.map = function(fun) {
"use strict";
if (this === void 0 || this === null) {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun !== "function") {
throw new TypeError();
}
var res = new Array(len);
var thisp = arguments[1];
for (var i = 0; i < len; i++) {
if (i in t) {
res[i] = fun.call(thisp, t[i], i, t);
}
}
return …Run Code Online (Sandbox Code Playgroud) 在MDC中,有大量代码片段意味着在不支持它们的浏览器中实现对新ECMAScript标准的支持,例如Array.prototype.map函数:
if (!Array.prototype.map)
{
Array.prototype.map = function(fun /*, thisp */)
{
"use strict";
if (this === void 0 || this === null)
throw new TypeError();
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun !== "function")
throw new TypeError();
var res = new Array(len);
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in t)
res[i] = fun.call(thisp, t[i], i, t);
}
return res;
};
}
Run Code Online (Sandbox Code Playgroud)
使用此功能的好处是什么(如果有的话)而不是 …
我想编写一个函数,从给定的起始索引中查找给定数组中的连续子数组,如果找到则返回数组中子数组的索引,如果找不到,则返回-1.这类似于String.indexOf,但是对于数组和子数组而不是字符串和子字符串.
这是我的工作代码:
var find_csa = function (arr, subarr, from_index) {
if (typeof from_index === 'undefined') {
from_index = 0;
}
var i, found, j;
for (i = from_index; i < 1 + (arr.length - subarr.length); ++i) {
found = true;
for (j = 0; j < subarr.length; ++j) {
if (arr[i + j] !== subarr[j]) {
found = false;
break;
}
}
if (found) return i;
}
return -1;
};
Run Code Online (Sandbox Code Playgroud)
这些是我的测试和他们的期望值:
console.log(find_csa([1, 2, 3, 4, 5], [2, 3, …Run Code Online (Sandbox Code Playgroud) 另一个问题是关于a >>> 0Javascript中代码片段的含义.事实证明,这是一种确保变量是无符号32位整数的聪明方法.
这很漂亮,但我不喜欢它有两个原因.
这让我想问:在Javascript中将任意值转换为"整数"的最惯用方法是什么? 它应该适用于有符号整数,而不仅仅是非负数.由于整数只是在Javascript中伪装成浮点这一事实导致的这种情况是可以接受的,但是应该被承认.它不应该返回undefined或NaN在任何情况下(这些不是整数),但返回0非数字值.
可能重复:
零填充位移0有什么用?(a >>> 0)
我在看array.indexOf(),我知道IE7本身不支持它.我正在阅读MDC,并看到了如何将其原型化为不支持它的浏览器的示例.我正在阅读它,试图了解一切是如何运作的,但我不确定我是否100%理解它.混淆的主要原因是位运算符,特别是>>>.我不确定这个运算符对什么有用.以下是他们使用它的方式.任何人都可以确切地解释它有用的内容以及为什么不能这么做if (t.length === 0)?
var t = Object(this);
var len = t.length >>> 0;
if (len === 0)
return -1;
Run Code Online (Sandbox Code Playgroud) 可能的重复项:
1. 零填充位移位0有什么用?(a >>> 0)
2. JavaScript的三倍大于
我正在研究一些MooTools代码,并注意到此代码段已在每种数组方法中使用:
var length = this.length >>> 0;
Run Code Online (Sandbox Code Playgroud)
这样做有什么好处?在我看来,这似乎不是最大长度的东西,因为3247823748372 >>> 0 === 828472596和3247823748373 >>> 0 === 828472597(因此,两者都高1,如果是因为maxLength,那么做类似的事情会更好var length = Math.min(this.length, MAX_LENGTH)吗?)。
什么是>>符号是什么意思?在这个页面上,有一行如下所示:
var i = 0, l = this.length >> 0, curr;
Run Code Online (Sandbox Code Playgroud) javascript ×12
bit-shift ×2
integer ×2
operators ×2
arrays ×1
idioms ×1
numbers ×1
settimeout ×1
string ×1