每日十条JavaScript经验技巧(二)


Posted in Javascript onJune 23, 2016

1. 非数值类型转数值

使用Number()转换时:

  1. undefined会转为NaN
  2. 如果字符串以0开始,浏览器会忽略前导0,不会按照八进制进行转换
  3. 如果字符串以0x开始,浏览器会按照十六进制转化为十进制返回
  4. 如果字符串有字符,除(+,-,.)外都会转为NaN,十六进制时,字符串包含任何非数字字符都返回NaN
  5. 如果是对象转换,则对象先使用valueof(),然后按照规则转换。如果无valueOf方法,则调用toString方法,再转换。

使用parseInt()转换时:

  1. parseInt会忽略前导空格,直到第一个非空字符开始解析,如果为非数字或正负号,则返回NaN。如果为数字则一直解析到第一个非数字为止。注:在parseInt中小数点不是有效的数字字符
  2. parseInt能识别十进制,八进制和十六进制,但是在解析八进制时,ECMAScript 3 和ECMAScript 5存在分歧,ECMAScript 3会将070转化为56,但是ECMAScript 5会转换为70。
  3. 使用parseInt的第二个参数
  4. var num1 = parseInt("10",2);    //2 按二进制解析
    var num2 = parseInt("10",8);    //8 按八进制解析
    var num3 = parseInt("10",10);   //10 按十进制解析
    var num4 = parseInt("10",16);   //16 按十六进制解析

使用parseFloat()转换时:

parseFloat和parseInt的第一个区别在于它在解析字符串是是遇到一个无效的浮点数值字符为止,比parseInt多了.
解析十六进制数值时返回0

var num = parseFloat("0xA");  //0
var num = parseInt("0xA");   //10

parseFloat函数没有第二个可以指定基数的参数,所以只解析十进制值。
如果字符串是个整数,则返回整数而不是浮点数
var num = parseFloat("2.125e7");  //31250000

2. 使用toString()输出不同进制的数值

此条适用于整数,我们可以用toString()返回任意进制的整数。

var num = 10;
alert(num.toString());  //"10"
alert(num.toString(9));  //"11"
alert(num.toString(16));  //"a"

3. 位操作符时注意NaN和Infinity

在对NaN和Infinity使用位操作符时,这两个数值都会被当成0来处理。 如果对于非数值应用位操作符,会先使用Number()函数将该值转换为一个数值。

还有一点要注意的就是负数的无符号右移,无符号右移是以0来填充空位,而不像有符号右移以符号位填充空位,所以对正数的无符号右移和有符号右移结果相同,但对负数就不同了。无符号右移操作会把负数的二进制码当成正数的二进制码,而且负数是以补码形式表示,因此会导致无符号右移后的结果相差非常大。

var oldValue = -64;            
var newValue = oldValue >>> 5

4. 特殊的数值运算

对于数值运算,如果有一个操作数为NaN,则结果为NaN。
对非数值应用使用一元加操作或减操作(+,-,正负号),如果该值无法转换为数值(使用Number()方式转换),则返回NaN。

var s1 = "01", s2 = "1.1", s3 = "z", b = false,
o = {
valueOf: function(){
 return -1;
}
};
s1 = +s1;  //1   +改为-:  -1
s2 = +s2;  //1.1       -1.1
s3 = +s3;  //NaN       NaN
b = +b;   //0        0
o = -o;  //-1        1

Infinity和0相乘等于NaN,和非0数相乘为Infinity和-Infinity,取决于乘数的正负号。Infinity和Infinity相乘等于Infinity。

var num1 =Infinity, num2 = 0, num3 = -2 ,num4 = -Infinity;
alert(num1 * num2);   //NaN
alert(num1 * num3);   //-Infinity
alert(num1 * num4);   //-Infinity

零除零为NaN,非零数除以零为Infinity或-Infinity。Infinity除以Infinity为NaN
对于取模运算,下面等式成立:

Infinity%2=NaN;
2%-Infinity=2;
0%Infinity=0;    //只要被除数为0,除数不为NaN,结果都为0
Infinity%0=NaN;   //被除数可以为任意数,除数只要为0,结果都为NaN
Infinity%Infinity=NaN

加法运算:如果两个操作数都是字符串则+变为字符串连接。如果一个为字符串,一个为数值,将数值转换为字符串,然后连接字符串,如果一个操作数是对象,布尔值则先调用它们的valueOf方法,如无,在调用toString方法。再根据返回值类型,判断+号应该连接字符串还是相加。

Infinity + -Infinity = NaN;

var p = {
  valueOf: function () {
    return -1;
  }
};
var num =1;
var result = num +p;
alert(result);          // 0 相加

var p = {
  valueOf: function () {
    return "not a num";
  }
};
var num =1;
var result = num +p;
alert(result);        //1not a num 字符串连接

减法运算:减法运算和加法运算十分相似,关于对象的处理也是一样,所以不再说明。

Infinity - Infinity = NaN;
-Infinity - -Infinity = NaN;

5. 关系操作符的使用

关系操作符就是小于(<)、大于(>)、小于等于(<=)和大于等于(>=)

只要有一个数值,就会执行数值比较,另一个不为数值,则转为数值。对象先用valueOf,后用toString。其实对象无论执行什么运算都是这样,有valueOf,则用valueOf返回值,否则使用toString返回值。
两个都为字符串,则比较字符串的字符编码值(ASCII值)
关于第一个还要注意,在一个时候字符串一个是数值时,字符串无法转数值时,即为NaN会出现如下情况

var result = "a" < 3;  //false a转换为NaN
var result = "a" >= 3;  //false 任何数和NaN进行相比都为false

6. ==和===

在JavaScript中,如果等式两边类型不同,或者仅包含一个对象,那么比较会分为两种情况,转型后比较和不转型直接比较。 ==是先转换在比较,===是不转换直接比较。 对于来说===,只要类型不相等就返回false。 而对于==来说,分为如下几种情况:

true会转换为1,false会转换为0。
字符串和数值比较,字符串会转换为数值。
如果等式两边只有一个对象,这个对象会调用valueOf得到基本类型,如无valueOf方法调用toString方法。如果两边都是对象则不转型。

var p = {
  "name":"a"
};
var q = {
  "name":"a"
}
var o =p;
alert(q==p);  //false  p和q指向的对象的地址不同,虽然对象的内容是相同的
alert(o==p);  //true

下面是特殊的比较情况

null == undefined  //true
NaN != NaN     //true
NaN == NaN     //false
"NaN" == NaN    //false
undefined == 0   //false
null == 0      //false

7. for-in语句

for-in语句输出顺序不可预测,次序可能因为浏览器不同而有所差异。
要迭代的变量未null或undefined时,ECMAScript 5下不再抛出错误而是不执行循环体。如果想向前兼容,则在循环前判断不为null或undefined。

8. swithc语句

switch可以使用任何数据类型。
case的值可以是常量,变量和表达式。
switch语句在比较值时使用的是全等比较操作符(===)。

var num = 25;
switch (true) {
 case num<0:
  alert("less 0");
  break;
 case num>=0:
  alert("more than 0");
  break;
 default:
  alert("error");

}

9 函数的使用

函数内没有return语句或return不带任何返回值,则函数都会返回undefined。
函数的定义时和函数的调用时参数不比保持一致。换句话说两种参数(形参和实参)并没有任何联系。函数定义时提供的变量只是使用时较为方便,就算不定义也可以获得传递给函数的参数(通过arguments[])。

function howManyArgs(){
 alert(arguments.length);
}
howManyArgs("a");     // 1
howManyArgs("a","b");   // 2
howManyArgs();      // 0

形参和arguments[]之间的关系如下,注意严格模式和非严格模式区别。

function howManyArgs(ss){
 arguments[0]="test";
 arguments[1]="test2"
 alert(arguments[0]);  //test
 alert(arguments[1]);  //test2
 alert(ss);       //test
}
howManyArgs("a");
function howManyArgs(ss){
"use strict"
arguments[0]="test";
arguments[1]="test2"
alert(arguments[0]);   //test
alert(arguments[1]);   //test2
alert(ss);        //a
}
howManyArgs("a");

10. 函数参数的使用

在定义函数时,我们会把用到的参数写到函数的括号内,但是在有多个可选参数的情况下就会不够灵活,这个时候可以使用对象封装多个可选参数。

function displayInfo(args){
  var output = "";
  if (typeof args.name == "string"){
   output += "Name: " + args.name + "\n";
  }
  if(typeof args.age == "number"){
   output += "Age: "args.age + "\n";
  }
  alert(output);
 }
 displayInfo({
  name: "Nicholas",
  age: 29
 });
 displayInfo({
  name: "Greg"
 });
Javascript 相关文章推荐
当json键为数字时的取值方法解析
Nov 15 Javascript
JS delegate与live浅析
Dec 21 Javascript
JS小游戏之仙剑翻牌源码详解
Sep 25 Javascript
对于jQuery性能的一些优化建议
Aug 13 Javascript
require.js+vue开发微信上传图片组件
Oct 27 Javascript
基于JS实现仿百度百家主页的轮播图效果
Mar 06 Javascript
JS实现带动画的回到顶部效果
Dec 28 Javascript
JavaScript插入排序算法原理与实现方法示例
Aug 06 Javascript
详解Vue源码中一些util函数
Apr 24 Javascript
微信小程序 如何保持登录状态
Aug 16 Javascript
vue element ui validate 主动触发错误提示操作
Sep 21 Javascript
javascript的setTimeout()使用方法总结
Nov 20 Javascript
jQuery实现查找最近父节点的方法
Jun 23 #Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
Jun 23 #Javascript
每日十条JavaScript经验技巧(一)
Jun 23 #Javascript
Ext JS动态加载JavaScript创建窗体的方法
Jun 23 #Javascript
jQuery UI结合Ajax创建可定制的Web界面
Jun 22 #Javascript
JavaScript基于原型链的继承
Jun 22 #Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
Jun 22 #Javascript
You might like
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
jQuery实现ToolTip元素定位显示功能示例
2016/11/23 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
微信小程序之数据绑定原理解析
2019/08/14 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
2019/09/16 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
python多线程抓取天涯帖子内容示例
2014/04/03 Python
从零学Python之入门(二)基本数据类型
2014/05/25 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
Django 静态文件配置过程详解
2019/07/23 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
怎样写好自荐信和推荐信
2013/12/26 职场文书
岗位廉洁从政承诺书
2014/03/27 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
企业负责人任命书
2014/06/05 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
高中政治教师教学反思
2016/02/23 职场文书