关于js中字符串格式的数字的几个测试

前几天写js,跟踪调试时,发现误传了参数类型【原本需要的是number类型的,结果传递的实参却是string类型的】。结果居然没有产生异常,仍然顺利地执行了。

于是,今天特地做了几个测试。

(1)字符串类型数字的自加

/*
         *测试字符串类型数字的自加操作
         */
        function testStringSelfAdd() {
            var i = "0";
            for (var j = 0; j < 100; j++) {
                i++;
            }
            alert("i=" + i + "   " + "i的类型:" + (typeof i));
        }

测试结果:


此处可以看到,对字符串格式的数字进行自加操作时,变量类型会转变为number类型。运算上也具有了和number类型变量同样的行为。

接着再来看一下,是否字符"a"在做自加运算时,会被当做97(其ASCII值)?

/*
         *测试字符串类型数字的自加操作
         */
        function testStringSelfAdd() {
            //var i = "0";
            var i="a";
            for (var j = 0; j < 100; j++) {
                i++;
            }
            alert("i=" + i + "   " + "i的类型:" + (typeof i));
        }

测试结果:


可以看到,在做自加时,变量仍然会被转型。但是,此处并非我们预期的,转化为ASCII值,而是变成了NaN。说明,非数值形式的字符串不可用来进行这种运算。

事实上,也只是++运算符上产生了字符格式的数值可以被转型为number参与运算,而这里的i++并不等同于高级强类型语言中的i=i+1; 因为这里i原本就是字符串类型,所以这里的+会被重载为连接字符串。

测试:

 /*
         *测试字符串类型数字的自加操作
         */
        function testStringSelfAdd() {
            var i = "0";
            //var i="a";
            for (var j = 0; j < 100; j++) {
                //i++;
                i = i + 1;
            }
            alert("i=" + i + "   " + "i的类型:" + (typeof i));
        }

测试结果:



(2)测试字符串类型的数值和number类型的数值的比较操作:

/*
         *测试字符串的比较
         */
        function testStringCompare() {
            var i = 4;
            alert(i < "5");     //返回true
            alert("4" == 4);    //返回true
            alert("a" == 4);    //返回false
            alert("a" != 4);    //返回true
            alert("a" < 4);     //返回false
            alert("a" > 4);     //返回false
        }

可见,字符串格式的数值在和number类型的数值进行比较时和两个number类型的数值比较无异。

因此,希望大家,下次在用的时候还是不要依赖js运算符的这些“机制”。还是,要正确地检查类型,才能构建出更安全的代码。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值