文档章节

JavaScript中的一些特殊用法(二)

我是偶哦
 我是偶哦
发布于 2016/06/07 08:06
字数 1347
阅读 75
收藏 1

1. 非数值类型转数值

使用Number()转换时:

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

使用parseInt()转换时:

  • parseInt会忽略前导空格,直到第一个非空字符开始解析,如果为非数字或正负号,则返回NaN。如果为数字则一直解析到第一个非数字为止。注:在parseInt中小数点不是有效的数字字符
  • parseInt能识别十进制,八进制和十六进制,但是在解析八进制时,ECMAScript 3 和ECMAScript 5存在分歧,ECMAScript 3会将070转化为56,但是ECMAScript 5会转换为70。
  • 使用parseInt的第二个参数
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
博文 32
码字总数 21607
作品 0
深圳
私信 提问
一行能装逼的JavaScript代码的延伸

前段就是坑,入坑水真深。 先看看一个黑科技, 纳尼,这是什么东西。 贴入浏览器执行一看,你个XX,你给老子等着。。。。。。。 然并卵。 作为一般的青年就此笑过, 可是我不是一般的青年,我...

淡色的云
2018/05/30
0
0
JavaScript基础(二)变量和数据类型

javascript变量和数据类型 一、javascript命名规范 1. 严格区分大小写 2. 变量的命名必须以字母或 或 $开头,余下的部分可以是任意的字母,数字,或者是 或者是$ 3.不能用关键字或者是保留字...

曾杨
2013/12/25
117
0
New操作内部步骤、call/apply/bind区别、alert种类、逗号语句

一、new操作符具体干了什么? 二、call 、apply和bind的区别 (一)、相似之处: 1、都是用来改变函数的this对象的指向的。 2、第一个参数都是this要指向的对象。 3、都可以利用后续参数传参。...

王双肖
04/24
6
0
undefined与null的区别

大多数计算机语言,有且仅有一个表示"无"的值,比如,C语言的NULL,Java语言的null,Python语言的none,Ruby语言的nil。 有点奇怪的是,JavaScript语言居然有两个表示"无"的值:undefined和n...

ihaolin
2014/03/30
78
0
JavaScript基础专题之类型检测(十一)

基本类型 我们都知道 JavaScript 语言的每一个值都属于某一种数据类型。 JavaScript 的数据类型,共有分为七种: 数值(number):整数和小数(比如1和3.14) 字符串(string):文本(比如H...

Chris_Ping
07/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部