作为一个略懂 JS 的不写 JS 的开发,抬手随手写个简单的 JS,小坑真是一个接一个啊……

2016-03-04 11:13:32 +08:00
 realpg
一个页面,四个 input 年 1 月 1 年 2 月 2
要求年月 1 比年月 2 早 js 进行初步过滤防止输错 不需要防止恶意 只是个简单过滤
方便自己盲输录入错误

挂了个 jquery 用 val()取出四个值 ay am by bm 顺手写了个这个判断:
if ((ay * 12 + am) - (by * 12 + bm) > 0) playAlertMusic();

然后就愉快的录数据 结果,最后数据库汇总,还是有前面比后面小的……
百撕不得骑姐,按照那个数据重新录入,卧槽果然能通过验证

结果,一个一个变量 debug ,粗略猜到了是字符串数字问题, ay*12 就变成 integer ,跟一个 string int 做加法,竟然不会自动把 string int 转成 int ……

这 js 解释器啊啊啊啊。感觉大部分脚本语言都能比较好的处理好这种问题吧
4651 次点击
所在节点    程序员
33 条回复
zythum
2016-03-04 11:21:29 +08:00
如果你需要明切。可以使用 parseInt , 和 toString 方法明文转换。如果你想隐式转化就不要说 js 解释器坑,你换成哪个弱类型语言都有隐式转化。
hronro
2016-03-04 11:26:16 +08:00
这是坑么
realpg
2016-03-04 11:26:51 +08:00
@zythum
我没说我自己没有问题,我只是觉得这个放到弱类型语言上也是反常规的转换方式。

我测试了几个弱类型语言,没见过 js 解释器这样的,大多数都是跟我想象的一样, int 和 string storaged integer 相加,转换成 integer 进行处理
shunia
2016-03-04 11:27:15 +08:00
string + int 为什么要等于 int ?百撕不得骑姐
shiji
2016-03-04 11:27:28 +08:00
还是 PHP 好哈。。弱类型
yixiang
2016-03-04 11:27:34 +08:00
自己不熟悉一门语言导致的错误的原因是自己不熟悉这门语言。
realpg
2016-03-04 11:28:59 +08:00
好吧,我错了,你们都了解 js ,我不了解。
我 PHP 病犯了,我向广大程序员道歉,我拉低了平均技术水平,我错了,以后我改。
这贴到此为止吧。
lincanbin
2016-03-04 11:31:49 +08:00
@realpg 你不能这么黑 PHP 。
lxy
2016-03-04 11:33:26 +08:00
js 是我见过坑最多的语言……

'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
qianleilei
2016-03-04 11:35:25 +08:00
明明知道是弱类型为何不显示的转化?要是写 PHP 我也会强制转一下,有强迫症吧
oott123
2016-03-04 11:39:57 +08:00
js 里,字符串和任何玩意儿相加结果都是字符串。
这也常常被用来做字符串转换…
zythum
2016-03-04 11:40:37 +08:00
@realpg 不管怎么说,怎么隐式转化是语言本身定的,有人喜欢这样有人喜欢那样。你用 parseInt 和 toString 写明确了也就没问题了。
@shiji php 把字符串拼接的操作符区分开了么, php 设计的时候就是为了拼模版。估计是故意去规避这个问题。
zythum
2016-03-04 11:45:28 +08:00
@lxy 字符串和任何相加结果都是字符串。会去调那个东西的 toString 或者 valueOf 。具体流程忘记了。还是翻 ECMA 规范吧。
yeyeye
2016-03-04 11:46:14 +08:00
最近写了个 PHP 程序……写了几个小时然后直接 debug ,纳尼!直接输出了 Done (我写在尾部的 echo ),没错?不可能啊!怎么可能无错!后来才发现是 php.ini 关闭了……

语法上没有错……但是但是……连接字符串我用的是+,于是输出了一堆奇奇怪怪的字符串(+运算符导致字符串拼接时顺序错乱了),没搞懂原因的时候整个脑袋都错乱了。
jugelizi
2016-03-04 11:58:32 +08:00
不同浏览器还产生不同结果
有次看到阿里的笔试题
在 IE 和 chrome 的结果不一样 标准答案是错的
所以写 JS 一定要规范
ttma1046
2016-03-04 12:05:53 +08:00
string 加任何玩儿,都是把任何玩儿先变成 string, 再做 concat.
百撕不得骑姐楼主怎么略懂 JS 的 ?
realpg
2016-03-04 12:14:23 +08:00
@ttma1046 完全没学过啊,就是猜猜怎么写呗
最基础的,没吃过猪肉还没看过猪跑啊
bramblex
2016-03-04 12:17:37 +08:00
猜测楼主其他语言也写不好……

假设楼主是写强类型语言的,不应该犯这种字符串和数字相加的错误。
假设楼主是写弱类型语言的,哪个弱类型语没告诉你不要用隐式类型转换的?
aivier
2016-03-04 12:34:23 +08:00
每次写 C#转换数据类型都觉得很烦人....
xuboying
2016-03-04 12:38:47 +08:00
楼主可以来写 perl

$x="1" ;
$y = $x + 0; ### $y = 1
字符串拼接是用小数点 "."

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/261051

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX