高程三(2):变量、数据类型、检测、类型转换、操作符

基本概念
一、变量:Js中的变量是松散类型,即可以用var来保存任何类型。
1)变量未定义时,默认会赋值 undefined,如var message;
2)变量在if、for循环中时,定义的变量是父级作用域内的变量,如 if(xxx){ var msg = 2; }
3)变量的命名,不要使用js的关键字作为变量名,如 class、function、eval等。
4)如果定义变量时不加var,会变成全局变量,如 function fn(){ a = 2; }
非常不建议这种做法,原因:
a、会造成全局变量的混乱,极难维护。
b、开发时,容易出现变量冲突,导致很诡异的问题。
c、严格模式下会报错。
变量使用规范:
由于var可以定义所有类型,所以在开发过程中,建议使用类型前缀标识符来定义变量名,如:
string类型:var sName = '';
array类型:var aStu = [];
object:var oData = {};
Date:var dNow = new Date();
Function:var fnSucc = function(){ };
Boolean: var bOpen = false;
Number:var nCount = 10;
 
二、数据类型
ECMAScript中的6种基本类型:
5种简单数据类型:Undefined、String、Null、Boolean、Number
1种复杂数据类型:Object
 
1、typeof操作符 检测数据基本类型,返回 字符串
var msg; typeof msg ->返回 "undefined"
var msg = "123"; typeof msg ->返回 "string"
var msg = 10; typeof msg ->返回 "number"
var msg = false; typeof msg ->返回 "boolean"
var fnShow = function(){}; typeof -> "function"
typeof Date; typeof RegExp; 返回 function
复杂数据类型:
var oData = {}; typeof oData -> "object"
var aStu = [ ]; typeof oStu -> "object"
typeof Math; 返回 "object"
容易混淆地方:
var nMsg = null; typeof nMsg -> "object" 注意:null类型的typeof 也是 object
console.log(null == undefined); //true
 
2、boolean,可以在任何类型找到对应的 false、true
Boolean true false
String 非空 空字符串
Number 非0 0、NaN
Object 任何对象 null
Undefined undefined
注意点:
1)判断是否为false、true
if(abc){ xxx; } else{ xxx; }
2)var oData = {};
if(oData){ xxx; } //不要这么判断,oData即使没值,还是true
可以这样定义和判断:
var oData = null;
if(oData != null){ xxx; }
3、Number类型
十进制:var nCount = 15;
八进制:var nCount = 080; //严格模式下,八进制会报错
十六进制:var nCount = 0x9A;
在进行运算时,八进制、十六进制都会转化成十进制运算。
关于Number转化:
Number([1,2]) -> NaN
Number({a:1}) -> NaN
Number({}) -> NaN
Number(function(){}) - > NaN
Number(undefined) -> NaN
特殊需记忆的地方:
Number([]) -> 0
Number("") -> 0
Number(null) - > 0
undefined == null //true
 
关于==比较
1、一方是boolean,都转化成Number进行比较
2、一方是Number,对方不是Object,都转化成Number进行比较
3、一方是对象,就别比了
var obj = {};
if(obj){
xxxx;
}
 
浮点数的计算问题:浮点数最高精度是17位,但浮点数计算精确度非常差
0.1 + 0.2 != 0.3,而是0.30000000000000004。
0.1 * 0.2 != 0.02,而是0.020000000000000004。
原因:js基于IEEE754标准,计算精确度差是该标准下数值的浮点计算通病,不仅仅是ECMAScript。
注意:js计算浮点数时,一定要做四舍五入处理结果,(0.1 + 0.2).toFixed(2);
注意:Math.round()也是四舍五入,但是最后的结果整数
NaN:Not A Number,特点:
1)任何涉及NaN的操作(除了NaN != NaN -> true),都返回NaN,如:10/NaN,NaN/0 返回 NaN
2)NaN与任何值都不想等,包括NaN,如:alert( NaN == NaN ); //false
isNaN(参数); 判断参数是否不是数字,不是,返回true,有个Number的隐式转换在里面。
 
数字转换:Number()、parseInt()、parseFloat()
Number(参数):用于转换任何类型,会有隐式转换
1)参数可以是任何类型
如:Number([]); Number(123); Number("abc"); Number(null); Number(true);
2)Number返回值只有两种:数字、NaN
3)能隐式转换成数字的,就返回数字;其余都返回NaN。
如:Number(undefined)、Number("abc")
4)基于上面两点,只有null是个例外,Number(null) 返回 0
parseInt(参数):转换字符串为数字时
1)parseInt返回值只有两种:数字、NaN
2)参数的第一个字符如果不是数字,则返回NaN。
如 parseInt("abc123") 返回 NaN
3)参数的第一个字符如果是数字,解析到不是数字的字符为止。
如 parseInt("12abc") = 12、parseInt("34") = 34、parseInt(12.44) = 12
使用地方:
1)相加时,"123" + 456 = "123456"; parseInt("123") + 456 = 579;
2)去掉小数时,parseInt("12.55") = 12;
注意事项:ES3中 parseInt("070") = 56; ES5中 parseInt("070") = 70;为了解除疑惑,要指定第二个参数
如:parseInt("070", 8) = 56;parseInt("AF") = NaN -》parseInt("AF", 16) = 175;
parseFloat(参数):转换字符串为数字时
跟parseInt非常类似,不同之处在于:
1)遇到第一个小数点时也可以继续解析
2)第二个参数无效,parseFloat("AF", 16) 返回 NaN
 
4、字符串类型
1)字符字面量
\r\n 表示换行
\t tab制表符
\' 显示单引号,如 console.log(' hello \'world\' '); // hello 'world'
\" 显示双引号,如 console.log(" hello \"world\" "); // hello "world"
\\ 显示反斜杠,如 console.log(" 你\\好"); //你\好
\xnn 以十六进制nn表示一个字符,如: \x41 表示 A
\unnnn 以十六进制nnnn表示的一个unicode的一个字符,
如 console.log("\u5218\u5b66\u6587"); //刘学文
console.log("\u5218\u5b66\u6587".length); //3
2)转换字符串,toString()
String() 和 toString()不同点:
1)null、undefined是没有toString() 方法的,会报错,而String()会返回 null、undefined
使用:如果有转化时,建议使用 String()来处理
 
5、Object类型
1)在ES中,Object类型是所有实例对象的基础,即Object类型所具有的任何属性和方法,同样存在于具体的实例对象中,
Constructor:指向创建当前对象的函数
hasOwnProperty(属性名):检测给定的属性在当前实例中是否存在
isPrototypeOf(object):传入的对象是否是另一个对象的原型
toLocaleString()
toString()
valueOf()
 
二、操作符
1、一元操作符
1)递增、递减:
++a; a++;
--a; a--;
2)一元+、一元-
+a, -a
用法:"123" + 456 = "123456"; --> +"123" + 456 = 579;
("123" - 0) + 456 = 579;
"123" * 1 + 456 = 579;
parseInt("123") + 456 = 579;
 
3)布尔操作符
用法:取反 如 !isRight、转型!!right
&&
||
用法:option.succFn && option.succFn();
option.name = name || "default";
注意,容易错误点:
function fnCb(isRight){ isRight = isRight == undefined? false : isRight || true; alert(isRight); } fnCb(); fnCb(true);
 
4)乘法操作符
a*b,如果是非数字,会通过Number()转化后再相乘来处理
用法:转化成数字时 "123" + 456 = "123456"; --> "123"*1 + 456 = 579;
 
5)求模 %,就是 取余数
用法:
switch(type){
case xx
case xx
}
1%10
 
posted @ 2016-09-02 13:06  搜易贷  阅读(187)  评论(0编辑  收藏  举报