都说javascript是弱对象,能够自动转换,可是在这个时候。。。。

kog-7 发布于 2014/04/05 11:30
阅读 444
收藏 2

今天用递归来进行如下的div元素里的值,使结果根据bb的值从大到小排并且aa的内容也一起变化。发现直接用m=document.getElementById('d1').textContent来对比的时候,在1-9之间可以排序,超过9就排序不了。发现m都是string,可是为什么string了可以在1-9排呢~!~,当我把他们都用new Number来硬转换的时候就没有问题了,大家有没有更高效的方法呢。

<span id="a1" class="aa">a1</span>-----<span id="b1" class="bb">8</span><br>
<span id="a2" class="aa">a2</span>-----<span id="b2" class="bb">9</span><br><span id="a2" class="aa">a2</span>-----<span id="b2" class="bb">12</span><br>

都说javascript是弱对象,能够自动转换,前面看过一本翻译的国外的书,说是少用new Number(),js会自动识别你的类似,并且在使用的时候会自动的临时把m=5这种值变量包装成number对象,然后用完后number包装消失,,可是在m=document.getElementById('d').textContent他就是没有识别为数字值,也不能计算。

加载中
0
南湖船老大
南湖船老大

弱类型是真,但没有人说过能够自动转换,不过是你自己的误解而已。

kog-7
kog-7
回复 @aiasfina : 刚试了试用,能否告诉为什么+就是可以解析字符串呢,他的原理是什么啊。你提到了纯数字字符串不要用parseint,那么有哪种不是纯数字字符串可以用parseint的呢,能否告诉下。谢谢
kog-7
kog-7
回复 @aiasfina : 你好,是可以如下那么用吗,如m=+(document.getElementById("ab").textContent)或者m=~~(document.getElementById("ab").textContent)。这种比parseint快十倍啊?
aiasfina
aiasfina
回复 @kog-7 : 纯数字字符串不要用 parseInt,用 +'1' 或者 ~~'1',parseInt 会试图解析字符串,大概慢10倍左右
kog-7
kog-7
回复 @南湖船老大 : 也是,你这个比new Number好
南湖船老大
南湖船老大
回复 @kog-7 : parseInt也可以啊
下一页
0
kog-7
kog-7

引用来自“南湖船老大”的评论

弱类型是真,但没有人说过能够自动转换,不过是你自己的误解而已。

~!~

0
纠结名字

弱类型又不是没有类型概念。所谓自动转换,也不是不分场合的转换,它只在必要的时候才会转换。你要比较大小,字符串也能比,所以没有自动转换,可以直接在字符串前面放个+号,就能转换成数值型了,比如 +'123'。

kog-7
kog-7
确实可以这样,效率更高
0
赵亮-碧海情天
赵亮-碧海情天

可是为什么string了可以在1-9排呢~!~,


楼主没学过“编程”之前的“编程人员应该懂的电脑基础”吗?

你这样越级乱跳跃地学,是很不容易学好的,至少效率上是大打折扣。

kog-7
kog-7
以后要看的,你不说我还不知道有这个,,应该是书
0
aiasfina
aiasfina


+ 这个一元运算符会试图返回一个字符串,这是一个强制转换的过程,遵从 JavaScript 隐式转换,而对于字符串,他会试图给出一个正确的数字:

+1    // 1
+'1'  // 1
+true // 1
+null // 0

但是 + 不会检测字符串是否合法,所以不能用在非纯数字字符串:

+'1a' // NAN

MDN 有相关文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#.2b_(Unary_Plus%29

所以,对于非纯数字字符串,可以使用 parseInt 进行转换。parseInt 转换过程涉及字符串扫描和进制转换,如果是纯数字字符串则返回,否则将取出串中开头合法数字:

parseInt('1') // 1
parseInt('1a') // 1
parseInt('a1') // NAN



这个函数在dom编程中比较常见,常用于将像素值转换为数字:
parseInt('100px') // 100
另外,当你一定要使用 parseInt,请指定进制,这样会省去进制检测,大概会快20~30%左右
parseInt('100px', 10);


以上。

看在这么多字的份上(纯手打),给个最佳吧




0
aiasfina
aiasfina

这里是各种转换方法的效能测试,其中 +'1' 和 ~~'1' 在我的电脑上分别是 344,981,136 ops/sec 和 346,572,243 ops/sec,而 parseInt 为 44,062,158 ops/sec

http://jsperf.com/performance-of-parseint/6

kog-7
kog-7
我js,php些都是自学的,专业不是计算机,工作也不是。你的这些解析出的344数字些不懂啊,应该属于入门计算机要学的吧,有木有什么书可以推荐下的呢?
0
kog-7
kog-7

引用来自“aiasfina”的评论


+ 这个一元运算符会试图返回一个字符串,这是一个强制转换的过程,遵从 JavaScript 隐式转换,而对于字符串,他会试图给出一个正确的数字:

+1    // 1
+'1'  // 1
+true // 1
+null // 0

但是 + 不会检测字符串是否合法,所以不能用在非纯数字字符串:

+'1a' // NAN

MDN 有相关文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#.2b_(Unary_Plus%29

所以,对于非纯数字字符串,可以使用 parseInt 进行转换。parseInt 转换过程涉及字符串扫描和进制转换,如果是纯数字字符串则返回,否则将取出串中开头合法数字:

parseInt('1') // 1
parseInt('1a') // 1
parseInt('a1') // NAN



这个函数在dom编程中比较常见,常用于将像素值转换为数字:
parseInt('100px') // 100
另外,当你一定要使用 parseInt,请指定进制,这样会省去进制检测,大概会快20~30%左右
parseInt('100px', 10);


以上。

看在这么多字的份上(纯手打),给个最佳吧




我只会引用此评论啊~!~,我非常想给最佳,只是手打一个,“确实是最佳的答案”

如果有方法可以机打最佳,告诉我下,我马上做。

0
aiasfina
aiasfina

改版了我也不会弄 ,那算了

kog-7
kog-7
给你“赞“ 一个~!~ 现在看js貌似很多框架啊,可以不用框架否?
0
aiasfina
aiasfina


的确有很多,但是最具代表性的就俩(我知道的):

MVC: Backbone

MVVP: AngularJS

在选取框架之前,首先你需要考察你的项目是否真的需要,因为框架本身代码量不少,对移动端或者网速不佳的用户不友好。

然后,你无论你的项目是需要 MVC 还是 MVVP,这两个都有一个共同点:不要操作 dom,所以如果你需要使用框架时,请先抛弃之前惯用的dom编程手法,使用面向数据编程。

这里有一个关于这个话题的文章,也是高性能javascript必要的手法:http://www.zhangxinxu.com/wordpress/2011/01/js%E9%9D%A2%E5%90%91%E6%95%B0%E6%8D%AE%E7%BC%96%E7%A8%8Bdop%E4%B8%80%E7%82%B9%E5%88%86%E4%BA%AB/

当以上条件都满足时,就开始考虑 MVC 还是 MVVP。

MVC流行的还有 emberjs,canjs,不过这个话题展开就太大了= =,最好还是自己试试


kog-7
kog-7
回复 @aiasfina : 看到了,就是一群各种各样的朋友来完善和添加你的js,然后某些朋友写。。。。就导致了腐化。 用框架写没有腐化吗?
aiasfina
aiasfina
回复 @kog-7 : http://ender.iteye.com/blog/986910 这些话题慢慢来,先写好手里的代码才是最重要的。
kog-7
kog-7
回复 @aiasfina : 什么叫代码腐化啊?
aiasfina
aiasfina
回复 @kog-7 : ruby 语言,做的是 ruby on rails。原生js肯定是最快的,但是却最容易写慢。框架说白了就是一些大牛写的最佳实践的半成品,你照着他的路子写下自己的逻辑而已。不会最快,也不会最慢,更重要的是防止代码腐化。
kog-7
kog-7
回复 @aiasfina : ruby也是后端吗,不是数据库什么的吗
下一页
0
aiasfina
aiasfina

建议初学的话没必要那么深入,否则难免会打消学习的热情。我就一枚后端码农,JS 是之前工作时现学现用的,建议楼主也使用项目驱动来学习编程,做一些有趣的小玩意,然后看是看书,一点点用看到的技巧改进现有代码。

kog-7
kog-7
我就是在项目驱动,自己做个网页,现在已经有查询,小聊天等基本的功能了,这个问题是在用递归排序的时候发现的,多谢那么多朋友帮助。
返回顶部
顶部