在某些项目中,我需要验证一些数据并尽可能确定它是可以在数学运算中使用的javascript数值.
jQuery和其他一些javascript库已经包含了这样一个函数,通常称为isNumeric.stackoverflow上还有一篇文章被广泛接受为答案,与前面提到的库所使用的一般例程相同.
function isNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
Run Code Online (Sandbox Code Playgroud)
作为我的第一篇文章,我无法在该帖子中回复.我接受的帖子的问题是,似乎有一些角落案例影响了我正在做的一些工作,所以我做了一些改变,试图解决我遇到的问题.
首先,如果参数是长度为1的数组,则上面的代码将返回true,并且该单个元素是上述逻辑认为是数字的类型.在我看来,如果它是一个数组,那么它不是数字.
为了缓解这个问题,我添加了一个检查来从逻辑中对数组进行折扣
function isNumber(n) {
return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n);
}
Run Code Online (Sandbox Code Playgroud)
当然,您也可以使用Array.isArray而不是Object.prototype.toString.call(n) !== '[object Array]'
编辑:我已经更改了代码以反映数组的通用测试,或者您可以使用jquery $.isArray或原型Object.isArray
我的第二个问题是负十六进制整数文字字符串("-0xA" - > -10)没有被计为数字.但是,正十六进制整数文字字符串("0xA" - > 10)被视为数字.我需要两个都是有效的数字.
然后我修改了逻辑以考虑到这一点.
function isNumber(n) {
return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}
Run Code Online (Sandbox Code Playgroud)
如果你每次调用函数时都担心正则表达式的创建,那么你可以在一个闭包中重写它,就像这样
isNumber = (function () {
var rx = /^-/;
return function (n) {
return Object.prototype.toString.call(n) !== '[object …Run Code Online (Sandbox Code Playgroud) 在ES6中,我们现在有迭代器和for..of来迭代它们.我们有一些数组内置函数 ; 特别是键,值和条目.
这些方法允许人们执行通常执行的大部分迭代.但是,反向迭代怎么样?这也是一个非常常见的任务,我没有在规范中看到任何具体的内容吗?或许我错过了?
好的,我们有Array.prototype.reverse但是我不一定想要在适当的位置反转大型数组,然后在完成时再次反转它.我也不想使用Array.prototype.slice来制作一个临时的浅拷贝并反转那个迭代.
所以我看了一下发电机并提出了这些有效的解决方案.
(function() {
'use strict';
function* reverseKeys(arr) {
let key = arr.length - 1;
while (key >= 0) {
yield key;
key -= 1;
}
}
function* reverseValues(arr) {
for (let key of reverseKeys(arr)) {
yield arr[key];
}
}
function* reverseEntries(arr) {
for (let key of reverseKeys(arr)) {
yield [key, arr[key]];
}
}
var …Run Code Online (Sandbox Code Playgroud)我在Fedora 19上安装了节点v0.10.28以及V8 v3.14.5.9.我遇到的问题是带有thisArg可选参数的方法,比如Array.prototype.forEach.
如果我在Chromium v33或Firefox v28上执行以下代码 - jsFiddle
var y = [1, 2, 3];
y.forEach(function (element) {
console.log(this);
}, 'hej');
Run Code Online (Sandbox Code Playgroud)
我得到了一个输出
String {0: "h", 1: "e", 2: "j", length: 3}
String {0: "h", 1: "e", 2: "j", length: 3}
String {0: "h", 1: "e", 2: "j", length: 3}
Run Code Online (Sandbox Code Playgroud)
然后相同的代码,但在严格的模式 - jsFiddle
var y = [1, 2, 3];
y.forEach(function (element) {
'use strict';
console.log(this);
}, 'hej');
Run Code Online (Sandbox Code Playgroud)
我得到一个输出
hej
hej
hej
Run Code Online (Sandbox Code Playgroud)
根据ECMA5规范sec-function.prototype.call,这些是我期望的结果.
thisArg值未经修改即作为此值传递.这是对版本3的更改,其中未定义或null thisArg替换为全局对象,ToObject应用于所有其他值,并将结果作为此值传递.即使thisArg未经修改就通过,非严格模式函数在进入函数时仍会执行这些转换.
我正在尝试使用此函数在 JS 中计算剩余时间(例如:从今天(2014/03/02)算起的 10 年、2 个月和 10 天:
var d2 = new Date(2024, 3, 12);
var d1 = new Date();
var d0 = new Date(1970, 0, 1);
var diff = new Date(d2.getTime() - (d1.getTime() + d0.getTime() ) );
var years = diff.getFullYear();
var months = diff.getMonth();
var days = diff.getDay();
alert("remaining time = " + years + " years, " + months + " months, " + days + " days.");
Run Code Online (Sandbox Code Playgroud)
但是,我得到了 1980 年的差异,而不是 10 年的差异(尽管我理解的天数差异购买了以月和年为单位的天数变化):

是否可以使用此策略执行此“剩余时间”操作?如果是这样,如何得到预期的结果?
这里是 JS shell …
因此,挑战在于我们正在尝试检测字符串是否与固定电话号码模式匹配,这是一个简单的字符串模式.
模式是:
ddd-ddd-dddd
Run Code Online (Sandbox Code Playgroud)
其中"d"代表十进制数字而减号代表自身," - "
当前用于测试的模式是,但如果感觉没有足够的模式来揭穿错误的格式,则可以增加.
"012-345-6789"
"0124-345-6789"
"012-3456-6789"
"012-345-67890"
"01a-345-6789"
"012-34B-6789"
"012-345-678C"
"012"
Run Code Online (Sandbox Code Playgroud)
我们的目标,我所寻求的答案,是找到执行以最快的速度返回的方法boolean,其中true意味着模式是好的,false意味着该模式是不好的.
这是我目前的解决方案
function matchesPattern(pattern) {
if (pattern.length !== 12) {
return false;
}
var i = 0,
code;
while (i < 12) {
code = pattern.charCodeAt(i);
if (i > 8 || i % 4 !== 3) {
if (code < 48 || code > 57) {
return false;
}
} else if (code !== 45) {
return false;
} …Run Code Online (Sandbox Code Playgroud) 我有两个输入标签,用于从用户中选择日期和时间.
<p>Start Date</p><p> <input ng-model="sdate" type="date" ></p>
<p>Start Time</p><p> <input ng-model="stime" type="time" ></p>
Run Code Online (Sandbox Code Playgroud)
这两个值传递给我想要将这两个输入值组合为一个Date对象的函数:
new Date(y, m, d, hh, mm, a)
Run Code Online (Sandbox Code Playgroud)
然后我可以使用它在日历中绘制事件的详细信息.我如何结合这两个值?我试过了:
start:new Date(sdate + stime)
start:new Date(sdate , stime)
start: new Date(sdate.getFullYear() + sdate.getMonth() + sdate.getDate() + stime.getHours + stime.getMinutes())
Run Code Online (Sandbox Code Playgroud)
但我所尝试的一切都没有奏效.
使用AngularJS时如何实现这一目标?
要求和背景
我想要一个通用randomInt函数,该函数可以处理直至(包括)Number.MIN_SAFE_INTEGERto 的值范围,并且Number.MAX_SAFE_INTEGER返回的值是均匀分布的。
因此,我从MDN开始,然后浏览了该Math.random页面。他们举了一个例子,它看起来是均匀分布的。
// Returns a random integer between min (included) and max (excluded)
// Using Math.round() will give you a non-uniform distribution!
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
Run Code Online (Sandbox Code Playgroud)
但是它带有以下注释。
请注意,由于JavaScript中的数字是IEEE 754浮点数,具有从近似到最近的行为,因此以下函数所声明的范围(不包括Math.random()本身的范围)不准确。如果选择了很大的界限(2 ^ 53或更高),则在极少数情况下可以计算通常不包括的上限。
我想使用-(2 ^ 53-1)和2 ^ 53-1范围,因此我认为此注释不适用。然后,我注意到max - min:对于我指定的较大范围,这将是一个问题:
示例-最大范围
Number.MAX_SAFE_INTEGER - Number.MIN_SAFE_INTEGER > Number.MAX_SAFE_INTEGER
Run Code Online (Sandbox Code Playgroud)
解决方案1-不是解决方案
根据MDN示例和我的要求,我开始做一些工作,并提出以下代码。
// Returns a random integer between min (included) and max (excluded) …Run Code Online (Sandbox Code Playgroud)我正在尝试将字符串值转换为表达式,以便我可以在if条件中使用它:
var StringVal = '20 > 18 && "yes" == "yes"';
if(StringVal){
....
}
Run Code Online (Sandbox Code Playgroud)
有可能这样做,请建议我.
谢谢
我想在我的网站上创建一个搜索功能,在那里我搜索div(并省略不符合我搜索的div .div列表如下所示:
<body>
<div class='subjects'>
<div id='subject'>soccer</div>
<div id='subject'>dancing</div>
<div id='subject'>soap</div>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
例如,当我搜索's'时,它没有显示内部跳舞的div,当你写'soa'时它只显示肥皂(不删除不匹配的div,只是不显示它们).
我真的没有搜索内容的经验,所以欢迎所有信息.
PS.我添加的标签是可用的语言,如果我需要扩展名:这没问题.
我有一些数字表示自纪元以来的毫秒数,00:00:00协调世界时(UTC),1970年1月1日,星期四
1365368400000,
1365973200000,
1366578000000
Run Code Online (Sandbox Code Playgroud)
我正在将它们转换为日期格式:
as.Date(as.POSIXct(my_dates/1000, origin="1970-01-01", tz="GMT"))
Run Code Online (Sandbox Code Playgroud)
回答:
[1] "2013-04-07" "2013-04-14" "2013-04-21"
Run Code Online (Sandbox Code Playgroud)
如何将这些字符串转换回自纪元以来的毫秒数?